Skip to content

Organize audio files for Arduino serial audio players

License

Notifications You must be signed in to change notification settings

thijstriemstra/music-sort

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

music-sort

Organize audio files and generate tracklists for Arduino serial audio players like the YX5300 and JQ6500-28P.

Supported players

Device SD-card filesystem Song prefix Folder structure Maximum folders Maximum songs per folder Reference
YX5300, YX6300 FAT16, FAT32 3 digit index, e.g. 001xxx.mp3 01, 02, etc 99 255 MD_YX5300 library
JQ6500-28P, JQ6500-16P FAT16, FAT32 3 digit index, e.g. 001.mp3 01, 02, etc 100 1000 Module docs, JQ6500_Serial library

Installation

Clone the repository and install using pip:

pip install -e .

You can now use the music-sort command, e.g:

music-sort --help

Usage

Let's say you have 3 folders with a couple of tracks you want to place on the SD-card. For example:

+-+- 1. The Lord Of The Rings- The Fellowship Of The Ring (OST)
  |   + 01 The Lord Of The Rings (Howard Shore) - The Prophecy.mp3
  |   + 02 The Lord Of The Rings (Howard Shore) - Concerning Hobbits.mp3
  |
  +- 2. The Lord Of The Rings- The Two Towers (OST)
  |   + 01 The Lord Of The Rings (Howard Shore) - Foundations of Stone.mp3
  |   + 02 The Lord Of The Rings (Howard Shore) - The Taming of Smeagol.mp3
  |   + 03 The Lord Of The Rings (Howard Shore) - The Riders of Rohan.mp3
  |
  +- 3. The Lord Of The Rings- The Return Of The King (OST)
      + 01 The Lord Of The Rings (Howard Shore) - A Storm Is Coming.mp3
      + 02 The Lord Of The Rings (Howard Shore) - Hope and Memory.mp3

Copy these 3 folders to a new directory, let's say /tmp/music/.

Now run music-sort and specify the --src and --dry-run option (allows you to preview and verify the changes):

music-sort --src=/tmp/music --dry-run

This should output something like:

2021-08-18 20:28:55,096 INFO - Found 3 directories in /tmp/music
2021-08-18 20:28:55,096 INFO -
2021-08-18 20:28:55,096 DEBUG - Directory: 1. The Lord Of The Rings- The Fellowship Of The Ring (OST)
2021-08-18 20:28:55,096 DEBUG - Processed: 001.mp3
2021-08-18 20:28:55,097 DEBUG - Processed: 002.mp3
2021-08-18 20:28:55,097 DEBUG - Renamed directory: 01
2021-08-18 20:28:55,097 DEBUG -
2021-08-18 20:28:55,097 DEBUG - Directory: 2. The Lord Of The Rings- The Two Towers (OST)
2021-08-18 20:28:55,097 DEBUG - Processed: 003.mp3
2021-08-18 20:28:55,097 DEBUG - Processed: 004.mp3
2021-08-18 20:28:55,097 DEBUG - Processed: 005.mp3
2021-08-18 20:28:55,097 DEBUG - Renamed directory: 02
2021-08-18 20:28:55,097 DEBUG -
2021-08-18 20:28:55,097 DEBUG - Directory: 3. The Lord Of The Rings- The Return Of The King (OST)
2021-08-18 20:28:55,097 DEBUG - Processed: 006.mp3
2021-08-18 20:28:55,097 DEBUG - Processed: 007.mp3
2021-08-18 20:28:55,097 DEBUG - Renamed directory: 03
2021-08-18 20:28:55,097 DEBUG -
2021-08-18 20:28:55,097 DEBUG - Updated include/TrackList.h:
2021-08-18 20:28:55,097 DEBUG -
#ifndef TrackList_h
#define TrackList_h

#include <vector>

// THIS FILE IS AUTO-GENERATED

struct TrackList {
  std::vector<String> folders = {
    "1. The Lord Of The Rings- The Fellowship Of The Ring (OST)",
    "2. The Lord Of The Rings- The Two Towers (OST)",
    "3. The Lord Of The Rings- The Return Of The King (OST)"
  };
  std::vector<String> tracks = {
    "01 The Lord Of The Rings (Howard Shore) - The Prophecy",
    "02 The Lord Of The Rings (Howard Shore) - Concerning Hobbits",
    "01 The Lord Of The Rings (Howard Shore) - Foundations of Stone",
    "02 The Lord Of The Rings (Howard Shore) - The Taming of Smeagol",
    "03 The Lord Of The Rings (Howard Shore) - The Riders of Rohan",
    "01 The Lord Of The Rings (Howard Shore) - A Storm Is Coming",
    "02 The Lord Of The Rings (Howard Shore) - Hope and Memory"
  };
};

#endif

The resulting TrackList.h contains unnecessary text that we don't want, like the first part of the:

  • folder name: 1. The Lord Of The Rings-
  • filename: 01 The Lord Of The Rings (Howard Shore) -

Use the --prefix-length-dir and --prefix-length-file options for this. The length of the prefix in the folder name (1. The Lord Of The Rings- ) is 26 and the length of the file name prefix (01 The Lord Of The Rings (Howard Shore) - ) is 42.

Run music-sort again with these new options:

music-sort --src=/tmp/music --dry-run --prefix-length-dir=26 --prefix-length-file=42

And the resulting tracklist:

#ifndef TrackList_h
#define TrackList_h

#include <vector>

// THIS FILE IS AUTO-GENERATED

struct TrackList {
  std::vector<String> folders = {
    "The Fellowship Of The Ring (OST)",
    "The Two Towers (OST)",
    "The Return Of The King (OST)"
  };
  std::vector<String> tracks = {
    "The Prophecy",
    "Concerning Hobbits",
    "Foundations of Stone",
    "The Taming of Smeagol",
    "The Riders of Rohan",
    "A Storm Is Coming",
    "Hope and Memory"
  };
};

#endif

When everything looks right, run music-sort without the --dry-run option to rename the files and folders and write the tracklist header file:

music-sort --src=/tmp/music --prefix-length-dir=26 --prefix-length-file=42

The resulting file tree:

+-+- 01
  |   + 001.mp3
  |   + 002.mp3
  |
  +- 02
  |   + 003.mp3
  |   + 004.mp3
  |   + 005.mp3
  |
  +- 03
      + 006.mp3
      + 007.mp3

This can be copied onto the SD-card and TrackList.h can be compiled into your project if you want to display track and album information.