diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index fbd08269..00000000 --- a/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules -release/app/node_modules -release/app/dist -server/node_modules diff --git a/CHANGELOG.md b/CHANGELOG.md index 40238eb9..599399c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,585 +2,4 @@ All notable changes to this project will be documented in this file. -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -[0.15.0] - 2022-04-13 - -### Added - -- Added setting to save and resume the current queue between sessions (#130) (Thanks @kgarner7) -- Added a simple "play random" button to the player bar (#276) -- Added new seek/volume sliders (#272) - - Seeking/dragging is now more responsive -- Added improved discord rich presence (#286) -- Added download button on the playlist view (#266) -- (Jellyfin) Added "genre" column to the artist list - -### Changed - -- Swapped the order of "Seek Forward/Backward" and "Next/Prev Track" buttons on the player bar -- Global volume is now calculated logarithmically (#275) (Thanks @gelaechter) -- "Auto playlist" is now named "Play Random" (#276) -- "Now playing" option is now available on the "Start page" setting - -### Fixed - -- Playing songs by double clicking on a list should now play in the proper order (#279) -- (Linux) Fixed MPRIS metadata not updating when player automatically increments (#263) -- Application fonts now loaded locally instead of from Google CDN (#284) -- Enabling "Default to Album List on Artist Page" no longer performs a double redirect when entering the artist page (#271) -- Stop button is no longer disabled when playback is stopped (#273) -- Various package updates (#288) (Thanks @kgarner7) -- Top control bar show no longer be accessible when not logged in (#267) - -[0.14.0] - 2022-03-12 - -### Added - -- Added zoom options via hotkeys (#252) - - Zoom in: CTRL + SHIFT + = - - Zoom out: CTRL + SHIFT + - -- Added PLAY context menu options to the Genre view (#239) -- Added STOP button to the main player controls (#252) -- Added "System Notifications" option to display native notifications when the song automatically changes (#245) -- Added arm64 build (#238) -- New languages - - Spanish (Thanks @ami-sc) (#250) - - Sinhala (Thanks @hirusha-adi) (#254) - -### Fixed - -- (Jellyfin) Fixed the order of returned songs when playing from the Folder view using the context menu (#240) -- (Linux) Reset MPRIS position to 0 when using "previous track" resets the song 0 (#249) -- Fixed JavaScript error when removing all songs from the queue using the context menu (#248) -- Fixed Ampache server support by adding .view to all Subsonic API endpoints (#253) - -### Removed - -- (Windows) Removed the cover art display when hovering Sonixd on the taskbar (due to new sidebar position) (#242) - -[0.13.1] - 2022-02-16 - -### Fixed - -- Fixed startup crash on all OS if the default settings file is not present (#237) - -[0.13.0] - 2022-02-16 - -### Added - -- Added new searchbar and search UI (#227, #228) -- Added playback controls to the Sonixd tray menu (#225) -- Added playlist selections to the `Start Page` config option - -### Changed - -- Sidebar changes (#206) - - - Allow resizing of the sidebar when expanded - - Allow a toggle of the playerbar's cover art to the sidebar when expanded - - Display playlist list on the sidebar under the navigation - - Allow configuration of the display of sidebar elements - -- Changed the `Artist` row on the playerbar to use a comma delimited list of the song's artists rather than the album artist (#218) - -### Fixed - -- Fixed the player volume not resetting to its default value when resetting a song while crossfading (#228) -- (Jellyfin) Fixed artist list not displaying user favorites -- (Jellyfin) Fixed `bitrate` column not properly by its numeric value (#220) -- Fixed javascript exception when incrementing/decrementing the queue (#230) -- Fixed popups/tooltips not using the configured font - -[0.12.1] - 2022-02-02 - -### Fixed - -- Fixed translation syntax error causing application to crash when deleting playlists from the context menu (#216) -- Fixed Player behavior (#217) - - No longer scrobbles an additional time after the last song ends when repeat is off - - (Jellyfin) Properly handles scrobbling the player's pause/resume and time position - -[0.12.0] - 2022-01-31 - -### Added - -- Added support for language/translations (#146) (Thanks @gelaechter) - - German translation added (Thanks @gelaechter) - - Simplified Chinese translation added (Thanks @fangxx3863) -- (Windows) Added media keys with desktop overlay (#79) (Thanks @GermanDarknes) -- (Subsonic) Added support for `/getLyrics` to display the current song's lyrics in a popup (#151) -- (Jellyfin) Added song list page -- Added config to choose the default Album/Song list sort on startup (#169) -- Added config to choose the application start page (#176) (Thanks @GermanDarknes) -- Added config for pagination for Album/Song list pages -- (Windows) Added option to set custom directory on installation (#184) -- Added config to set the default artist page to the album list (#199) -- Added info mode for the Now Playing page (#160) -- Added release notes popup - -### Changed - -- Player behavior - - `Media Stop` now stops the track and resets it instead of clearing the queue (#200) - - `Media Prev` now resets to the start of the song if pressed after 5 seconds (#207) - - `Media Prev` now resets to the start of the song if repeat is off and is the first song of the queue (#207) - - `Media Next` now does nothing if repeat is off and is the last song of the queue (#207) - - Playing a single track in the queue without repeat no longer plays the track twice (#205) - - Scrobbling - - (Jellyfin) Scrobbling has been reverted to use the `/sessions/playing` endpoint to support the Playback Reporting plugin (#187) - - Scrobbling occurs after 5 seconds has elapsed for the current track as to not instantly mark the song as played -- Pressing `CTRL + F` or the search button now focuses the text in the searchbar (#203) (Thanks @WeekendWarrior1) -- Changed loading indicators for all pages -- OBS scrobble now outputs an image.txt file instead of the downloading the cover image (#136) -- Player Bar - - Album name now appears under the artist - - (Subsonic) 5-star rating is available - - Clicking on the cover art now displays a full-size image - - Clicking on the song name now redirects to the Now Playing queue -- (Jellyfin) Removed track limit for "Auto Playlist" - -### Fixed - -- (macOS) Fixed macOS exit behavior (#198) (Thanks @zackslash) -- (Linux) Fixed MPRIS `position` result (#162) -- (Subsonic) Fixed artist page crashing the application if server does not support `/getArtistInfo2` (#170) -- (Jellyfin) Fixed `View all songs` returning songs out of their album track order -- (Jellyfin) Fixed the "Latest Albums" on the album artist page displaying no albums -- Fixed card overlay button color on click -- Fixed buttons on the Album page to work better with light mode -- Fixed unfavorite button on Album page - -[0.11.0] - 2022-01-01 - -### Added - -- Added external integrations - - Added Discord rich presence to display the currently playing song (#155) - - Added OBS (Open Broadcaster Software) scrobbling to send current track metadata to desktop or the Tuna plugin (#136) -- Added a `Native` option for Titlebar Style (#148) (Thanks @gelaechter) -- (Jellyfin) Added toggle to allow transcoding for non-directplay compatible filetypes (#158) -- Additional MPRIS support - - Added metadata: - - `albumArtist`, `discNumber`, `trackNumber`, `useCount`, `genre` - - Added events: - - `seek`, `position`, `volume`, `repeat`, `shuffle` - -### Changed - -- Overhauled the Artist page - - (Jellyfin) Split albums by album artist OR compilation - - (Jellyfin) Added artist genres - - (Subsonic) Added Top Songs section - - Moved related artists to the main page scrolling menu - - Added `View All Songs` button to view all songs by the artist - - Added artist radio (mix) button -- Horizontal scrolling menu no longer displays scrollbar -- Changed button styling on Playlist/Album/Artist pages -- Changed page image styling to use the card on Playlist/Album/Artist pages - -### Fixed - -- Fixed various MPRIS features - - Synchronized the play/pause state between the player and MPRIS client when pausing from Sonixd (#152) - - Fixed the identity of Sonixd to use the app name instead of description (#163) -- Fixed various submenus opening in the right-click context menu when the option is disabled (#164) -- Fixed compatibility with older Subsonic API servers (now targets Subsonic v1.13.0) (#144) -- Fixed playback causing heavily increased CPU/Power usage #145) - -[0.10.0] - 2021-12-15 - -### Added - -- Added 2 new default themes - - City Lights - - One Dark -- Added additional album filters (#66) - - Genres (AND/OR) - - Artists (AND/OR) - - Years (FROM/TO) -- Added external column sort filters for multiple pages (#66) -- Added item counter to page titles -- `Play Count` column has been added to albums (only works for Navidrome) - -### Changed - -- Config page has been fully refreshed to a new look - - Config popover on the action bar now includes all config tabs -- Tooltips - - Increased default tooltip delay from 250ms -> 500ms - - Increased tooltip delay on card overlay buttons to 1000ms -- Grid view - - Placeholder images for playlists, albums, and artists have been updated (inspired from Jellyfin Web UI) - - Card title/subtitle width decreased from 100% to default length - - Separate card info section from image/overlay buttons on hover -- Popovers (config, auto playlist, etc) - - Now have decreased opacity -- Enabling/disabling global media keys no longer requires app restart - -### Fixed - -- (Jellyfin) Fixed `Recently Played` and `Most Played` filters on the Dashboard page (#114) -- (Jellyfin) Fixed server scrobble (#126) - - No longer sends the `/playing` request on song start (prevents song being marked as played when it starts) - - Fixed song play count increasing multiple times per play -- (Jellyfin) Fixed tracks without embedded art displaying placeholder (#128) -- (Jellyfin) Fixed song `Path` property not displaying data -- (Subsonic) Fixed login check for Funkwhale servers (#135) -- Fixed persistent grid-view scroll position -- Fixed list-view columns - - `Visibility` column now properly displays data -- Selected media folder is now cleared from settings on disconnect (prevents errors when signing into a new server) -- Fixed adding/removing artist as favorite on the Artist page not updating -- Fixed search bar not properly handling Asian keyboard inputs - -## [0.9.1] - 2021-12-07 - -### Changed - -- List-view scroll position is now persistent for the following: - - Now Playing - - Playlist list - - Favorites (all) - - Album list - - Artist list - - Genre list -- Grid-view scroll position is now persistent for the following: - - Playlist list - - Favorites (album/artist) - - Album list - - Artist list -- (Jellyfin) Changed audio stream URL to force transcoding off (#108) - -### Fixed - -- (Jellyfin) Fixed the player not sending the "finish" condition when the song meets the scrobble condition (unresolved from 0.9.0) (#111) - -## [0.9.0] - 2021-12-06 - -### Added - -- Added 2 new default themes - - Plex-like - - Spotify-like -- Added volume control improvements - - Volume value tooltip while hovering the slider - - Mouse scroll wheel controls volume while hovering the slider - - Clicking the volume icon will mute/unmute - -### Changed - -- Overhauled all default themes - - Rounded buttons, inputs, etc. - - Changed grid card hover effects - - Removed hover scale - - Removed default background on overlay buttons - - Moved border to only the image instead of full card -- Album page - - Genre(s) are now listed on a line separate from the artists - - Album artist is now distinct from track artists - - Increased length of the genre/artist line from 70% -> 80% - - The genre/artist line is now scrollable using the mouse wheel -- (Jellyfin) List view - - `Artist` column now uses the album artist property - - `Title (Combined)` column now displays all track artists, comma-delimited instead of the album artist - - `Genre` column now displays all genres, comma-delimited, left-aligned - -### Fixed - -- (Jellyfin) Fixed the player not sending the "finish" condition when the song meets the scrobble condition -- (Jellyfin) Fixed album lists not sorting by the `genre` column -- (Jellyfin)(API) Fixed the A-Z(Artist) not sorting by Album Artist on the album list -- (Jellyfin)(API) Fixed auto playlist not respecting the selected music folder -- (Jellyfin)(API) Fixed the artist page not respecting the selected music folder - -## [0.8.5] - 2021-11-25 - -### Fixed - -- Fixed default (OOBE) title column not display data (#104) - -## [0.8.4] - 2021-11-25 - -### Fixed - -- (Jellyfin)(Linux) Fixed JS MPRIS error when switching tracks due to unrounded song duration -- (Linux) Fixed MPRIS artist, genre, and coverart not updating on track change - -## [0.8.3] - 2021-11-25 - -### Fixed - -- (Subsonic) Fixed playing a folder from the folder view -- Fixed rating context menu option available from the Genre page - -## [0.8.2] - 2021-11-25 - -### Added - -- Added option to disable auto updates - -### Fixed - -- Fixed gapless playback on certain \*sonic servers (#100) -- Fixed playerbar coverart not redirecting to `Now Playing` page - -## [0.8.1] - 2021-11-24 - -### Fixed - -- (Subsonic) Fixed errors blocking playlists from being deleted - -## [0.8.0] - 2021-11-24 - -### Added - -- Added Jellyfin server support (#87) - - Supports full Sonixd feature-set (except ratings) -- Added a mini config popover to change list/grid view options on the top action bar -- Added system audio device selector (#96) -- Added context menu option `Set rating` to bulk set ratings for songs (and albums/artists on Navidrome) (#95) - -### Changed - -- Reduced cached image from 500px -> 350px (to match max grid size) -- Grid/header images now respect image aspect ratio returned by the server -- Playback filter input now uses a regex validation before allowing you to add -- Renamed all `Name` columns to `Title` -- Search bar now clears after pressing enter to globally search -- Added borders to popovers - -### Fixed - -- Fixed application performance issues when player is crossfading to the next track -- Fixed null entries showing at the beginning of descending sort on playlist/now playing lists -- Tooltips no longer pop up on the artist/playlist description when null - -## [0.7.0] - 2021-11-15 - -### Added - -- Added download buttons on the Album and Artist pages (#29) - - Allows you to download (via browser) or copy download links to your clipboard (to use with a download manager) - -### Changed - -- Changed default tooltip delay from `500ms` -> `250ms` -- Moved search bar from page header to the main layout action bar -- Added notice for macOS media keys to require trusted accessibility in the client - -### Fixed - -- Fixed auto playlist and album fetch in Gonic servers -- Fixed the macOS titlebar styling to better match the original (#83) -- Fixed thumbnailclip error when resizing the application in macOS (#84) -- Fixed playlist page not using cached image - -## [0.6.0] - 2021-11-09 - -### Added - -- Added additional grid-view customization options (#74) - - Gap size (spaces between cards) - - Alignment (left-align, center-align) - -### Changed - -- Changed default album/artist uncached image sizes from `150px` -> `350px` - -### Fixed - -- (Windows) Fixed default taskbar thumbnail on Windows10 when minimized to use window instead of album cover (#73) -- Fixed playback settings unable to change via the UI - - Crossfade duration - - Polling interval - - Volume fade -- Fixed header styling on the Config page breaking at smaller window widths (#72) -- Fixed the position of the description tooltip on the Artist page -- Fixed the `Add to playlist` popover showing underneath the modal in modal-view - -### Removed - -- Removed unused `fonts.size.pageTitle` theme property - -## [0.5.0] - 2021-11-05 - -### Added - -- Added extensible theming (#60) -- Added playback presets (gapless, fade, normal) to the config -- Added persistence for column sort for all list-views (except playlist and search) (#47) -- Added playback filters to the config to filter out songs based on regex (#53) -- Added music folder selector in auto playlist (this may or may not work depending on your server) -- Added improved playlist, artist, and album pages - - Added dynamic images on the Playlist page for servers that don't support playlist images (e.g. Navidrome) -- Added link to open the local `settings.json` file -- Added setting to use legacy authentication (#63) - -### Changed - -- Improved overall application keyboard accessibility -- Playback no longer automatically starts if adding songs to the queue using `Add to queue` -- Prevent accidental page navigation when using [Ctrl/Shift + Click] when multi-selecting rows in list-view -- Standardized buttons between the Now Playing page and the mini player -- "Add random" renamed to "Auto playlist" -- Increased 'info' notification timeout from 1500ms -> 2000ms -- Changed default mini player columns to better fit -- Updated default themes to more modern standards (Default Dark, Default Light) - -### Fixed - -- Fixed title sort on the `Title (Combined)` column on the album list -- Fixed 2nd song in queue being skipped when using the "Play" button multiple pages (album, artist, auto playlist) -- Fixed `Title` column not showing the title on the Folder page (#69) -- Fixed context menu windows showing underneath the mini player -- Fixed `Add to queue (next)` adding songs to the wrong unshuffled index when shuffle is enabled -- Fixed local search on the root Folder page -- Fixed input picker dropdowns following the page on scroll -- Fixed the current playing song not highlighted when using `Add to queue` on an empty play queue -- Fixed artist list not using the `artistImageUrl` returned by Navidrome - -## [0.4.1] - 2021-10-27 - -### Added - -- Added links to the genre column on the list-view -- Added page forward/back buttons to main layout - -### Changed - -- Increase delay when completing mouse drag select in list view from `100ms` -> `200ms` -- Change casing for main application name `sonixd` -> `Sonixd` - -### Fixed - -- Fixed Linux media hotkey support (MPRIS) - - Added commands for additional events `play` and `pause` (used by KDE's media player overlay) - - Set status to `Playing` when initially starting a song - - Set current song metadata when track automatically changes instead of only when it manually changes -- Fixed filtered link to Album List on the Album page -- Fixed filtered link to Album List on the Dashboard page -- Fixed font color for lists/tables in panels - - Affects the search view song list and column selector list - -## [0.4.0] - 2021-10-26 - -### Added - -- Added music folder selector (#52) -- Added media hotkeys / MPRIS support for Linux (#50) - - This is due to dbus overriding the global shortcuts that electron sends -- Added advanced column selector component - - Drag-n-drop list - - Individual resizable columns -- (Windows) Added tray (Thanks @ncarmic4) (#45) - - Settings to minimize/exit to tray - -### Changed - -- Page selections are now persistent - - Active tab on config page - - Active tab on favorites page - - Filter selector on album list page -- Playlists can now be saved after being sorted using column filters -- Folder view - - Now shows all root folders in the list instead of in the input picker - - Now shows music folders in the input picker - - Now uses loader when switching pages -- Changed styling for various views/components - - Look & Feel setting page now split up into multiple panels - - Renamed context menu button `Remove from current` -> `Remove selected` - - Page header titles width increased from `45%` -> `80%` - - Renamed `Scan library` -> `Scan` -- All pages no longer refetch data when clicking back into the application - -### Fixed - -- Fixed shift-click multi select on a column-sorted list-view -- Fixed right-click context menu showing up behind all modals (#55) -- Fixed mini player showing up behind tag picker elements -- Fixed duration showing up as `NaN:NaN` when duration is null or invalid -- Fixed albums showing as a folder in Navidrome instances - -## [0.3.0] - 2021-10-16 - -### Added - -- Added folder browser (#1) - - Added context menu button `View in folder` - - Requires that your server has support for the original `/getIndexes` and `/getMusicDirectory` endpoints -- Added configurable row-hover highlight for list-view -- (Windows) Added playback controls in thumbnail toolbar (#32) -- (Windows/macOS) Added window size/position remembering on application close (#31) - -### Changed - -- Changed styling for various views/components - - Tooltips added on grid-view card hover buttons - - Mini-player removed rounded borders and increased opacity - - Mini-player removed animation on open/close - - Search bar now activated from button -> input on click / CTRL+F - - Page header toolbar buttons styling consistency - - Album list filter moved from right -> left - - Reordered context menu button `Move selected to [...]` - - Decreased horizontal width of expanded sidebar from 193px -> 165px - -### Fixed - -- Fixed duplicate scrobble requests when pause/resuming a song after the scrobble threshold (#30) -- Fixed genre column not applying in the song list-view -- Fixed default titlebar set on first run - -## [0.2.1] - 2021-10-11 - -### Fixed - -- Fixed using play buttons on the artist view not starting playback -- Fixed favoriting on horizontal scroll menu on dashboard/search views -- Fixed typo on default artist list viewtype -- Fixed artist image selection on artist view - -## [0.2.0] - 2021-10-11 - -### Added - -- Added setting to enable scrobbling playing/played tracks to your server (#17) -- Added setting to change between macOS and Windows styled titlebar (#23) -- Added app/build versions and update checker on the config page (#18) -- Added 'view in modal' button on the list-view context menu (#8) -- Added a persistent indicator on grid-view cards for favorited albums/artists (#7) -- Added buttons for 'Add to queue (next)' and 'Add to queue (later)' (#6) -- Added left/right scroll buttons to the horizontal scrolling menu (dashboard/search) -- Added last.fm link to artist page -- Added link to cache location to open in local file explorer -- Added reset to default for cache location -- Added additional tooltips - - Grid-view card title and subtitle buttons - - Cover art on the player bar - - Header titles on album/artist pages - -### Changed - -- Changed starring logic on grid-view card to update local cache instead of refetch -- Changed styling for various views/components - - Use dynamically sized hover buttons on grid-view cards depending on the card size - - Decreased size of buttons on album/playlist/artist pages - - Input picker text color changed from primary theme color to primary text color - - Crossfade type config changed from radio buttons to input picker - - Disconnect button color from red to default - - Tooltip styling updated to better match default theme - - Changed tag links to text links on album page -- Changed page header images to use cache (album/artist) - - Artist image now falls back to last.fm if no local image - -### Fixed - -- Fixed song & image caching (#16) -- Fixed set default artist list view type on first startup - -## [0.1.0] - 2021-10-06 - -### Added - -- Initial release +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index c9d0bde0..00000000 --- a/Dockerfile +++ /dev/null @@ -1,51 +0,0 @@ -# Stage 1 - Build frontend -FROM node:16.5-alpine as ui-builder -WORKDIR /app -COPY . . -RUN npm install -RUN npm run build:renderer -RUN npm prune --production -RUN npm cache clean --force -RUN rm -rf /root/.cache - -# Stage 2 - Build server -FROM node:16.5-alpine as server-builder -WORKDIR /app -COPY server . -RUN npm install && npx prisma generate -RUN npm run build -RUN npm prune --production -RUN npm cache clean --force -RUN rm -rf /root/.cache - - -# Stage 3 - Deploy -FROM node:16.5-alpine -WORKDIR /root -RUN mkdir appdata -RUN mkdir feishin-server -RUN mkdir feishin-client - -RUN npm cache clean --force -RUN npm prune --production - -# Add server build files -COPY --from=server-builder /app/dist ./feishin-server -COPY --from=server-builder /app/node_modules ./feishin-server/node_modules -COPY --from=server-builder /app/prisma ./feishin-server/prisma - -# Add client build files -COPY --from=ui-builder /app/release/app/dist/renderer ./feishin-client - -COPY docker-entrypoint.sh ./feishin-server/docker-entrypoint.sh -RUN chmod +x ./feishin-server/docker-entrypoint.sh - -COPY ./server/wait-for-it.sh ./feishin-server/wait-for-it.sh -RUN chmod +x ./feishin-server/wait-for-it.sh - -RUN npm install pm2 -g - -WORKDIR /root/feishin-server - -EXPOSE 9321 -CMD ["sh", "docker-entrypoint.sh"] diff --git a/README.md b/README.md index 38be493d..aa1f8dd5 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ License - + Release @@ -13,15 +13,6 @@ Downloads - - Docker - - - - Docker pulls -

@@ -38,95 +29,25 @@ Repository for the rewrite of [Sonixd](https://github.com/jeffvli/sonixd). ## Getting Started -The default credentials to login will be `admin/admin`. - Download the [latest desktop client](https://github.com/jeffvli/feishin/releases). -### Docker Compose - -**Warning:** Check the environment variable configuration before running the commands below. - -1. Copy and rename [example.env](https://github.com/jeffvli/feishin/blob/dev/example.env) to `.env` and make any changes necessary -2. Run the compose file: `docker compose --file docker-compose.yml --env-file .env up` - -### Docker - -**Warning:** Check the environment variable configuration before running the commands below. - -**Run a postgres database container:** - -``` -docker run postgres:13 \ - -p 5432:5432 \ - -e POSTGRES_USER=admin \ - -e POSTGRES_PASSWORD=admin \ - -e POSTGRES_DB=feishin -``` - -**Run the Feishin server container:** - -``` -docker run jeffvictorli/feishin:latest \ - -p 8643:9321 \ - -e APP_BASE_URL=http://192.168.0.1:8643 \ - -e DATABASE_PORT=5432 \ - -e DATABASE_URL=postgresql://admin:admin@localhost:5432/feishin?schema=public \ - -e TOKEN_SECRET=secret -``` - -**Docker Environment Variables** - -``` -APP_BASE_URL — The URL the site will be accessible at from your server (needed for CORS) - -DATABASE_PORT — The port of your running postgres container - -DATABASE_URL — The connection string to your postgres instance following this format: postgresql://:@/?schema=public - - Replace the following: - — The admin username of your postgres container (POSTGRES_USER) - — The admin password of your postgres container (POSTGRES_PASSWORD) - — The name of the database created in your postgres container (POSTGRES_DB) - — The URL the postgres container is reachable from - - Example: postgresql://admin:password@192.168.0.1:5432/feishin?schema=public - -TOKEN_SECRET — The string used to sign auth tokens - -(optional) TOKEN_EXPIRATION — The time before the auth JWT expires - -(optional) TOKEN_REFRESH_EXPIRATION - The time before the auth JWT refresh token expires -``` - ### After installing the server and database You can access the desktop client via the [latest release](https://github.com/jeffvli/feishin/releases), or you can visit the web client at your server URL (e.g http://192.168.0.1:8643). ## FAQ -### Why is there a red lock next to the server I want to select? - -If the server is specified to "require user credentials", you will need to add and enable your own credentials to access it. Since the songs and images aren't proxied by the Feishin backend, the server credentials would otherwise be leaked to any user that has access to it. The added credentials are stored locally in the browser and are then used to generate the audio and image URLs in the client. - ### What music servers does Feishin support? -Feishin supports any music server that implements a [Subsonic](http://www.subsonic.org/pages/api.jsp), [Navidrome](https://www.navidrome.org/), or [Jellyfin](https://jellyfin.org/) API. +Feishin supports any music server that implements a [Navidrome](https://www.navidrome.org/) or [Jellyfin](https://jellyfin.org/) API. - [Jellyfin](https://github.com/jellyfin/jellyfin) - [Navidrome](https://github.com/navidrome/navidrome) -- [Airsonic](https://github.com/airsonic/airsonic) -- [Airsonic-Advanced](https://github.com/airsonic-advanced/airsonic-advanced) -- [Gonic](https://github.com/sentriz/gonic) -- [Astiga](https://asti.ga/) -- [Supysonic](https://github.com/spl0k/supysonic) - -### Why does Feishin use its own database and backend instead of just use (insert music server)'s API? - -Feishin was an idea I had after I ran into usage limitations while building out [Sonixd](https://github.com/jeffvli/sonixd). Each music server has their own quirks, and I decided I wanted to consolidate and extend their features with my own backend implemntation which includes: web/desktop clients, advanced filtering, smart playlists, desktop MPV player, and more. - -### Can I use (insert database) instead of Postgresql? - -Due to [Prisma limitations](https://www.prisma.io/docs/concepts/components/prisma-migrate/prisma-migrate-limitations-issues#you-cannot-automatically-switch-database-providers), there is no easy way to switch to a different database provider at this time. +- ~~[Airsonic](https://github.com/airsonic/airsonic)~~ +- ~~[Airsonic-Advanced](https://github.com/airsonic-advanced/airsonic-advanced)~~ +- ~~[Gonic](https://github.com/sentriz/gonic)~~ +- ~~[Astiga](https://asti.ga/)~~ +- ~~[Supysonic](https://github.com/spl0k/supysonic)~~ ## Development @@ -134,52 +55,6 @@ Built and tested using Node `v16.15.0`. This project is built off of [electron-react-boilerplate](https://github.com/electron-react-boilerplate/electron-react-boilerplate) v4.6.0. -### Developing with Docker Compose - -1. Copy and rename the `example.env` to `.env.dev` and make any changes necessary -2. **Run the server**: Use `npm run docker:up` to build and run the dev server - 1. Prisma studio available on `http://localhost:5555` - 2. Server available on `http://localhost:8643` - 3. Default seeded login credentials are `admin/admin` -3. **Run the client**: Use `npm run start` to run the development Electron client - 1. The web version of the client is available on `http://localhost:4343` - -**Docker Compose files** - -``` -docker-compose.yml — The public compose file for running the latest release - -docker-compose.dev.yml - Build and run the development environment locally (includes Prisma studio) - -docker-compose.prod.yml - Build and run the production environment locally -``` - -### NPM Scripts: - -``` -$ npm run package — Packages the application for the local system - -$ npm run start — Runs the development Electron and web client - -$ npm run start:web — Runs the development web client - -$ npm run docker:up — Builds and starts the docker development environment using the 'docker-compose.dev.yml' file - -$ npm run docker:down — Stops the running docker development environment - -$ npm run docker:dbpush — Pushes any schema changes made in 'schema.prisma' to the docker development database without migrating - -$ npm run docker:migrate - Migrates any schema changes made in 'schema.prisma' and creates a migration file - -$ npm run docker:createmigrate - Creates a migration file for any schema changes made in 'schema.prisma' without applying the migration - -$ npm run docker:reset - Resets the docker development database and applies the default seed - -$ npm run prod:buildserver - Builds and tags the server docker images locally with the 'latest' and '$VERSION' tags - -$ npm run prod:publishserver - Pushes the locally build server docker images to docker hub -``` - ## License -[GNU General Public License v3.0 ©](https://github.com/jeffvli/sonixd-rewrite/blob/dev/LICENSE) +[GNU General Public License v3.0 ©](https://github.com/jeffvli/feishin/blob/dev/LICENSE) diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml deleted file mode 100644 index ebc0980c..00000000 --- a/docker-compose.dev.yml +++ /dev/null @@ -1,49 +0,0 @@ -version: '3' -services: - db: - container_name: feishin_db - image: postgres:13 - volumes: - - ${DATABASE_PERSIST_PATH}:/var/lib/postgresql/data - environment: - - POSTGRES_USER=${DATABASE_USERNAME} - - POSTGRES_PASSWORD=${DATABASE_PASSWORD} - - POSTGRES_DB=${DATABASE_NAME} - ports: - - '${DATABASE_PORT}:5432' - restart: unless-stopped - server: - container_name: feishin_server - volumes: - - ./server:/app # Synchronise docker container with local change - - /app/node_modules # Avoid re-copying local node_modules. Cache in container. - build: - context: ./server - dockerfile: Dockerfile - depends_on: - - db - environment: - - APP_BASE_URL=${APP_BASE_URL} - - DATABASE_URL=postgresql://${DATABASE_USERNAME}:${DATABASE_PASSWORD}@db/${DATABASE_NAME}?schema=public&connection_limit=14&pool_timeout=20 - - DATABASE_PORT=${DATABASE_PORT} - - TOKEN_SECRET=${TOKEN_SECRET} - - TOKEN_EXPIRATION=${TOKEN_EXPIRATION} - - TOKEN_REFRESH_EXPIRATION=${TOKEN_REFRESH_EXPIRATION} - ports: - - '8643:9321' - restart: unless-stopped - prisma: - container_name: feishin_prisma_studio - volumes: - - ./server/prisma:/app/prisma - build: - context: ./server/prisma - dockerfile: Dockerfile - depends_on: - - db - - server - environment: - - DATABASE_URL=postgresql://${DATABASE_USERNAME}:${DATABASE_PASSWORD}@db/${DATABASE_NAME}?schema=public - ports: - - '5555:5555' - restart: unless-stopped diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml deleted file mode 100644 index 149aec37..00000000 --- a/docker-compose.prod.yml +++ /dev/null @@ -1,32 +0,0 @@ -version: '3' -services: - db: - container_name: feishin_db - image: postgres:13 - volumes: - - ${DATABASE_PERSIST_PATH}:/var/lib/postgresql/data - environment: - - POSTGRES_USER=${DATABASE_USERNAME} - - POSTGRES_PASSWORD=${DATABASE_PASSWORD} - - POSTGRES_DB=${DATABASE_NAME} - ports: - - '${DATABASE_PORT}:5432' - restart: unless-stopped - server: - container_name: feishin - build: - context: . - dockerfile: Dockerfile - image: feishin - depends_on: - - db - environment: - - APP_BASE_URL=${APP_BASE_URL} - - DATABASE_URL=postgresql://${DATABASE_USERNAME}:${DATABASE_PASSWORD}@db/${DATABASE_NAME}?schema=public&connection_limit=14&pool_timeout=20 - - DATABASE_PORT=${DATABASE_PORT} - - TOKEN_SECRET=${TOKEN_SECRET} - - TOKEN_EXPIRATION=${TOKEN_EXPIRATION} - - TOKEN_REFRESH_EXPIRATION=${TOKEN_REFRESH_EXPIRATION} - ports: - - '8643:9321' - restart: unless-stopped diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 64bbab16..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,29 +0,0 @@ -version: '3' -services: - db: - container_name: feishin_db - image: postgres:13 - volumes: - - ${DATABASE_PERSIST_PATH}:/var/lib/postgresql/data - environment: - - POSTGRES_USER=${DATABASE_USERNAME} - - POSTGRES_PASSWORD=${DATABASE_PASSWORD} - - POSTGRES_DB=${DATABASE_NAME} - ports: - - '${DATABASE_PORT}:5432' - restart: unless-stopped - server: - container_name: feishin - image: jeffvictorli/feishin:latest - depends_on: - - db - environment: - - APP_BASE_URL=${APP_BASE_URL} - - DATABASE_URL=postgresql://${DATABASE_USERNAME}:${DATABASE_PASSWORD}@db/${DATABASE_NAME}?schema=public&connection_limit=14&pool_timeout=20 - - DATABASE_PORT=${DATABASE_PORT} - - TOKEN_SECRET=${TOKEN_SECRET} - - TOKEN_EXPIRATION=${TOKEN_EXPIRATION} - - TOKEN_REFRESH_EXPIRATION=${TOKEN_REFRESH_EXPIRATION} - ports: - - '8643:9321' - restart: unless-stopped diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh deleted file mode 100644 index 37ed0b0d..00000000 --- a/docker-entrypoint.sh +++ /dev/null @@ -1,5 +0,0 @@ -./wait-for-it.sh db:$1 --timeout=20 --strict -- echo "db is up" - -npx prisma migrate deploy -npx ts-node prisma/seed.ts -pm2-runtime server.js diff --git a/example.env b/example.env deleted file mode 100644 index ac17d910..00000000 --- a/example.env +++ /dev/null @@ -1,9 +0,0 @@ -DATABASE_USERNAME=admin -DATABASE_PASSWORD=admin -DATABASE_NAME=feishin -DATABASE_PORT=5432 -DATABASE_PERSIST_PATH=C:/docker/feishin/db -TOKEN_SECRET=SUPERSECRET -TOKEN_EXPIRATION=30m -TOKEN_REFRESH_EXPIRATION=90d -APP_BASE_URL=http://localhost:8643 diff --git a/package.json b/package.json index 03d23b43..4afd0684 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "feishin", "productName": "Feishin", "description": "Feishin music server", - "version": "0.0.1-alpha1", + "version": "0.0.1-alpha2", "scripts": { "build": "concurrently \"npm run build:main\" \"npm run build:renderer\"", "build:main": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.main.prod.ts", diff --git a/scripts/server-build.ps1 b/scripts/server-build.ps1 deleted file mode 100644 index 7683d48f..00000000 --- a/scripts/server-build.ps1 +++ /dev/null @@ -1,15 +0,0 @@ -$repositoryRootDirectory = Join-Path -Path Get-Location -ChildPath '..' -$packageJson = Get-Content -Path (Join-Path -Path $repositoryRootDirectory -ChildPath 'package.json') | ConvertFrom-Json - -if (!packageJson.version) { - throw 'package.json does not contain a version' -} - -$version = $packageJson.version -$appName = $packageJson.name -$dockerRepo = 'jeffvictorli' - - -Write-Host "Building [${appname}:latest] & [${appName}:${version}]" - -docker build -t "${dockerRepo}/${appName}:latest" -t "${dockerRepo}/${appName}:${version}" -f "${repositoryRootDirectory}/Dockerfile" . diff --git a/scripts/server-publish.ps1 b/scripts/server-publish.ps1 deleted file mode 100644 index d9ad1917..00000000 --- a/scripts/server-publish.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -$repositoryRootDirectory = Join-Path -Path Get-Location -ChildPath '..' -try { - $script:packageJson = Get-Content -Path (Join-Path -Path $repositoryRootDirectory -ChildPath 'package.json') | ConvertFrom-Json -} catch { - throw 'package.json does not exist' -} - -if (!$script:packageJson.version) { - throw 'package.json does not contain a version' -} - -$version = $script:packageJson.version -$appName = $script:packageJson.name -$dockerRepo = 'jeffvictorli' - -Write-Host "Pushing [${appname}:latest] & [${appName}:${version}]" - -docker push "${dockerRepo}/${appName}" --all-tags diff --git a/tsconfig.json b/tsconfig.json index 8ae9b88e..5ea19bd5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,33 +1,3 @@ -// { -// "compilerOptions": { -// "module": "esnext", -// "target": "esnext", -// "skipLibCheck": true, -// "lib": ["ESNext", "dom", "dom.iterable"], -// "baseUrl": "./src", -// "paths": { -// "/main/*": ["./src/main/*"], -// "/@/*": ["*"] -// }, -// "declaration": true, -// "declarationMap": true, -// "jsx": "preserve", -// "jsxImportSource": "@emotion/react", -// "strict": true, -// "pretty": true, -// "sourceMap": true, -// "noUnusedLocals": true, -// "noUnusedParameters": true, -// "noFallthroughCasesInSwitch": true, -// "moduleResolution": "Node", -// "esModuleInterop": true, -// "outDir": "release/app/dist", -// "isolatedModules": false, -// "types": ["node"] -// }, -// "exclude": ["test", "release/build", "release/app/dist", ".erb/dll", "server"] -// } - { "compilerOptions": { "target": "es2021",