🐦 A personal music streaming server that works.

Overview

koel e2e unit Code Quality codecov OpenCollective OpenCollective

Showcase

Intro

Koel (also stylized as koel, with a lowercase k) is a simple web-based personal audio streaming service written in Vue on the client side and Laravel on the server side. Targeting web developers, Koel embraces some of the more modern web technologies – CSS grid, audio, and drag-and-drop API to name a few – to do its job.

Install and Upgrade Guide

For system requirements, installation/upgrade guides, troubleshooting etc., head over to the Official Documentation.

Development

Since Koel makes use of git submodules, you'll want to make sure the submodule is up-to-date:

git pull
git submodule update --init --recursive --remote

# install the submodule dependencies
cd resources/assets
yarn install

To start the PHP dev server, which serves as the API of the application, run the following command from the root directory. By default, the server will listen at port 8000.

php artisan serve

For the client application itself, run this command:

yarn hot

A development version of Koel should now be available at http://localhost:8080 with full support for hot module reloading.

Alternatively, you can start both the PHP server and the client application in one go with yarn dev, which uses start-server-and-test under the hood.

Testing, Linting, Static Analysis and Stuff

# PHP-related code quality tasks
# Basically, take a look at the "scripts" section in composer.json
composer test        # Run the PHP test suite
composer cs          # Run code style checker
composer cs:fix      # Run code style fixer 
composer analyze     # Run PHP static analysis

yarn build # Build a production version of the client application

# Client/E2E code quality tasks
# You may want to run `yarn build` first.
yarn test:e2e        # Run the Cypress test suite interactively
yarn test:e2e:ci     # Run the Cypress test suite non-interactively (CI mode)
# These commands need to be run from within the submodule (resources/assets)
yarn lint            # Lint
yarn type-check      # TypeScript type checking
yarn test            # Unit testing

Note: If you're already running yarn test:e2e, there's no need to start a dev server. yarn test:e2e calls yarn dev internally and will eliminate the existing yarn dev process, if any.

A quick and easy way to start hacking on koel is to open and run this repo in Gitpod, an online IDE with full Laravel support.

Open in Gitpod

Backers

Support me on OpenCollective with a monthly donation and help me continue building Koel.

Sponsors

GitHub Sponsors

OpenCollective

Become a sponsor on OpenCollective and get your logo on our README on Github with a link to your site.

Issues
  • Error 500 when downloading 1 song

    Error 500 when downloading 1 song

    Describe the bug

    The server returns a 500 error when downloading a single song.

    To reproduce Steps to reproduce the behavior:

    1. Go to 'songs'
    2. Right-click on 'Download' on a song
    3. Nothing happened, the server returned an HTTP 500 error.

    Expected behavior

    Download the song.

    Screenshots

    I set APP_DEBUG=true and got the response:

    InvalidArgumentException:
    Unsupported download type.
    
      at /var/www/html/app/Services/DownloadService.php:50
      at App\Services\DownloadService->from()
         (/var/www/html/app/Http/Controllers/Download/SongController.php:24)
      at App\Http\Controllers\Download\SongController->show()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54)
      at Illuminate\Routing\Controller->callAction()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:45)
      at Illuminate\Routing\ControllerDispatcher->dispatch()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php:254)
      at Illuminate\Routing\Route->runController()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php:197)
      at Illuminate\Routing\Route->run()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php:695)
      at Illuminate\Routing\Router->Illuminate\Routing\{closure}()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:128)
      at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
         (/var/www/html/app/Http/Middleware/Authenticate.php:28)
      at App\Http\Middleware\Authenticate->handle()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
      at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php:50)
      at Illuminate\Routing\Middleware\SubstituteBindings->handle()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
      at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:103)
      at Illuminate\Pipeline\Pipeline->then()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php:697)
      at Illuminate\Routing\Router->runRouteWithinStack()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php:672)
      at Illuminate\Routing\Router->runRoute()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php:636)
      at Illuminate\Routing\Router->dispatchToRoute()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php:625)
      at Illuminate\Routing\Router->dispatch()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:166)
      at Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:128)
      at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
         (/var/www/html/app/Http/Middleware/ForceHttps.php:31)
      at App\Http\Middleware\ForceHttps->handle()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
      at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:21)
      at Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php:31)
      at Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
      at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:21)
      at Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php:40)
      at Illuminate\Foundation\Http\Middleware\TrimStrings->handle()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
      at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php:27)
      at Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
      at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php:86)
      at Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:167)
      at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:103)
      at Illuminate\Pipeline\Pipeline->then()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:141)
      at Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter()
         (/var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:110)
      at Illuminate\Foundation\Http\Kernel->handle()
         (/var/www/html/public/index.php:57)
    

    Environment

    Docker image hyzual/koel with docker-compose.

    • Koel version v5.1.5
    • OS: Debian GNU/Linux 10 (buster)
    • Browser Chrome Version 93.0.4577.82 (Official Build) (x86_64)
    • PHP version 7.4.23

    Additional context

    I verified and the requested song exists is in the database.

    opened by masterT 0
  • A couple of things...

    A couple of things...

    Hi guys,

    First, I would like to say this a great project and anything put below is to improve it and I am not in any way trying to diminish the present quality of it.

    1. Mobile web player does not work: it shows the page but it keeps skipping to the next song.

    2. Button to hide the right-side bar: I don't have much use for that (others may, though), so a button for those who wants to hide it would be nice.

    3. Alac playback: it can be another setting to be changed, but I installed gstreamer1.0-libav and restart the container but still didn't work. It tries to load the track but skis to the next one.

    4. Add radio streams/podcasts

    5. Problem with multi-disc albums Currently: Track Album Artist 01 Album-Disc01 MyArtist 01 Album-Disc02 MyArtist 02 Album-Disc01 MyArtist 02 Album-Disc02 MyArtist

    Desired: Track Album Artist 01 Album-Disc01 MyArtist 02 Album-Disc01 MyArtist 01 Album-Disc02 MyArtist 02 Album-Disc02 MyArtist

    1. Save order profile: it is lost after every refresh or change of page.

    That's it. Thanks again for the beautiful application.

    opened by ebiscaia 2
  • chore(deps): bump tar from 4.4.10 to 4.4.19

    chore(deps): bump tar from 4.4.10 to 4.4.19

    Bumps tar from 4.4.10 to 4.4.19.

    Commits
    • 9a6faa0 4.4.19
    • 70ef812 drop dirCache for symlink on all platforms
    • 3e35515 4.4.18
    • 52b09e3 fix: prevent path escape using drive-relative paths
    • bb93ba2 fix: reserve paths properly for unicode, windows
    • 2f1bca0 fix: prune dirCache properly for unicode, windows
    • 9bf70a8 4.4.17
    • 6aafff0 fix: skip extract if linkpath is stripped entirely
    • 5c5059a fix: reserve paths case-insensitively
    • fd6accb 4.4.16
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    Dependencies JavaScript 
    opened by dependabot[bot] 0
  • Album art doesn't cache

    Album art doesn't cache

    Describe the bug Album art loads fine from last.fm, but after page refresh no art is cached. I've also recently purchased the android app and have noticed no album art in the mobile app. I'm hoping this is due to this caching problem.

    Expected behavior Album art is cached so upon refresh it doesn't have to re-query last.fm again

    Environment

    • Koel version 5.1.5
    • OS: macOS Mojave
    • Browser: Chrome v92.0.4515.159 (current as of Aug 29, 2021)
    • PHP version 8.0.9
    • Node version 16.0.6

    Additional context I'd love any pointers on why this may not be working. Everything seems to work fine except for this. I've read through the docs multiple times and can't find anything I've missed. Thanks

    opened by waaronking 3
  • Automatically get lyrics from .lrc files

    Automatically get lyrics from .lrc files

    Description Many powerful music players support this and it's really convinient. I don't think it's too difficult. In addition, koel should allow uploading .lrc file in the web upload.

    Example If there's songname.lrc and songname.mp3, lyrics can be loaded from .lrc and be shown.

    opened by ChengxiX 1
  • GraceNote API

    GraceNote API

    Description Gracenote is like last.fm but it has more info on Indians Songs than last.fm.

    https://www.gracenote.com/docs/

    Example There should be an option on each song to select, from where info should imported gracenote or last.fm etc.

    opened by manjotsc 0
  • chore(deps): bump path-parse from 1.0.6 to 1.0.7

    chore(deps): bump path-parse from 1.0.6 to 1.0.7

    Bumps path-parse from 1.0.6 to 1.0.7.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    Dependencies JavaScript 
    opened by dependabot[bot] 0
  • Podcasts episodes can't be played

    Podcasts episodes can't be played

    I use "Podgrab" to grab episodes from iTunes to my server. And I noticed that all episodes can't be played.

    Here is an example: https://dts.podtrac.com/redirect.mp3/justpodmedia.com/audio/left-right/leftright-ep148-20210730.mp3

    opened by ProteinPig 1
  • [Feature Request] Use unsplash for background images

    [Feature Request] Use unsplash for background images

    Hi, I would like to customize the player background images from within the interface. Something many are using for this purpose is unsplash.com via its API, free beautiful images of all sorts. I imagine it being able to autorotate or even pull in a new image based off the currently playing song title. I am sure there are higher priority things to do, but just wanted to put a request out there, hope that is okay :) I finally switched from subsonic to koel and its already miles ahead in terms of interface design. This would just be the cherry on top! ;)

    https://unsplash.com/developers

    Thank you for creating this wonderful player! Cheers!

    opened by heavydetail 0
  • chore(deps): bump url-parse from 1.4.7 to 1.5.3

    chore(deps): bump url-parse from 1.4.7 to 1.5.3

    Bumps url-parse from 1.4.7 to 1.5.3.

    Commits
    • ad44493 [dist] 1.5.3
    • c798461 [fix] Fix host parsing for file URLs (#210)
    • 201034b [dist] 1.5.2
    • 2d9ac2c [fix] Sanitize only special URLs (#209)
    • fb128af [fix] Use 'null' as origin for non special URLs
    • fed6d9e [fix] Add a leading slash only if the URL is special
    • 94872e7 [fix] Do not incorrectly set the slashes property to true
    • 81ab967 [fix] Ignore slashes after the protocol for special URLs
    • ee22050 [ci] Use GitHub Actions
    • d2979b5 [fix] Special case the file: protocol (#204)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    Dependencies JavaScript 
    opened by dependabot[bot] 0
Releases(v5.1.5)
  • v5.1.1(Apr 16, 2021)

  • v5.1.0(Mar 26, 2021)

    New Features and Improvements

    • Themes! Koel's (S)CSS has gone through a major overhaul to support theming, and now Koel supports 16 different themes out of the box. You can pick yours under Profile and Preferences. In the future, I plan to support custom/customizing themes as well.

      image

    • Artists and albums now have their own context menu.

    • The download icon button has been removed from the footer for a cleaner interface. You can still download the current song via the context menu (triggered by right-clicking the footer).

    • The autocomplete (typeahead) and song list sorting features have been rewritten to work better and fix some bugs

    Bug Fixes

    • Broken Last.fm integration

    Upgrade

    • If you installed Koel via git:

      git pull
      git checkout v5.1.0
      git submodule update --init --recursive
      composer install
      php artisan koel:init 
      
    • If you installed Koel via the tarball/archive: Uncompress the archive overwriting the current installation and run:

      composer install
      php artisan koel:init --no-assets
      
    Source code(tar.gz)
    Source code(zip)
    koel-v5.1.0.tar.gz(18.23 MB)
    koel-v5.1.0.zip(22.46 MB)
  • v5.0.0(Jan 9, 2021)

    Code-named "Alexi" in memory of the late Alexi Laiho, this fifth major version of Koel comes with lots of improvements, fixes, and some breaking changes. Please follow the upgrade guide carefully.

    Breaking Change: Project Structure

    Though written in Laravel, the older versions of Koel didn't follow a Laravel-conventional directory structure. This decision was made to support shared-hosting environments where users have little control over the filesystem. However, considering that:

    • Self-managed or semi-managed hosting solutions like Digital Ocean, Heroku, AWS, etc., are now much more popular over time, giving users near-complete system control
    • An unconventional structure requires modifications and hacks that are prone to problems and make it harder to follow official best practices

    starting from version 5, Koel will revert to using the original Laravel structure.

    The upgrade itself is straightforward: In most cases, you'll only need to point your server's root config to the public directory instead of koel's root. For example, with Apache:

    <VirtualHost *:80>
    -   DocumentRoot "/var/www/koel"
    +   DocumentRoot "/var/www/koel/public"
    

    and nginx:

    server {
      listen          *:80;
      server_name     koel.dev;
    -  root            /var/www/koel;
    +  root            /var/www/koel/public;
      index           index.php;
    

    Breaking Change: API

    Koel's API now follows OpenAPI specs. The API reference is now contained within a single YAML file which can be opened with a compatible editor such as Spotlight Studio:

    image

    This greatly reduces the maintenance effort and renders a dedicated website for the API unnecessary.

    Other Changes

    As a major version, Koel 5 comes with a load of changes, new features, improvements, and bug fixes:

    Server Requirements

    Koel is now powered by Laravel 8, which means your server needs to meet its requirements.

    Search

    The simple "filter" box has been completely overhauled to be a full-featured Instant Search page that supports full-text, fuzzy searching for songs, artists, and albums.

    image

    To populate the search index, run this command (you only need to run this once, as subsequent changes to the music database will be synchronized automatically):

    php artisan koel:search:import
    

    By default, the search functionality is powered by TNTSearch, which comes packaged with Koel. You can also use the Algolia driver (their free plan allows 10K records and 10K search requests)—simply by updating .env with this info:

    SCOUT_DRIVER=algolia
    ALGOLIA_APP_ID=<your-app-id>
    ALGOLIA_SECRET=<your-secret>
    

    Don't forget to run the import command afterward!

    Other Changes

    • Admins can now be created from the Users screen
    • The blurry album thumbnails are now generated and served by the server instead of using the CPU-expensive CSS blur filter
    • Authentication is now handled by Laravel Sanctum instead of JWT. This eliminates some nasty session expiry bugs.
    • You can now like/unlike song directly from the song-list ( koel/[email protected])

    image

    To Upgrade

    1. Create a full backup!

    2. Run the commands:

      git pull
      git checkout v5.0.0
      git submodule update --init --recursive
      composer install
      php artisan koel:init 
      
    3. Update your webserver config following the instruction above

    4. Enjoy!

    If Things Go South

    Restore your backup.

    Source code(tar.gz)
    Source code(zip)
  • v4.4.0(Jun 10, 2020)

    This new version of Koel comes with several new features, bug fixes, and improvements, most notably:

    • Feature: You can now upload directly from the web interface if logged in as an admin and have set the media path. Just choose "Upload" from the sidebar menu and drag media files or folders into the drop zone.

      Under the hood, Koel will upload your media files into a %media_path%/__KOEL_UPLOADS__ folder on the server and update the client's data on the fly. Notice that this feature is still in beta, so please let us know if you encounter any problems.

    • Feature: You can upload new artist images and album covers by dragging a file into the artist/album item, like this:

      upload-cover

    • Improvement: Artist/album view mode switch now uses proper radio buttons instead of <span>'s/<div>'s.

    • Improvement: Playlists are now ordered properly in the sidebar

    • Fix: Songs should now be queued in the correct displayed order when Alt/Option-click the play button

    • Fix: Album/artist list screens should now properly initialize infinite scrolling

    • Fix: The "Add Lyrics" link is now not available if there's no song in play

    • Fix: webpack now emits properly-hashed chunk names in production builds

    • Improvement: The whole JavaScript codebase has been converted into TypeScript.

    Upgrade

    1. Make a backup

    2. Run these commands

      git pull
      git checkout v4.4.0
      git submodule update --init --recursive
      composer install
      php artisan koel:init 
      

    Downgrade

    Restore your backup.

    Source code(tar.gz)
    Source code(zip)
  • v4.3.1(Apr 23, 2020)

    v4.3.1 fixes the bug of Koel playing with no sound on iOS, along with the ability to trigger updating lyrics right from the Lyrics panel. To upgrade:

    1. Create a backup
    2. Run these commands
    git pull
    git checkout v4.3.1
    git submodule update --init --recursive
    composer install
    php artisan koel:init 
    
    Source code(tar.gz)
    Source code(zip)
  • v4.3.0(Apr 21, 2020)

    The next minor version of Koel, which comes with new features, improvements, and bug fixes and usual. And, in case you haven't noticed, Koel now has its own domain!

    New Features and Improvements

    • Media thumbnail moved to the play button (or "play orb" if you will)
    • Reduce the progress bar's height. Its click area (along with that of other controls) is actually increased, allowing easier interaction
    • Song items on homepage now react to context menu and drag-drop actions
    • You can now play a song list in the current order by clicking the "All" button while pressing the Alt (Option) key
    • You can now right-click anywhere on the footer while a song is playing (or paused/stopped) for contextual commands
    • Speaking of context menus, now they have a dark theme that matches better with the overall interface

    Fixes

    • Hotkeys (F, space etc.) now work even when the progress bar has focus
    • Remote control app is now back
    • Fixed a racing condition that might cause logging in to fail with valid credentials
    • For development, hot-reloading now works again

    To upgrade:

    1. Create a backup
    2. Run these commands
    git pull
    git checkout v4.3.0
    git submodule update --init --recursive
    composer install
    php artisan koel:init 
    
    Source code(tar.gz)
    Source code(zip)
  • v4.2.2(Dec 2, 2019)

    This version includes several bug fixes and improvements:

    • Fixed an issue with SongStartedPlaying event dispatching
    • Fixed and improve (global) hotkey integration
    • The volume control is now shown on hover only, saving some space
    • A "download current song" button is added into the footer bar

    To upgrade:

    1. Create a backup
    2. Run these commands
    git pull
    git checkout v4.2.2
    git submodule update --init --recursive
    composer install
    php artisan koel:init
    
    Source code(tar.gz)
    Source code(zip)
  • v4.2.1(Nov 29, 2019)

    This is a bug fix version. Specifically:

    • The bottom support bar now respects user preferences
    • manifest.json.example is added. To enable PWA support for Koel, copy this file into manifest.json and modify its content accordingly.

    To upgrade:

    1. Create a backup
    2. Run these commands
    git pull
    git checkout v4.2.1
    git submodule update --init --recursive
    composer install
    php artisan koel:init
    
    Source code(tar.gz)
    Source code(zip)
  • v4.2.0(Nov 28, 2019)

    This version comes with several changes and improvements:

    • The problem with context menu being off-screen is now fixed
    • Queuing already queued song(s) now behaves correctly
    • The translucent, blurred album art overlay is now an option in the Profile screen. Consider turning it off if you notice high CPU usage.
    • Koel should now be compatible with Node 12.x
    • As usual, more optimization and refactoring underneath

    To upgrade:

    1. Create a backup
    2. Run these commands
    git pull
    git checkout v4.2.0
    git submodule update --init --recursive
    composer install
    php artisan koel:init
    
    Source code(tar.gz)
    Source code(zip)
  • v4.1.1(Oct 26, 2019)

    This version comes with a couple of fixes and improvements, most notably:

    • Fixed the bug where koel is broken on mobile browsers (#1111)
    • Added the ability to change the admin password from console with php artisan koel:admin:change-password
    • More tests, refactorings, and optimizations on the client side

    To upgrade:

    1. Create a backup
    2. Run these commands
    git pull
    git checkout v4.1.1
    git submodule update --init --recursive
    composer install
    php artisan koel:init
    

    Aaaand it's done! See you next time!

    Source code(tar.gz)
    Source code(zip)
  • v4.1.0(Oct 9, 2019)

    This version comes with several changes:

    • Downgrade getID3 to ^1.9 to fix an annoying regression (#1078)
    • Make DB_DATABASE config for sqlite-persistent driver absolute (technically this is a breaking change, but it's simple enough to migrate so I'm not bumping a major version) (#1099)
    • Songs are now counted as "played" only after a 25% threshold (i.e. if you've listened past 1 minute of a 4-minute song) (#1087)
    • Fix a bug with Albums/Artists screens not scrollable on extra-large screens (#1086)
    • A couple of bug fixes and performance improvements

    To upgrade:

    1. Create a backup
    2. Run these commands
    git pull
    git checkout v4.1.0
    git submodule update --init --recursive
    composer install
    php artisan koel:init
    

    If you're using sqlite-persistent driver, replace the value of DB_DATABASE in .env file with the full path to your database file.

    That's it! See you next time!

    Source code(tar.gz)
    Source code(zip)
  • v4.0.0(Sep 10, 2019)

    Here you go, the long-due 4th major version of Koel! This version comes with a LOT of changes, fixes, and improvements, as you may have expected. But before you get too excited and jump ahead with the upgrade, one important thing:

    Koel now requires PHP >= 7.1.3

    Yes. Koel v4.0.0 is developed on top of Laravel v5.8.x, which requires PHP 7.1.3 and up. So if your PHP version is lower than that, you'll need to upgrade it prior to proceeding. Also:

    Koel's codebase now makes use of Git submodules

    In an effort to unify the code between the web and the desktop app versions of Koel, I've extracted the interface (the client code, written in Vue) into its own repository (a submodule). Essentially, this only means you'll need to run a slightly different command to init or update the codebase, so fear not.

    Changes

    So what's new? Well, quite a few. This version of Koel comes with:

    • An accessibility overhaul. Koel is now much, much more friendly to visual-impaired users.

    • The back-end part rewritten almost from scratch for better code quality (9.81 on Scrutinizer currently), readability, and maintainability

    • API docs, finally!

    • Smart playlists! You can now specify a set of rules (title must include a certain word and/or length must be greater than 10 minutes cough Dream Theater cough for example) and your playlist will contain only songs that meet the rule(s).

    • A dedicated, centralized "Recently Played" list. Previously, this list only consisted of up to 7 last played songs on the current device. Now Koel remembers all songs you've played – no matter what device they were played on – and put them in a first-class "Recently Played" playlist.

    • An extra cool visualizer.

      visualizer

      I'll leave it to you to figure out how to toggle it, though ;)

    • A more attractive and consistent equalizer.

    • Global hotkeys being more, erm, global. You don't need to set focus into Koel before triggering the hotkeys anymore. And if you use Chrome, media keys are supported truly globally, which means you don't even need to have the browser window focused to control Koel.

    • On-demand playlist loading. A playlist's content is now only loaded and populated if you select it in the sidebar or enter its URL directly. This means a lighter and faster bootup time for Koel.

    • Sorting supported in Queue screen, because why not

    • Code splitting from scratch. Most of Koel's client components are now loaded on demand, which greatly improves loading time and performance.

    • A zoom control for the Lyrics pane, allowing you to zoom the text in and out to cater for your visual needs

    • An "About" dialog

    • PWA support

    • Better error handling during installation. If the artisan koel:init command fails for any reason at any step, Koel will stop and let you know instead of silently moving ahead like before.

    • More consistent auto-playing

    • Support for SQLite (thanks @SahAssar!)

    • HTTPS working properly behind reverse proxies

    • Countless refactors, bug fixes, and minor improvements. Truly countless.

    Upgrade

    To upgrade, first make a backup of your database and the application code. I know I always said that, but this time it's even more critical because hey, we have a major version here folks! Better be safe than sorry.

    Then, after the backup is done, execute these commands from the root directory:

    1. git pull
    2. git checkout v4.0.0
    3. git submodule update --init --recursive
    4. composer install
    5. php artisan koel:init
    6. That's about it. Expected more? Sorry to disappoint.

    When Things Go South…

    …restore your backup.

    Till next time!

    Source code(tar.gz)
    Source code(zip)
  • v3.7.2(Jan 28, 2018)

  • v3.7.1(Jan 28, 2018)

    This release upgrades Koel's equalizer to work with some new implementations and deprecations of WebAudio in Google Chrome. To upgrade:

    git fetch
    git checkout v3.7.1
    php artisan koel:init
    
    Source code(tar.gz)
    Source code(zip)
  • v3.7.0(Dec 3, 2017)

    Alright folks, time for a new version! v3.7.0 comes with quite a few fixes and new features. Here they come in no particular order:

    Changes

    • Album compilation status handling got a total rewrite and should work more properly now
    • A remote controller is added, so you can lie on your bed and control the Koel instance on your desktop. Note: this feature is still experimental and has several limitations.
    • Multi disc support is added (@fieteboerner). Note that you'll need to resync with php artisan koel:sync --force --tags=disc for Koel to record the disc number.
    • Support for non-root installations is added (@fieteboerner)
    • Database port can now be configured (@leowmjw)
    • The command koel:init got a massive revamp – it can now ask for database credentials, create the admin account, and set the media path. You don't have to touch .env file during installation anymore!
    • Following the change to koel:init the admin account is NOT set in .env file and created during initial database seeding anymore.
    • The command koel:sync can now set the media path, too, so you can run it right after installation without having to set a media path via the web interface (I don't know why I didn't think about this earlier)
    • Playlist content is now populated on demand i.e. data is only downloaded when the playlist is accessed. This should speed up Koel's boot time.
    • Mockery is updated to v1 (@carusogabriel)
    • A LOT of refactoring (I'm counting 20 commits with the keyword "refactor") and tests added

    Upgrade

    1. As usual, back up everything!
    2. From the command line, run
    git fetch
    git checkout v3.7.0
    composer install
    php artisan koel:init
    

    If things go south

    1. Restore the backup
    2. Let me know what went wrong

    Remote controller

    Again, this feature is still basic and experimental, with several limitations.

    Koel v3.7.0 comes with a remote controller which allows you to control a desktop instance remotely via a mobile interface.

    This can come in handy in several circumstances, e.g. when you leave your Koel playing at night and want to pause or turn the volume down from your comfy bed. Granted, this is not super super useful, but it works for me at least, so why not?

    In order to use this feature, first sign up for a Pusher account (the free layer should be more than enough) and create a new app. Then, populate these values into your .env file:

    PUSHER_APP_ID=
    PUSHER_APP_KEY=
    PUSHER_APP_SECRET=
    PUSHER_APP_CLUSTER=
    

    Save the file, refresh Koel, and that's about it. Now go to http://<your-koel-host>/remote on a mobile device and start controlling Koel remotely. You may also want to add the page to home screen for faster access later.


    That's it for now. See you in another update in the hopefully near future, with more exciting features!

    Source code(tar.gz)
    Source code(zip)
  • v3.6.2(Apr 19, 2017)

    This version fixes an issue with database migration on new installations. Happy existing users don't need to upgrade, as it doesn't provide any other fixes or changes. If you insist, though:

    git fetch
    git checkout v3.6.2
    php artisan koel:init
    
    Source code(tar.gz)
    Source code(zip)
  • v3.6.1(Apr 15, 2017)

    This version fixes a bug where the covers folder is not generated, causing scanning to fail on a fresh installation. To get it:

    git fetch
    git checkout v3.6.1
    yarn build
    
    Source code(tar.gz)
    Source code(zip)
  • v3.6.0(Apr 2, 2017)

    Here it is, version 3.6.0. Let's take a look at the shiny new things:

    Changes

    • Laravel (the PHP framework powering Koel's backend and API, in case you didn't know) has been upgraded to version 5.4
    • The official wiki has been moved to https://koel.phanan.net/docs. Be sure to check it out – I promise you'll love it!
    • A new "Convert and play media at 128kbps on mobile" option (unchecked by default) has been added to Profile. This instructs Koel to convert the songs into 128kbps mp3's (if ffmpeg is configured and detected) when stream on a mobile device for more optimized speed and bandwidth. IMPORTANT: This feature is experimental and may cause playback issues, in such a case you may want to keep it disabled.
    • On Android and with Chrome 57 and newer, playback can now be controlled via the notification center and lock screen, like this.
    • Next song is now preloaded much sooner instead of 10 seconds to the end of the current song.
    • You can now search specifically for song titles, albums, or artists using the in: operator, for example searching for keeper in:title will only return the song "Keeper of the Seven Keys" and not the whole album with the same name. Similarly, you have in:artist and in:album.
    • Various bug fixes and improvements.

    Upgrade

    1. Make a backup of everything: Koel, its server, its server's server, the load balancer, the DNS zone file, the CDN settings, maybe the whole AWS even. You can never be too careful these days, hey.
    2. From the installation folder:
    git fetch
    git checkout v3.6.0
    composer install
    php artisan koel:init
    

    Downgrade

    1. Restore your backup
    2. Let me know what went wrong

    That's it for now!

    Source code(tar.gz)
    Source code(zip)
  • v3.5.5(Feb 9, 2017)

    This version includes several bug fixes and an API change.

    "But… but… API changes require a major version bump!" I hear you say.

    Uhm… no, not this time. I'm sorry. I just don't feel like it.

    Changes

    • Fixed a bug in the equalizer that'd prevent Koel from starting in certain cases (by @X-Ryl669)
    • Authentication API now returns more proper HTTP codes (by @X-Ryl669)
    • Added predis into composer.json so Laravel folks can use Redis for its session and cache drivers if they want too (by @MelonSmasher)
    • Bumped the version (by me, because I want some credits with this new version too!)

    On Upgrading

    As usual:

    git fetch
    git checkout v3.5.5
    composer install
    php artisan koel:init
    

    On Downgrading

    git fetch
    git checkout v3.5.4
    composer install
    php artisan koel:init
    
    Source code(tar.gz)
    Source code(zip)
  • v3.5.4(Jan 22, 2017)

  • v3.5.3(Jan 19, 2017)

    This release fixes the bug with "Edit Songs" form not opening and add a minor enhancement for track number field. To upgrade:

    git fetch
    git checkout v3.5.3
    php artisan koel:init
    
    Source code(tar.gz)
    Source code(zip)
  • v3.5.2(Jan 18, 2017)

    This release fixes the bug with YouTube/Download, and removes Sentry. To upgrade, simply

    git fetch
    git checkout v3.5.2
    composer install
    php artisan koel:init
    
    Source code(tar.gz)
    Source code(zip)
  • v3.5.1(Jan 17, 2017)

    This version fixes a problem with composer install and some Edge's incompatibilities.

    Upgrade

    git fetch
    git checkout v3.5.1
    composer install
    php artisan koel:init
    

    Downgrade

    git checkout v3.5.0
    composer install
    php artisan koel:init
    
    Source code(tar.gz)
    Source code(zip)
  • v3.5.0(Jan 15, 2017)

    Another version with a great set of new features, improvements, and of course, bug fixes! Here you go:

    Changes

    • The long-awaited virtual scrolling feature is here! Now you can scroll through your tens of thousands of songs smoothly without the awkward loading-more pause. Big ups to @Akryum for his incredible vue-virtual-scroller plugin!

    • The query to get artist, album, and song information upon Koel's bootup is now cached by default. This should give the app a performance boost.

    • Talking about performance, some optimizations have been put in place, and now the initial data parsing process is up to 100% faster – yes, I tested this myself!

    • If you have Last.fm integrated (and why not?), you should have noticed the track listing panel to the right. Previously it didn't do much except for, well, listing the tracks. Starting from this version, though, tracks missing from your library will have a link to purchase on iTunes.

      Track Listing Before and After

      Now I have a confession to make: These links are associated with my iTunes affiliate account, which means I'd earn several cents each time you buy a track from them – see it as a way to support this project, will ya? I don't know yet how it will work out (if at all), though, so this is very experimental and may be removed in the future.

    • The "recently played" song list is now persistent between browser sessions.

    • jQuery has been completely removed and replaced by leaner, more modern, libraries and solutions. For example, $.ajax's job is now handled by axios, DOM traversing and manipulation by modern browser API's etc.

    • As always, various bug fixes and cleanups.

    Upgrade Path

    1. Create a backup of the whole stuff

    2. Run this series of commands, which, in all honesty, has become quite boring for me to type now:

      git fetch
      git checkout v3.5.0
      composer install
      php artisan koel:init
      
    3. (Optional) If you want to disable the media query cache above, add MEDIA_CACHE=false into .env

    Downgrade Guide

    Restore your backup, or just do a git checkout v3.4.1 && yarn install. Also, open an issue to let me know what went wrong, maybe?

    Source code(tar.gz)
    Source code(zip)
  • v3.4.1(Dec 4, 2016)

    This version includes a quick fix for an issue with the "Edit Songs" form. To upgrade:

    git fetch
    git checkout v3.4.1
    php artisan koel:init
    

    Tada!

    Source code(tar.gz)
    Source code(zip)
  • v3.4.0(Dec 2, 2016)

    This new version of Koel comes with a lot of changes and improvements, both visible and under the hood. After all, there's a whopping of 118 commits since the last release! Thanks everyone for your continuing support – ideas, bug reports, pull requests – keep it coming!

    Changes

    Visible Changes

    • You can now instruct Koel to ignore (by default) or cater for dot files and folders when scanning
    • The UI fonts are now inherited from system UI fonts instead of Roboto.
    • Song selection is now properly kept track of (fixes #427)
    • The CSS3-based loading/playing animation has been replaced with an animated GIF to avoid high CPU issue (fixes #481)
    • More visible feedbacks for time-consuming actions (create playlists, add/remove songs from playlists etc.)
    • The add/edit user forms are completely revamped
    • Song listing in Last.fm album information is now linked to available songs in your library

    Under the Hood

    • Laravel's version is bumped to 5.3 – see Upgrade Guide
    • npm has been replaced with yarn – see Upgrade Guide
    • JavaScript (Vue) code base went through a massive, complete lint. Now yarn test will lint the code via ESLint.
    • A pretty complete E2E test suite is here, finally – see "A Note on E2E"
    • Lots of bug fixes, improvements, and refactorings!

    Upgrade Guide

    1. First, install or update yarn to the latest version with npm install -g yarn
    2. Add BROADCAST_DRIVER=log into .env
    3. Add IGNORE_DOT_FILES=true (or replace true with false if you want Koel to scan for hidden files and folders) into .env
    4. Clean Laravel's bootstrap/cache folder, for example rm -rf ./app/bootstrap/cache && mkdir ./app/bootstrap/cache
    5. Remove node_modules folder as well, to make sure there's no leftover thingies
    6. Now execute this series of commands from your installation folder
    git fetch
    git checkout v3.4.0
    composer install
    php artisan koel:init
    

    Downgrade Guide

    Just git checkout v3.3.1 && npm install to revert to the previous version.

    A Note on E2E

    This new version of Koel comes with an E2E test suite, which (hopefully) should help eliminate all those regressive UI bugs for good. In order to run these tests, though, you'll need to have Selenium, facebook/php-webdriver, and Chrome driver installed on your system and run your Selenium grid:

    java -jar -Dwebdriver.chrome.driver=/path/to/chromedriver selenium-server-standalone-3.0.1.jar
    

    Now you can execute the E2E test with yarn e2e and hope everything smoothly goes through.

    That's it! Till next release!

    Source code(tar.gz)
    Source code(zip)
Owner
Koel
Open-source music streaming software
Koel
Music typeset with the Lilypond system

Intro (from long ago) This repo contains sheet music typeset with the Lilypond typesetter. The music chosen is in favour of cello music (mostly chambe

Enthusiastic about  the Cello 95 Sep 24, 2021
网易云音乐第三方

ieaseMusic Elegant NeteaseMusic desktop app, Rock with NeteaseMusic ?? Built by Electron, React, MobX, JSS API 由 Binaryify/NeteaseCloudMusicApi 提供。 Pr

null 8.6k Sep 22, 2021
OpenSheetMusicDisplay renders sheet music in MusicXML format in your web browser based on VexFlow. OSMD is brought to you by PhonicScore.com.

OpenSheetMusicDisplay (OSMD) A MusicXML renderer for the Browser opensheetmusicdisplay.org About OSMD • Demo • Key Features • Limitations • How to Use

Open Sheet Music Display 806 Sep 24, 2021
A language for music notation

Lydown is a language and compiler for creating music scores, parts and snippets. The lydown code is compiled to lilypond code and then compiled to PDF

Sharon Rosner 21 Apr 8, 2021
🎵 Music notation engraving library for MEI with MusicXML and Humdrum support and various toolkits (JavaScript, Python)

Verovio is a fast, portable and lightweight library for engraving Music Encoding Initiative (MEI) digital scores into SVG images. Verovio also contain

RISM Digital Center 426 Sep 22, 2021
Streaming music player that finds free music for you

Desktop music player focused on streaming from free sources Links Official website Mastodon Twitter Support channel (Matrix): #nuclear:matrix.org Disc

null 6.8k Sep 17, 2021
Music player for deepin desktop environment.

deepin-music Deepin music is a local music player with beautiful design and simple functions developed by Deepin Technology. Dependencies Build depend

Wuhan Deepin Technology Co.,Ltd. 155 Sep 16, 2021
A music programming language for musicians. :notes:

Installation | Docs | Changelog | Contributing composers chatting Alda is a text-based programming language for music composition. It allows you to co

Alda 4.7k Sep 25, 2021
Mopidy is an extensible music server written in Python

Mopidy Mopidy is an extensible music server written in Python. Mopidy plays music from local disk, Spotify, SoundCloud, Google Play Music, and more. Y

Mopidy 7.2k Sep 17, 2021
music library manager and MusicBrainz tagger

beets Beets is the media library management system for obsessive music geeks. The purpose of beets is to get your music collection right once and for

beetbox 10.4k Sep 15, 2021
Frescobaldi LilyPond Editor

README for Frescobaldi Homepage: http://www.frescobaldi.org/ Main author: Wilbert Berendsen Frescobaldi is a LilyPond sheet music text editor. It aims

Frescobaldi 501 Sep 21, 2021
A Music programming language. Translates source code into MIDI. Includes a player. Supports MIDI-Karaoke. Includes a MIDI analyzer.

Get Started | Features | Screenshots | Programming | CLI | Contribute | License Midica is an interpreter for a Music Programming Language. It translat

Jan Trukenmüller 47 Sep 17, 2021
Lilypond music preprocessor

Ripple - DRY for Lilypond Ripple is a small program that helps you generate scores and parts without repeating yourself, performing complex includes o

Sharon Rosner 21 Mar 24, 2020
web based music sheet viewer (go, pdfjs) as a single binary

Digital Music Stand A simple cross-platform browser-based pdfjs-based viewer to display and search music sheets. A single binary including all assets.

Patrick Wieschollek 21 Aug 27, 2021
Collaborative Programmable Music

888 888 _ooooooooo._ 888 ,o888PP""""PP88

Overtone 5.2k Sep 24, 2021
The git repository of the advanced drum machine

Hydrogen drum machine Hydrogen is an advanced drum machine for GNU/Linux, Mac and Windows. It's main goal is to bring professional yet simple and intu

Hydrogen 702 Sep 15, 2021
Music player and music library manager for Linux, Windows, and macOS

Quod Libet: an audio library, manager & player Quod Libet is a cross-platform audio / music management program. It provides many ways to view your loc

Quod Libet 1k Sep 16, 2021
🎵 A simple, clean and cross-platform music player

Museeks A simple, clean and cross-platform music player. (museeks.io) Features Museeks aims to be a simple and easy to use music player with a clean U

Pierre de la Martinière 1.1k Sep 17, 2021
C++ library and Python bindings for the Music Encoding Initiative format

LibMEI LibMEI is a C++ library for reading and writing MEI files It is developed by the Distributed Digital Music Archives and Libraries Lab at the Sc

Distributed Digital Music Archives and Libraries Lab 49 Aug 30, 2021