ubuntuusers.de

MP3 Tags rekursiv mit Trenner Semikolon in .csv exportieren

Status: Ungelöst | Ubuntu-Version: Ubuntu 22.04 (Jammy Jellyfish)
Antworten |

weidenfeld-it

(Themenstarter)

Anmeldungsdatum:
14. April 2024

Beiträge: 8

Hallo,

Jetzt fühle ich mich nun ein wenig veralbert

Sorry, ja den Link hatte ich mir angesehen doch leider habe ich das nicht wirklich verstanden. Dein Script habe ich ausprobiert und es funktioniert hervorragend, vielen Dank dafür. Jetzt weiß ich außerdem das es sich lohnt wenn ich mich mit Python etwas eingehender beschäftige.

LG Karsten

shiro schrieb:

Suchen hilft manchmal.

Jetzt fühle ich mich nun ein wenig veralbert. Ich habe doch die URL angegeben. Hast du das nicht gelesen? Aber ok, wenn du gern ein "python" Script geliefert haben willst, statt es selbst zu schreiben, habe ich (wohl didaktisch unklug) es dir unten eingefügt:

#!/usr/bin/env python3
import csv
import datetime
from pathlib import Path

from mutagen.mp3 import MP3


def get_text(mp3, key, default=None):
    tag = mp3.get(key)
    if tag is None:
        return default
    #
    # Take the first value if there are multiple values, for instance because
    # the file has idv1 *and* idv2 tags.
    # 
    return tag.text[0] if isinstance(tag.text, list) else tag.text


def main():
    with open("test.csv", "w", encoding="utf-8", newline="") as csv_file:
        writer = csv.writer(csv_file, delimiter=";")
        writer.writerow(["Artist", "Album", "Track", "Title", "Dauer", "File"])
        for mp3_path in Path(".").rglob("*.mp3"):
            if mp3_path.is_file():
                audio=MP3(mp3_path)
                row = [
                    get_text(audio, key, "")
                    for key in ["TPE1", "TALB", "TRCK", "TIT2"]
                ]
                row.append(str(datetime.timedelta(seconds=round(audio.info.length))))
                row.append(str(mp3_path))
                writer.writerow(row)


if __name__ == "__main__":
    main()


Post Scriptum:
Ich habe leider wegen der "python" Variante die "id3v2" und "id3" Variante vergessen beizufügen, was hiermit erfolgen soll. Zuerst die "id3v2" Variante:

#!/bin/bash
id3v2 -R *.mp3 | 
awk -v HDR="TPE1,TALB,TRCK,TIT2,TLEN" 'BEGIN {
 nh=split(HDR,val,",")
 for (i in val){ahead[i]=val[i]}
}
function p(val,n){
 o=""
 for (i=1; i<=n; i++){
  o=o"\";\""val[i]
 }
 print substr(o,3)"\""
}
{
 if ( $0 == "" ){
  p(val,nh)
  delete val
 } else {
  n=split($0,arr,": ");arr[2]=substr($0,length(arr[1])+3);gsub("\"","\"\"",arr[2])
  for ( i in ahead ){
   if ( ahead[i] == arr[1] ){
    if ( arr[1] == "TLEN" ) {
     m=int(arr[2]/60000);s=arr[2]/1000-m*60;val[i]=sprintf("%02d:%02d",m,s);
    } else {
     val[i]=arr[2];
    }
   }
  }
 }
}'

und nun die "id3" Variante:

id3 -q '"%a";"%l";"%n";"%t";%{TLEN};"%f"' *.mp3 | awk -F";" -v OFS=";" '{m=int($5/60000);s=$5/1000-m*60;$5=sprintf("%02d:%02d",m,s);print}'
Antworten |