Music Set Scripting language
Find a file
2022-06-18 21:46:33 -04:00
bliss-rs@5d66e10423 Rename bliss-rs & limit bliss resource usage 2022-03-27 13:37:52 -04:00
extras Update root README to reflect recent improvements 2022-03-04 11:37:16 -05:00
mpris-player@2e843ec8d9 Create barebones music player for mps interpretor 2021-12-10 16:53:22 -05:00
mps-interpreter Add negation to like filter and improve string sanitisation (again) 2022-06-18 21:46:33 -04:00
mps-m3u8 Improve tag processing and filtering with ?? filter 2022-05-14 11:10:03 -04:00
mps-player Make MPD connection failure reporting less janky 2022-05-30 20:55:48 -04:00
src Add negation to like filter and improve string sanitisation (again) 2022-06-18 21:46:33 -04:00
tests Implement simple CLI for executing scripts 2022-01-02 20:20:09 -05:00
.gitignore Create initial language functionality and framework 2021-12-03 16:13:19 -05:00
.gitmodules Switch over to symphonia-based bliss to simplify compiling and dependency tree 2022-01-26 13:28:15 -05:00
Cargo.lock Add negation to like filter and improve string sanitisation (again) 2022-06-18 21:46:33 -04:00
Cargo.toml Add MPD support to front-end playback 2022-05-30 20:28:27 -04:00
LICENSE Create LICENSE 2022-01-01 04:30:05 +00:00
ngnius.mps.desktop Add desktop info/icon to OS controls (and leave hint for way to improve REPL UX, disabled because extensive and incomplete) 2022-01-16 21:00:00 -05:00
README.md Completely replace old interpreter with Faye and update docs 2022-03-27 11:50:59 -04:00
README.tpl Update licensing info 2022-01-31 16:37:24 -05:00

mps

repl_demo

Sort, filter and analyse your music to create great playlists. This project implements the interpreter (mps-interpreter), music player (mps-player), and CLI interface for MPS (root). The CLI interface includes a REPL for running scripts. The REPL interactive mode also provides more details about using MPS through the ?help command.

Usage

To access the REPL, simply run cargo run. You will need the Rust toolchain installed. For a bit of extra performance, run cargo run --release instead.

Examples

One-liners

All songs by artist <artist> (in your library), sorted by similarity to a random first song by the artist.

files().(artist? like "<artist>")~(shuffle)~(advanced bliss_next);

All songs with a .flac file extension (anywhere in their path -- not necessarily at the end).

files().(filename? like ".flac");

All songs by artist <artist1> or <artist2>, sorted by similarity to a random first song by either artist.

files().(artist? like "<artist1>" || artist? like "<artist2>")~(shuffle)~(advanced bliss_next);

Bigger examples

For now, check out ./src/tests, ./mps-player/tests, and ./mps-interpreter/tests for examples. One day I'll add pretty REPL example pictures and some script files... // TODO

FAQ

Can I use MPS right now?

Sure! It's not complete, but MPS is completely useable for basic music queries right now. Hopefully most of the bugs have been ironed out as well :)

Why write a new language?

I thought it would be fun. I also wanted to be able to play my music without having to be at the whim of someone else's algorithm (and music), and playing just by album or artist was getting boring. Designing a language specifically for iteration seemed like a cool & novel way of doing it, too (though every approach is a novel approach for me).

What is MPS?

Music Playlist Script (MPS) is technically a query language for music files. It uses an (auto-generated) SQLite3 database for SQL queries and can also directly query the filesystem. Queries can be modified by using filters, functions, and sorters built-in to MPS (see mps-interpreter's README.md).

Is MPS a scripting language?

Yes. It evolved from a simple query language into something that can do arbitrary calculations. Whether it's Turing-complete is still unproven, but it's powerful enough for what I want it to do.

License

LGPL-2.1-only OR GPL-3.0-only

NOTE: When advanced features are enabled, GPL-3.0 must be used.

Contribution

This is a hobby project, so any contribution may take a while to be acknowledged and accepted.