- Rust 99.1%
- Shell 0.9%
|
Le Calicot
e104db276f
All checks were successful
Cargo Build & Test / Rust project - latest (push) Successful in 2m57s
|
||
|---|---|---|
| .forgejo/workflows | [CI] Set up CI ( #41 ) | |
| .vscode | First Commit | |
| assets | [NIT] Update Readme ( #58 ) | |
| examples | [RELEASE] Version 1.1.0 | |
| scripts | [CI] Set up CI ( #41 ) | |
| src | [FIX] Fix compatibility issue with pipewire ( #59 ) | |
| tests | [TEST][EXAMPLE] | |
| .gitignore | [FEAT] Use eframe_template | |
| .gitlab-ci.yml | [FIX] Fix CI | |
| Cargo.lock | [VERSION] Hotfix 1.1.1 | |
| Cargo.toml | [VERSION] Hotfix 1.1.1 | |
| LICENSE-MIT | [FEAT] Use eframe_template | |
| README.md | [FIX] Fix compatibility issue with pipewire ( #59 ) | |
| saccamuse.code-workspace | [DEPS] Update all dependencies | |
Saccamuse
A social dance DJ software for song preview and library management
Background & Presentation
As a swing dance DJ (or any partner dance DJ), where beatmatching is not a consideration, there is a multitude of possible tools to sort and play music.
Personally, I have been using the following setup:
- A (linux) laptop + an external USB sound card
- A basic music player, which plays the songs for the dancefloor through the USB sound card. I have been using Clementine Music Player.
- A software which can display my database of all songs, with the ability to display tags, that I use to preview music live through the native soundcard of the laptop to the headphones, but also that I use to tag my music beforehand.
Historically, I was using TagSpaces to tag my music by saving the tags directly in the file names. The reasoning is that the support of ID3 tags varies a lot depending on the software. Some softwares supports custom fields, some don't and, therefore, has limited portability. Even though more limited, using tags encoded in filenames allows for emergency DJ sessions from a phone or USB key with any kind of music player. It's easy to synchronize among devices to create multiple backup of the music database (please, do backups!).
Unfortunately, starting from version 3.0, Tagspaces has started to have performances issues when manipulating a large number of tags. Therefore, I have decided to create my own app as a replacement. The tag file should still be compatible with Tagspaces.
Goals & Non-goals of Saccamuse
The main goals of Saccamuse are:
- Displaying list of audio files with Tagspaces-like tags, where the tags are highlighted with colors. It helps during live DJ session to find music fast.
- Allows listening to the song by opening the VLC player.
- Allows to create/edit tag groups and tags
- Allows to add/remove tags from audio files
- No metadata stored in a database, which means full portability
- Tags are stored in a JSON file (easy export)
Non-goals:
- Saccamuse is not meant to be a universal tagging and previewing system.
- There won't be any smartphone release
- No BPM detection (sorry!)
- Accessability features. This software is already so niche, it's hard to justify the work.
Optional goals if more people are interested in the project:
- Prettier UI and better UX
- Embedded music player (instead of VLC)
- Releases for MacOS & Windows
- Mass tagging / tagging multiple files at once.
Features
| ✅ | Filename-based tag system |
| ✅ | No database for full portability |
| ✅ | Enqueuing in external music player (selectable) |
| ✅ | Tag management system |
| ✅ | Filtering & sorting by BPM (manual input) or name |
| ✅ | Random playlist creation based on BPM |
| ✅ | Audio output selection |
Drawbacks
The main drawback of this approach is that if you modify the tags in the filename, any playlist containing this song will not be able to play. But, hey, you should never do the same set twice, so it shouldn't be an issue.
Since it doesn't use a database, all the information of all the files is scanned when starting the app. Since it uses Rust, it takes only a few seconds to parse about a thousands of files. Once started, it only updates modified files, so there is not performance issue once opened.
Installation
Download binary
Go to the release page and download the package from the latest release for your OS.
There is no release for MacOS as I don't have a mac and cross-compilation is hard. However, you can compile the software from source (seel below).
Install VLC player.
If using pipewire, you may have to install pulseaudio-utils.
Compile from source
Follow the instructions:
- Install rust on your computer
- Clone the repo
git clone https://codeberg.org/LeCalicot/saccamuse.git - Open a terminal and go to the folder
cd saccamuse - Compile the software:
cargo build --release - There should be a binary in
saccamuse/targetthat you can execute.
User Manual
Saccamus offers all the feature that I need, but the interface was not meant to be clear for external user.
Open Saccamuse by executing the binary. The configuration of the app will be stored in your home folder, in linux it's in /home/[user]/.config/saccamuse/
In the folder you will find the .json file with all your tags. This file is edited every time you add new tags to your collection.
Folder Selection
You are welcomed with the folder selection screen:
Saccamuse song folder selection
You can add the folder with your music through Select folder then Add folder to list, then
select the folder in the list.
You can click on Finish to open the app with the specified folder. You can have multiple instances
of Saccamuse open. We expect the music folder to have a flat structure, no sub-folders.
Remove folder from list is to remove a folder. Clean folders removes all the folders that do not
exist anymore.
You can also select the audio output. This will force VLC, used for previewing, to use this audio output such that you never open the song preview on the speakers of the dance floor.
You should specify the command used to enqueue songs into your favorite music player. For instance
clementine + append or exaile + (no extra argument).
Song view
This is the main interface of Saccamuse. It displays all the audio files in the folder. Saccamuse song view annotated
The way it works with the BPM is that Saccamuse assumes that the first tag with only a number is the BPM. It uses this information to filter the view or select N songs to add randomly to the music player when asked.
Saccamuse assumes that a file name is structured as follows:
Artist name - Song name[tag1 tag2].mp3
Tags cannot have space in them. We only display audio format, other files are ignored.
The Min and Max fields filter the view based on the BPM, while being sorted by name or BPM. On
top of that, you can randomize the filtered view.
The two main actions:
- Double clicking on the song name open VLC on the specified audio output
- Double clicking on one of the tag will open the tag editor for this song
Tag Editor
This is the windows where we can edit tags and the song name. Changes are applied when Save is clicked, the file name is then edited with the changes.
Saccamuse tag editor annotated
Here you can:
- Change the name of the song
- Create/delete tag groups in the tag database
- Create/delete tags in the tag database
- Rename a song / artist in the file name
- Add / move / remove a tag in the file
- Delete the song
All the changes are done in the filename, none of the ID3 tags (=mp3 metadata) are changed!. So even if you screw up the name, the actual data that are displayed in your music player will be unaffected.
If a tag is not part of tag group, it will be added to the Auto tag group, with the associated
colors.
The color of a tag is set automatically based on the group colors. If you want to change a specific
tag color, you can edit it directly in /home/[user]/.config/saccamuse/tags.json. You can also
delete the tag from the database and re-add it to another group. When "deleting" tags or groups, it
does not change the filename, only list of tags and groups in the json file. Therefore, even if you
lose the json file, you do not loose all the already tagged music.
The BPM group is just a group like any other. As described earlier, Saccamuse considers that
numerical tags are BPM tags.