Radio streamer (kawa drop-in compatible) https://radio.animebits.moe/player/hash/5ff661960216
Go to file
DataHoarder 7f8274f431
All checks were successful
continuous-integration/drone/push Build is passing
Implemented timeouts, audio sample buffers, and fast-start depending on client
2022-03-03 15:00:34 +01:00
.drone.yml Added proper queue system 2022-03-02 18:54:56 +01:00
.gitignore Initial commit, WiP 2022-03-02 00:31:29 +01:00
config.go Implemented timeouts, audio sample buffers, and fast-start depending on client 2022-03-03 15:00:34 +01:00
Dockerfile Added Dockerfile 2022-03-02 19:11:12 +01:00
example_config.toml Implemented timeouts, audio sample buffers, and fast-start depending on client 2022-03-03 15:00:34 +01:00
go.mod Implemented timeouts, audio sample buffers, and fast-start depending on client 2022-03-03 15:00:34 +01:00
go.sum Implemented timeouts, audio sample buffers, and fast-start depending on client 2022-03-03 15:00:34 +01:00
LICENSE Initial commit, WiP 2022-03-02 00:31:29 +01:00
listener.go Implemented timeouts, audio sample buffers, and fast-start depending on client 2022-03-03 15:00:34 +01:00
MeteorLight.go Implemented timeouts, audio sample buffers, and fast-start depending on client 2022-03-03 15:00:34 +01:00
mount.go Implemented timeouts, audio sample buffers, and fast-start depending on client 2022-03-03 15:00:34 +01:00
queue.go Implemented timeouts, audio sample buffers, and fast-start depending on client 2022-03-03 15:00:34 +01:00
README.md Implemented timeouts, audio sample buffers, and fast-start depending on client 2022-03-03 15:00:34 +01:00
utilities.go Initial commit, WiP 2022-03-02 00:31:29 +01:00

MeteorLight

Radio streamer (kawa drop-in compatible).

This project is a Work in Progress.

TODO: ICY metadata

Improvements / differences from Kawa

  • Does not use libav (see supported formats/codecs on Kirika)
  • No Vorbis support.
  • Supports HTTP clients that have more than 16 HTTP request headers.
  • Does not restart stream per-track, instead being a continuous stream without parameter changes.
  • Normalized channels / sample rates for mounts.
  • Implements ICY metadata
  • Uses sample/timed packet buffers, instead of kawa byte buffers, which caused wild differences between endpoints. Mounts usually align within 0.2s of each other, depending on client.
    • Use queue.buffer_size to specify number of seconds to buffer
  • Implements queue.nr and /random (To be Deprecated/Changed)

Future improvements

  • Allow playback of files by URL, not just by path
  • Implement precise timing information side-channel

Dependencies

Go >= 1.18

Kirika dependencies

Kirika is a collection of audio utilities for decoding/encoding files and streams.

Check its native dependencies that must be installed before usage.

Usage

Start by copying example_config.toml to the location of your choice and reading through it. Of importance are queue.fallback, and queue.random_song_api.

MeteorLight will search for config.toml in its working directory. Alternatively you can pass -config "/example/path/config.toml" to specify a different location.

Batteries are not included - MeteorLight needs to be paired with your own software to find songs to stream. You will have to provide an external API that MeteorLight can query for songs to play and notify as new songs being played.

Before continuing, you will need to install the dependencies listed above.

From Git repository

$ git clone https://git.gammaspectra.live/S.O.N.G/MeteorLight.git && cd MeteorLight
# create/edit config.toml
$ go run . 

From Go run

$ go run git.gammaspectra.live/S.O.N.G/MeteorLight@<commit_hash>

From Docker/Podman

$ docker build -t meteorlight .
$ docker run --rm -it -v "$(pwd)/config.toml:/config.toml:ro" -v "$(pwd)/fallback.flac:/fallback.flac:ro" -p 8001:8001 -p 127.0.0.1:4040:4040 meteorlight

API

See kawa API for a general overview. Additional endpoints or changed ones are listed below.

Track blobs returned have a queue_id parameter, regardless of source.

NEW DELETE /queue/<queue_id>

Unqueues the track with queue_id specified as a parameter.

Response

{
    "success": true,
    "reason": null
}

CHANGED POST /queue/head

Same as kawa's, but queue_id is added to response directly.

Response

{
    "success": true,
    "reason": null,
    "queue_id": 3
}

CHANGED POST /queue/tail

Same as kawa's, but queue_id is added to response directly.

Response

{
    "success": true,
    "reason": null,
    "queue_id": 5
}