Skip to content
A cross-platform music playing app
JavaScript CSS
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
flow-typed/npm
icons
screenshots
src
static
.eslintrc.json
.flowconfig
.gitignore
LICENSE
README.md
package-lock.json
package.json
webpack.renderer.config.js

README.md

Lyra Music Player

Lyra is a cross-platform music player app that can play songs on your computer and on YouTube.

Check out the lightweight version built with Neutrino!

Features

  • Songs
    • Add songs on your computer and play them
    • Remove songs
  • Playback
    • Volume control
    • Shuffle
    • Skip forward / back 10 seconds
    • Skip to previous / next song
    • Media button shortcuts (Play, Pause, Skip)
  • Song metadata
    • Parses title and artist metadata
    • Edit metadata within the player
  • Playlists
    • Create and delete playlists
    • Add and remove songs to playlists
    • Play songs in a playlist
  • YouTube
    • Search for YouTube videos
    • YouTube video playback
    • Autoplay
    • Shows related videos
    • Add video to library
    • Download YouTube video as audio

Screenshots

Library Youtube

Development

To run locally, clone the repo and run the following:

npm install
npm run dev

To build the executable, you have two options:

# Create unpacked release
npm run dist

# Create packaged executable
npm run pack

TODO:

  • Keyboard shortcuts
    • Space to play/pause
    • Left/right arrow keys to skip 10 seconds

Refactor:

  • Screen display
    • currently, it's hacked together with playlists
    • playlists / all songs should be seperately handled from other screens (e.g. settings, youtube)
    • loading all songs is laggy due to reloading all songs again
      • bring getSongList into component, and only update if props change
    • new screen management:
      • currScreen: 'MAIN' | 'PLAYLIST' | 'SETTINGS' | 'YOUTUBE'
      • currSubScreen: PlaylistID | 'SEARCH' | 'PLAYING'

Minor fixes:

  • Scroll bar
    • Sidebar scroll bar should only scroll playlists?
  • Split up components/playback/index.js (big file)
    • Limit files to 200 lines?
  • Deleting playlist
    • Show confirmation modal?
  • Inconsistent action to open context menu
    • Youtube playing: click options icon
    • Library: right click

Bugs:

  • Uncontrolled to controlled component warning
    • On song item edit, switching focus for the first time
  • Sorting by name should ignore punctuation (like brackets)
  • If the song skips before related songs are loaded, it won't autoplay the next song
  • Linux:
    • If something else takes control of the media buttons and releases them, the media buttons won't work anymore

Song types:

  • Shared data format:

    • id
    • title
    • artist
    • duration
    • date
    • playlists
    • source
    • location
  • Locally sourced song

    • Data format
      • id: hash of filepath
      • source: "LOCAL"
      • location: filepath
  • Youtube video

    • Data format
      • id: video id
      • artist: channel name
      • views
      • thumbnail
      • source: "YT"
      • location: video id
      • local: whether it is downloaded or not ?
  • Downloaded Youtube song

    • Data format
      • id: video id
      • source: "YT-LOCAL"
      • location: filepath
  • new data

    • where the current song is playing from
    • all songs? playlist? youtube?
    • Add new sidebar item: "Now Playing"
    • opens the respective screen for the song

Long term features:

  • History
    • Pressing back should go back to start of current song
    • Pressing back again within ~2 sec of song starting should go back to previously played song
      • Need to store history of played songs
  • Music metadata
    • Edit metadata on song add
  • Drag and drop
    • Add songs to all songs
    • Add songs to playlists
    • Add songs into playlists
  • Youtube
    • Pagination
    • Open in browser
  • Online
    • Make account
    • Show songs saved online
    • Stream songs
    • Download songs
      • When listening to a Youtube song, download it in the background as a cache
      • Future playbacks and actual downloads will fetch from server's cache instead
    • Upload songs
  • Web App
    • Change storage to localStorage?

Ideas:

  • Song row interaction
    • Single click does nothing
    • Double click to play
    • Play button on left
      • Single click to play
    • Right click to open menu
      • Play, Edit
        • Edit is same
  • Download from Youtube
    • Server download, since it requires converting to mp3

Note:

  • Media button shortcuts don't work normally in Linux. To get around it, the player uses dbus to directly access shortcuts. dbus requires several other packages to install:
  • On macOS Mojave (and higher), access to media keys requires accessibility permissions. In this case, Lyra will display a dialog requesting permissions.
  • On Linux, running the AppImage for the first time will install the desktop file in ~/.local/share/applications/ for desktop integration. However, if the path to the AppImage has a space in it, the desktop file will have an incorrect value for TryExec, making it unable to run.
You can’t perform that action at this time.