Tag-Dateinamen-Konverter Formatierung

Für den Tag-Dateinamen-Konverter habe ich folgende Formatierung, die wunschgemäß funktioniert:
Es sollen nur dann %year% und %band% im Verzeichnisnamen erscheinen, wenn die Felder nicht leer sind. Außerdem wird eine Längenbegrenzung bewirkt.
...[$left(%year%,4) - ]$left(%album%,40)[$left( ¤ %band%,40)]$num(%track%,2). %title%

Nun möchte ich dies etwas eleganter haben: Wenn auf %album% kein %band% folgt, sollen für %album% 80 Zeichen reserviert werden.

Das müsste doch mit $leql(x,y) [liefert Wahr, wenn x kleiner gleich y ist] oder ähnlichen Bedingungen machbar sein. Ich weiss nicht, wie ich das verschachteln muss. Meine ersten Versuche sind fehlgeschlagen. Hat jemand eine Antwort?

...[$left(%year%,4) - ]$left(%album%,$if($and(%album%,%band%),40,80))[$left( ¤ %band%,40)]$num(%track%,2). %title%

DD.20090315.2125.CET

Vielen, vielen Dank für die Formel. Klappt einwandfrei. Perfekt! Das ganze hat auch den Sinn, die maximale Pfadlänge von 255 Zeichen nicht durch unbedachte Tag-Eintäge zu überschreiten. Ich habe die Zahlen für das Album-Verzeichnis etwas angepasst:

...$left(%album%,$if($and(%album%,%band%),62,102))[$left( ¤ %band%,40)]...

Und mir die Logik durch die folgende Schreibweise etwas verdeutlicht:

$left(%album%, //das Verzeichnis für %album% ...
$if //wenn

  ($and(%album%,%band%)        //ergibt wahr, wenn %album% UND %band% Inhalt haben

,62,102)) //wenn wahr 62 Zeichen, sonst 102
[$left( ¤ %band%,40)] //nur wenn %band% Inhalt hat, wird es mit der Länge 40 angefügt.

                               //Zusammen sind es immer 102 bis 105 Zeichen

Bei dem Versuch den Dateinamen ähnlich zu gestalten bin ich allerdings gescheitert:
%title%[; mit %lyricist%][; Dir. %conductor%]
Wenn entweder %lyricist% oder %conductor% vorhanden sind, sollen für %title% nur 38 Zeichen zur Verfügung stehen, sonst 56 Zeichen.
Kurzform sinngemäß: if ( (ti AND (ly OR co)) ) then 38 Z else 56 Z

Mein Ansatz sieht so aus:

$left(%title%,

$if                                   //wenn
   ($and(%title%,(                   //einerseits ist wahr, wenn %title% UND
   $or(%lyricist%,%conductor%)       //andererseits ist wahr, wenn %ly% ODER %co% Inhalt haben
   ))                                 
38,56))                               //dann, sonst

[; mit %lyricist%][; Dir. %conductor%]

bzw. in einer Zeile:
$left(%title%,$if($and(%title%,($or(%lyricist%,%conductor%)))38,56))[; mit %lyricist%][; Dir. %conductor%]

Das Ganze ist wohl syntaxtisch richtig, aber die Bedingung ist offensichtlich falsch, weil NIE %title% ausgegeben wird. Erkennt jemand meinen Fehler?

Prima, das höre ich gern!

Ohne mich jetzt zu tief in das Beispiel einzuarbeiten ... zunächst etwas Prinzipielles:
Du willst ein "entweder-oder" realisieren und das ist etwas anderes als ein einfaches "oder".

Eine "oder"-Relation ist immer dann wahr, wenn einer der beiden Operanden "wahr" ist, unabhängig vom Wert des anderen Operanden, der "wahr" oder "falsch" sein kann, also ein "sowohl-als auch". Dementsprechend kann man die Mp3tag Skript Funktion $OR(a,b) benutzen.

Bei einer "entweder-oder" Relation kann bzw. darf immer nur einer der beiden Operanden "wahr" sein, der andere muss dann "falsch" sein. Man nennt das "Exklusives Oder" (XOR).

In der Mp3tag Skriptsprache gibt es eine vordefinierte Funktion $XOR(a,b) nicht, deshalb muss man sich aus den vorhandenen 'Booleschen Funktionen' eine XOR-Schaltung zusammenbauen:
$XOR(a,b) = $OR($AND($NOT(a),b),$AND($NOT(b),a))

Für dein Beispiel sieht die Logik so aus:
$OR($AND($NOT(%lyricist%),%conductor%),$AND($NOT(%conductor%),%lyricist%))

DD.20090319.0100.CET

Hallo,

vor der 38 fehlt ein Komma, also

$left(%title%,$if($and(%title%,($or(%lyricist%,%conductor%))),38,56))[; mit %lyricist%][; Dir. %conductor%]

Könnte das die Ursache sein?

mfG
gnor

Vielen Dank für die große Mühe. Ich habe meine Beschreibung wohl nicht ausführlich genug dargestellt. Ich wollte keine Exclusiv-Oder-Funktion. Immerhin hat Dein Beispiel mich dazu gebracht, mit ausführlich mit den Boolesche Funktionen zu beschäftigen. Deine Exclusiv-Oder-Funktion werde ich bestimmt noch woanders benötigen.

Die Lösung war doch ein Syntaxfehler; ich habe an der falschen Stelle gesucht.
Richtig:
$left(%title%,$if($and(%title%,($or(%lyricist%,%conductor%))),38,56))[; mit %lyricist%][; Dir. %conductor%]
Falsch:
$left(%title%,$if($and(%title%,($or(%lyricist%,%conductor%)))38,56))[; mit %lyricist%][; Dir. %conductor%]
Hinweis:
Es fehlte ein Komma!

Ich möchte

  1. verhindern, die 255er-Pfadlänge zu überschreiten und
  2. den Dateinamen auf 60 Zeichen begrenzen (wg. CD-Brennen)
    Insgesamt sieht das dann so aus: ... $left(%artist%,50)[$left(%year%,4) - ]$left(%album%,$if($and(%album%,%band%),62,102))[$left( ¤ %band%,40)]$left($num(%track%,2). $left(%title%,$if($and(%title%,($or(%lyricist%,%conductor%))),38,56))[; mit %lyricist%][; Dir. %conductor%],60)

Du hast Recht. Vielen, vielen Dank für die Formel. Klappt einwandfrei. Perfekt!

Weiss jemand eine andere Möglichkeit bei WinXP die maximale Pfadlänge einzuhalten?