# Musik und Figuren (Work in Progress)

## Musik

Etwas unpraktisch ist, dass die Ordner/Dateinamen nur aus fortlaufend numerierten 2/3 stelligen Ziffern bestehen sollen. Die Erweiterung dieser Benennung ist sehr fehleranfällig.

Anbei ein Python-Skript, dass alle Ordner und Dateien in einen temporären Ordner kopiert und in das SD-Karten kompatible Format umbenennt . Damit kann mann den SD-Karten Inhalt am PC mit langen Dateinamen verwalten und bei Bedarf einfach einen Export für den Tonuino generieren.

```python
"""
Developed and tested under Linux. Should work in Windows as well.

Use this script to export an arbitrary named mp3 folder structure to Tonuino SD-card.
Requirements to mp3 folder structure:
    - requires "advert" and "mp3" folder for sd card
    - maximal directory depth 1, i.e. no subfolders
All not mp3 files are ignored for the export.

Basic usage:
-------------

$ python to_tonuino.py

Plan for copying files:
	/home/user/data/unterhaltung/musik/tonuino_sdCard/250424_dev/01_party/aSong.mp3 -> /tmp/250502-1901_tonuino_sdCard_952_zqjt/01/001.mp3
	/home/user/data/unterhaltung/musik/tonuino_sdCard/250424_dev/01_party/bSong.mp3 -> /tmp/250502-1901_tonuino_sdCard_952_zqjt/01/002.mp3
	/home/user/data/unterhaltung/musik/tonuino_sdCard/250424_dev/02_ambiente/ambiente1.mp3 -> /tmp/250502-1901_tonuino_sdCard_952_zqjt/02/001.mp3
	/home/user/data/unterhaltung/musik/tonuino_sdCard/250424_dev/02_ambiente/ambiente2.mp3 -> /tmp/250502-1901_tonuino_sdCard_952_zqjt/02/002.mp3
	/home/user/data/unterhaltung/musik/tonuino_sdCard/250424_dev/advert -> /tmp/250502-1901_tonuino_sdCard_952_zqjt/advert
	/home/user/data/unterhaltung/musik/tonuino_sdCard/250424_dev/mp3 -> /tmp/250502-1901_tonuino_sdCard_952_zqjt/mp3

Playlist:
01: 01_party
	001.mp3: aSong.mp3
	002.mp3: bSong.mp3
02: 02_ambiente
	001.mp3: ambiente1.mp3
	002.mp3: ambiente2.mp3

Copying files ...
Finished copying files to /tmp/250502-1901_tonuino_sdCard_952_zqjt


Advanced usage with command line arguments:
-------------------------------------------

For testing call as:
$ python to_tonuino.py /run/media/user/EAGET --test
where /run/media/user/EAGET is your sdCard export-folder.

If you like the generated copy plan, use
$ python to_tonuino.py /run/media/user/EAGET
for actual export.
"""

import os
import shutil
from pathlib import Path
import tempfile
from typing import List, Tuple
from datetime import datetime
import argparse


SKIP_DIRS = ["advert", "mp3"]


def build_mp3_copy_plan(source_dir: Path, target_dir: Path, skip_dirs: List[str]) -> List[Tuple[Path, Path]]:
    plan = []
    # dirs = [item for item in source_dir.iterdir() if item.is_dir()]
    dirs = sorted([item for item in source_dir.iterdir() if item.is_dir()])
    for dd, dir in enumerate(dirs):
        if dir.name in skip_dirs:
            continue
        fns = sorted(dir.glob('*.mp3'))
        for ff, fn in enumerate(fns):
            fp_from = dir / fn
            fp_to = target_dir / f"{dd+1:02}" / f"{ff+1:03}.mp3"
            plan.append((fp_from, fp_to))
    return plan

def print_playlist(plan: List[Tuple[Path, Path]]):

    playlist = ""
    dir_to_prev = None;
    for fp_from, fp_to in plan:
        if dir_to_prev != fp_to.parent.name:
            dir_to_prev = fp_to.parent.name
            playlist += f"{fp_to.parent.name}: {fp_from.parent.name}\n"
        playlist += f"\t{fp_to.name}: {fp_from.name}\n"
    return playlist[:-1]




if __name__ == "__main__":

    parser = argparse.ArgumentParser(description="Process an optional filepath.")
    parser.add_argument(
        "target_dir",
        nargs="?",
        type=str,
        default=None,  # default value if not provided
        help="Where to export sd Card content to."
    )
    parser.add_argument(
        "--test",  # Flag name
        action="store_true",  # Action to take (sets it to True if present)
        help="If testmode: do not copy any files and do not create any folders."
    )
    args = parser.parse_args()
    target_dir = args.target_dir
    mode_test = args.test



    skip_dirs = SKIP_DIRS
    source_dir = Path.cwd()
    if target_dir is None:
        target_dir = tempfile.mkdtemp(prefix=f"{datetime.now().strftime('%y%m%d-%H%M')}_tonuino_sdCard_")
    target_dir = Path(target_dir)
    plan = build_mp3_copy_plan(source_dir, target_dir, skip_dirs=skip_dirs)

    print("\nPlan for copying files:")
    for fp_src, fp_dst in plan:
        print(f"\t{fp_src} -> {fp_dst}")
    for dir in skip_dirs:
        print(f"\t{source_dir/dir} -> {target_dir/dir}")

    playlist = print_playlist(plan)
    print(f"\nPlaylist:\n{playlist}")

    if mode_test:
        print("\n" + "Test mode on: no copying of files".center(50, "=") + "\n")
        exit(0)

    print("\nCopying files ...")
    for dir in skip_dirs:
        shutil.copytree(source_dir / dir, target_dir / dir)
    for fp_src, fp_dst in plan:
        os.makedirs(os.path.dirname(fp_dst), exist_ok=True)
        shutil.copy2(fp_src, fp_dst)
    print(f"Finished copying files to {target_dir}")
```

## Figuren

Der Tonuino akzeptiert Tags in verschiedenen Formaten. Ich persönlich habe schon getestet: NATG215 und MIFARE Classic 1K. Ein paar Ideen, um Kindertaugliche Datenträger zu erstellen sind:

- RFID Karten mit schönen Aufklebern bekleben.
- RFID Coins (kleine nicht klebende Plättchen) kaufen und Spielfiguren (z.B. Ü-Ei) daraufkleben.
- RFID Aufkleber auf Spielzeug kleben, z.B. Duplo Männchen.
- Ntag 216 RFID Implantate (Achtung auf 13,56 MHz achten, nicht 13,... kHz), Größe ca. 12mm x 2mm in Plastiktiere mit Lötkolben einschmelzen.

Folgende Erfahrungen haben **WIR ALLE** mit den verschiedenen Konzepten gemacht. (Bitte tragt hier gerne eure Erfahrungen mit ein.

<table border="1" id="bkmrk-konzept-alter-kind-e" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 25%;"></col><col style="width: 25%;"></col><col style="width: 25%;"></col><col style="width: 25%;"></col></colgroup><tbody><tr><td>Konzept  
</td><td>Alter Kind  
</td><td>Erfahrung  
</td><td>Ansprechpartner  
</td></tr><tr><td>RFID Coins (kleine nicht klebende Plättchen) kaufen und Spielfiguren (z.B. Ü-Ei) daraufkleben.

</td><td>1 Jahr  
</td><td>Verschluckgefahr falls sich RFID Coin ablöst.  
</td><td>Markus Dutschke  
</td></tr><tr><td>RFID Aufkleber auf Spielzeug kleben, z.B. Duplo Männchen.

</td><td>  
</td><td>  
</td><td>  
</td></tr><tr><td>Ntag 216 RFID Implantate (Achtung auf 13,56 MHz achten, nicht 13,... kHz), Größe ca. 12mm x 2mm in Plastiktiere mit Lötkolben einschmelzen.

</td><td>  
</td><td>  
</td><td>  
</td></tr><tr><td>  
</td><td>  
</td><td>  
</td><td>  
</td></tr></tbody></table>