Koel is a simple web-based personal audio streaming service written in Vue and Laravel

Last update: Jun 27, 2022

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.

GitHub

https://github.com/koel/koel
Comments
  • 1. Handle compilation albums properly

    This issue replaces similar others like #764, #980, and #1333. Basically, the way Koel handles compilation albums could be improved (referring to https://github.com/koel/koel/pull/764#issuecomment-475105655):

    • A compilation album can/should have an overall "album artist," but each of the songs may or may not be performed by that artist or another.
    • Each of these artists (along with the album artist) should be treated equally: shown and searchable, with corresponding songs. However, the album should be treated as one single album.
    • A song can have an albumartist tag that should take precedence over artist
    • A song that has different albumartist and artist values should be considered belonging to a compilation
    Reviewed by phanan at 2022-06-26 16:07
  • 2. chore(deps): bump guzzlehttp/guzzle from 7.4.1 to 7.4.5

    Bumps guzzlehttp/guzzle from 7.4.1 to 7.4.5.

    Release notes

    Sourced from guzzlehttp/guzzle's releases.

    Release 7.4.5

    See change log for changes.

    Release 7.4.4

    See change log for changes.

    Release 7.4.3

    See change log for changes.

    Release 7.4.2

    See change log for changes.

    Changelog

    Sourced from guzzlehttp/guzzle's changelog.

    7.4.5 - 2022-06-20

    • Fix change in port should be considered a change in origin
    • Fix CURLOPT_HTTPAUTH option not cleared on change of origin

    7.4.4 - 2022-06-09

    • Fix failure to strip Authorization header on HTTP downgrade
    • Fix failure to strip the Cookie header on change in host or HTTP downgrade

    7.4.3 - 2022-05-25

    • Fix cross-domain cookie leakage

    7.4.2 - 2022-03-20

    Fixed

    • Remove curl auth on cross-domain redirects to align with the Authorization HTTP header
    • Reject non-HTTP schemes in StreamHandler
    • Set a default ssl.peer_name context in StreamHandler to allow force_ip_resolve
    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.

    Reviewed by dependabot[bot] at 2022-06-21 17:11
  • 3. Add env TRANSCODE_FLAC (default true) to toggle transcoding on/off for FLAC files

    It seems there were some attempts at making this work before but apparently they weren't done the right way or something.

    The following request was closed as stale: https://github.com/koel/koel/pull/527

    The following request was denied due to confusing label and wrong approach (?) https://github.com/koel/koel/pull/699


    The only changes are: new config variable koel.streaming.transcode_flac that pulls data from TRANSCODE_FLAC env var and defaults to true in config/koel.php file and extended bool check in app/Services/TranscodingService.php file. Full diff here.

    The default behavior is the same as before but now you can turn off transcoding simply by setting env variable.

    I built the Docker image with my changes here: https://hub.docker.com/r/coust/koel

    Reviewed by MaciejGorczyca at 2022-06-11 20:44
  • 4. chore(deps): bump eventsource from 1.0.7 to 1.1.1

    Bumps eventsource from 1.0.7 to 1.1.1.

    Changelog

    Sourced from eventsource's changelog.

    1.1.1

    • Do not include authorization and cookie headers on redirect to different origin (#273 Espen Hovlandsdal)

    1.1.0

    • Improve performance for large messages across many chunks (#130 Trent Willis)
    • Add createConnection option for http or https requests (#120 Vasily Lavrov)
    • Support HTTP 302 redirects (#116 Ryan Bonte)
    • Prevent sequential errors from attempting multiple reconnections (#125 David Patty)
    • Add new to correct test (#111 Stéphane Alnet)
    • Fix reconnections attempts now happen more than once (#136 Icy Fish)
    Commits
    • aa7a408 1.1.1
    • 56d489e chore: rebuild polyfill
    • 4a951e5 docs: update history for 1.1.1
    • f9f6416 fix: strip sensitive headers on redirect to different origin
    • 9dd0687 1.1.0
    • 49497ba Update history for 1.1.0 (#146)
    • 3a38537 Update history for #136
    • 46fe04e Merge pull request #136 from icy-fish/master
    • 9a4190f Fix issue: reconnection only happends for 1 time after connection drops
    • 61e1b19 test: destroy both proxied request and response on close
    • 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.

    Reviewed by dependabot[bot] at 2022-06-01 01:28
  • 5. Koel Sync error - SQLSTATE[HY000]: General error: 1 no such table: info

    I am trying to sync media via the command link using php artisan koel:sync and I keep getting the below error. Although I get the below error, music does appear after 5-10 mins in Koel.

    
      at vendor/teamtnt/tntsearch/src/TNTSearch.php:399
        395▕ 
        396▕     public function getValueFromInfoTable($value)
        397▕     {
        398▕         $query = "SELECT * FROM info WHERE key = '$value'";
      ➜ 399▕         $docs  = $this->index->query($query);
        400▕ 
        401▕         if ($ret = $docs->fetch(PDO::FETCH_ASSOC)) {
        402▕             return $ret['value'];
        403▕         }
    
      +20 vendor frames 
      21  app/Services/FileSynchronizer.php:198
          Illuminate\Database\Eloquent\Model::__callStatic()
    
     22  app/Services/MediaSyncService.php:95
          App\Services\FileSynchronizer::sync()
    

    To reproduce Steps to reproduce the behavior:

    1. docker exec --user www-data -it koel bash
    2. php artisan koel:sync

    Expected behavior Sync Music to Koel Server without error

    Screenshots Screenshot

    Environment

    DOCKER Docker version 19.03.13, build 4484c46d9d

    Ansible deploys the containers - main config for each below

    KOEL

    docker_container:
        name: koel
        image: "phanan/koel:latest"
        pull: yes
        published_ports:
          - "127.0.0.1:800:80"
        env:
          BACKUP: "no"
          FORCE_HTTPS : "true"
          DB_CONNECTION: "mysql"
          DB_HOST : "mysql"
          DB_USERNAME : "koel"
          DB_PASSWORD : "samplePW"
          DB_DATABASE : "koel"
          PUID: "{{ uid }}"
          PGID: "{{ gid }}"
          UMASK: 002
          VIRTUAL_HOST: "koel.{{ user.domain }}"
          VIRTUAL_PORT: 80
          LETSENCRYPT_HOST: "koel.{{ user.domain }}"
          LETSENCRYPT_EMAIL: "{{ user.email }}"
          TZ: "{{ tz }}"
        volumes: "{{ default_volumes }}"
        labels:
         "com.github.cloudbox.cloudbox_managed": "true"
       networks:
          - name: koelnetwork
            aliases:
            - koel
    

    MYSQL

    docker_container:
        name: mysql
        image: "mysql"
        pull: yes
        env:
          TZ: "{{ tz }}"
          PUID: "{{ uid }}"
          PGID: "{{ gid }}"
          LOG_LEVEL: DEBUG
          MYSQL_DATABASE : "koel"
          MYSQL_USER : "koel"
          MYSQL_PASSWORD : "samplePW"
          MYSQL_ROOT_PASSWORD: "samplePW"
        volumes:
          - /opt/mysql/data:/var/lib/mysql
        labels:
          "com.github.cloudbox.cloudbox_managed": "true"
        networks:
          - name: koelnetwork
            aliases:
              - mysql
    

    RClone Mount - Config

    [Unit]
    Description=Rclone VFS dibdab-t-en-01 Mount
    After=network-online.target
    
    [Service]
    User=serveruser
    Group=serveruser
    Type=notify
    ExecStartPre=/bin/sleep 10
    ExecStart=/usr/bin/rclone mount \
      --user-agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36' \
      --config=/home/serveruser/.config/rclone/rclone.conf \
      --allow-other \
      --allow-non-empty \
      --drive-skip-gdocs \
      --vfs-read-chunk-size=64M \
      --vfs-read-chunk-size-limit=2048M \
      --buffer-size=64M \
      --poll-interval=1m \
      --dir-cache-time=168h \
      --timeout=10m \
      --drive-chunk-size=64M \
      --vfs-cache-mode=writes \
      --umask=002 \
      --syslog \
      --use-mmap \
      -v \
      koel-music: /mnt/remote/koel
    ExecStop=/bin/fusermount -uz /mnt/remote/koel
    Restart=on-abort
    RestartSec=5
    StartLimitInterval=60s
    StartLimitBurst=3
    
    [Install]
    WantedBy=default.target
    

    Additional context Add any other context about the problem here.

    Reviewed by ch1nch4ch4 at 2022-05-20 10:28
  • 6. chore(deps): bump async from 2.6.3 to 2.6.4

    Bumps async from 2.6.3 to 2.6.4.

    Changelog

    Sourced from async's changelog.

    v2.6.4

    • Fix potential prototype pollution exploit (#1828)
    Commits
    Maintainer changes

    This version was pushed to npm by hargasinski, a new releaser for async since your current version.


    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.

    Reviewed by dependabot[bot] at 2022-05-16 17:02
A simple tool that I share with you. This tool serves to make conversions from text to audio Google Translate.

A simple tool that I share with you. This tool serves to make conversions from text to audio Google Translate. You can download this conversion 100% for free. Good luck.

Oct 25, 2021
PHP web based Password Manager for business and personal use.

sysPass - Systems Password Manager Join us in the Gitter chat room: PHP web based Password Manager for business and personal use. AES-256 encryption i

Jun 22, 2022
mini Project in Laravel and vue js. Real World Laravel 8x + vue js Dashboard.Task management and project management system
mini Project in Laravel and vue js. Real World Laravel 8x + vue js Dashboard.Task management and project management system

mini Project in Laravel and vue js. Real World Laravel 8x + vue js Dashboard.Task management and project management system. Dashboard features such as: Complete Dashboard, Custom Authentication, Email Verification, custom-login-register-forgot password (without jetstream).

Nov 27, 2021
My personal blog - written in Gatsby

Gatsby's blog starter Kick off your project with this blog boilerplate. This starter ships with the main Gatsby configuration files you might need to

Jan 8, 2022
Online All in One Video & Audio Downloader From YouTube,Facebook,Twitter,Pinterest,Instagram,MXtakatak,IPL, Tiktok and 1000+ More Sites too

DLhut Contact me If You Find ANy Bug ... PHP Search and Download any Videos from any site. Online All in One Video & Audio Downloader From YouTube,Fac

Oct 11, 2021
Online All in One PHP Video & Audio Downloader From YouTube,Facebook,Twitter,Pinterest,Instagram,MXtakatak,IPL, Tiktok and 1000+ More Sites too

DLhut Contact me If You Find ANy Bug ... PHP Search and Download any Videos from any site. Online All in One Video & Audio Downloader From YouTube,Fac

Nov 8, 2021
🗨️ Nextcloud Talk – chat, video & audio calls for Nextcloud
🗨️ Nextcloud Talk – chat, video & audio calls for Nextcloud

Nextcloud Talk A video & audio conferencing app for Nextcloud Why is this so awesome? ?? Chat Nextcloud Talk comes with a simple text chat, allowing y

Jul 1, 2022
This is a personal portfolio and blog project based on Laravel 5.1.

nahid.co [Laravel 5.1] This is my personal blog project develop with latest Laravel version 5.1. Its opensource for students learning purpose. Install

May 1, 2022
PHP backend Scripts to add and Manage Live tv Streaming android app
PHP backend Scripts to add and Manage Live tv Streaming android app

PHP Backend to Manage Live TV Streaming Android app Follow Given Steps to Setup Local Environment to run this php Script Setting Up Local Environment

May 10, 2022
This app aims to benchmark several video/live streaming OTT platforms
This app aims to benchmark several video/live streaming OTT platforms

video-platform-bench This app aims to benchmark several video/live streaming OTT platforms based on Encoding Time performance and provide also a "Time

Dec 17, 2021
Streaming de música que possui as seguintes características: Registrar a sua música, Sistema de pesquisa, Adicionar uma lista de reprodução, Perfil, Atualizar, Total de visualizações, Últimos vistos entre outros ...
Streaming de música que possui as seguintes características: Registrar a sua música, Sistema de pesquisa, Adicionar uma lista de reprodução, Perfil, Atualizar, Total de visualizações, Últimos vistos entre outros ...

Music Streaming Sobre o Projeto Fala Devs! Estou trazendo aqui um streaming de música que possui as seguintes funcionalidades: Registrar a sua música,

May 25, 2022
Pico disk, Not need any database, support html5, support mp3, mp4, support streaming media, support AriaNg
Pico disk, Not need any database, support html5, support mp3, mp4, support streaming media, support AriaNg

Nano netdisk, Now changed to pico disk. Pico disk,does not need any database, support html5, support mp3, mp4, support streaming media, support AriaNg.

Jun 25, 2022
Bolt is a simple CMS written in PHP. It is based on Silex and Symfony components, uses Twig and either SQLite, MySQL or PostgreSQL.

⚠️ Note - Not the latest version This is the repository for Bolt 3. Please know that Bolt 5 has been released. If you are starting a new project, plea

Jun 22, 2022
Open Source Point of Sale is a web based point of sale application written in PHP using CodeIgniter framework.

Open Source Point of Sale is a web based point of sale application written in PHP using CodeIgniter framework. It uses MySQL as the data back end and has a Bootstrap 3 based user interface.

Jun 26, 2022
Web based groupware server written in PHP
Web based groupware server written in PHP

EGroupware Tools Usage runs unit-tests after each commit scrutinizer runs static analysis on our codebase manual testing with unusual browser versions

Jun 21, 2022
TinyFileManager is web based file manager and it is a simple, fast and small file manager with a single file, multi-language ready web application
TinyFileManager is web based file manager and it is a simple, fast and small file manager with a single file, multi-language ready web application

TinyFileManager is web based file manager and it is a simple, fast and small file manager with a single file, multi-language ready web application for storing, uploading, editing and managing files and folders online via web browser. The Application runs on PHP 5.5+, It allows the creation of multiple users and each user can have its own directory and a build-in support for managing text files with cloud9 IDE and it supports syntax highlighting for over 150+ languages and over 35+ themes.

Jul 2, 2022
Online personal and group chat application using HTML, CSS, JS, PHP,SQL and AJAX that allows users to create own groups, chat
Online personal and group chat application using HTML, CSS, JS, PHP,SQL and AJAX that allows users to create own groups, chat

Online personal and group chat application using HTML, CSS, JS, PHP,SQL and AJAX that allows users to create own groups, chat, make friends, check new notifications and edit functionality. Chat automatically updates using AJAX to allow for real-time chatting with other users collected from the database.

May 28, 2022
A mini social media like web app built using Laravel 8 & Vue JS 3

About Laravel Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experie

Feb 1, 2022
Personal Knowledge Management. Use branch "minimal change" to deploy as laravel package.

Knowfox Knowfox is my Personal Knowledge Management system. Having been an keen Evernote user since 2012, I finally got around to taking my precious n

May 31, 2022