Ich muss zugeben, tbone, deine Variante die countEntries Variable zu erstellen sieht um einiges eleganter aus als die meinige
Danke Kundal für die Anregung die foobarArguments auch in ne Variable zu packen. Hier wäre noch zu berücksichtigen, dass die Playlist direkt nach /add folgen muss und /immediate gerade beim Hinzufügen grosser Klassiksammlungen zu Sortierungsfehlern führen kann. Von daher lass ich /immediate lieber weg.
Hir nun auch mein fertiges Skript. Der Papierkorb kommt nicht zum Einsatz, stattdessen wird im multiplen SelectEx-Aufruf die Playlist "playlist.ucs2" geleert - beim einmaligen Aufruf von SelectEx ist das ja nicht nötig, da hier die playlist.ucs2 einfach überschrieben wird.
Weitere Plattenzugriffe werden eingespart indem nicht nach vorhandenen Playlisten gefragt sondern stattdessen die countEntries Variable verwendet wird. Sonst aber ist im Grunde alles ziemlich gleich bis auf paar Namensänderungen von Variablen und der anderen Handhabung des APPEND flag (nonanit^^, ich hab ja nur zamgebastelt, was tbone mir gegeben hat).
Code: Alles auswählen
@script JScript
var selections = "\\.(flac|ape|cue|mp3|mp4|m4a|alac|wma)$";
var foobarPath = "C:\\Programme (portable)\\+ ..... Audio & Video\\foobar2000\\foobar2000.exe";
var foobarArguments = "/add";
var playlistUTF8 = "%TEMP%\\playlist.m3u8";
var playlistUCS2 = "%TEMP%\\playlist.ucs2";
playlistUTF8 = DOpus.FSUtil.Resolve(playlistUTF8);
playlistUCS2 = DOpus.FSUtil.Resolve(playlistUCS2);
function OnClick( clickData ) {
var f = clickData.func, stab = f.sourcetab, cmd = f.command, countEntries = 0;
cmd.deselect = false;
function runSelectEx( cmd, path , append ) {
function countElements( elementStr, separator ) {
var elementStr = elementStr + '';
var separator = separator || '\r\n';
//.split() on empty array results in an array with length == 1
//so we test length on an empty array if string is empty
return ( elementStr===''?[]:elementStr.split(separator) ).length;
}
cmd.RunCommand('SelectEx FILES LINEAR PATH="'+path+'" RECURSE '
+'ITEMCOUNTPERC=100 TOFILE="'+playlistUCS2+'" SETVAR=SelectEx.Result NAME="'+selections+'" '
+'ENCODING=unicode '+append);
return countElements(stab.vars("SelectEx.Result").value);
}
if (stab.selected_dirs.count!=0) { //folders selected, execute SelectEx multiple times
var objFSO = new ActiveXObject("Scripting.FileSystemObject");
var zro = objFSO.OpenTextFile(playlistUCS2,2,true,0); zro.Close(); //delete content due to append
for(i=0;i<stab.selected_dirs.count;i++)
countEntries += runSelectEx(cmd, stab.selected_dirs(i).realpath, "APPEND");
} else { //just once for the current source path
countEntries = runSelectEx(cmd, stab.path, "");
}
if (countEntries > 0) {
//transcode ucs2-le to utf-8 and run foobar
var objFSO = new ActiveXObject("Scripting.FileSystemObject");
var uni = objFSO.OpenTextFile(playlistUCS2, 1, false, -1);
var playlistContent = uni.ReadAll(); uni.Close();
var objStream = new ActiveXObject("ADODB.Stream");
objStream.Open;
objStream.Type = 2;
objStream.Position = 0;
objStream.Charset = "utf-8";
objStream.WriteText = playlistContent;
objStream.SaveToFile(playlistUTF8, 2);
objStream.Close();
cmd.RunCommand('"'+foobarPath+'" "'+foobarArguments+'" "'+playlistUTF8);
}
}
Wenn ich mal wieder bisserl Zeit habe werde ich versuchen das Skript so erweitern, dass neben selektierten Foldern auch mitselektierte Files mitgenommen werden - einfach weil ich jetzt bisserl Lust bekommen hab rumzubasteln^^.
Abschliessend nochmal: VIELEN LIEBEN DANK tbone für deine wirklich grosse Hilfe !!!
Edit:
Nachdem wir hier heute einen so schön verregneten Tag haben konnt ich nicht umhin, als gleich mal bisserl weiterzuwerkeln.
Das Hinzufügen von mitselektierten Dateien scheint schon zu klappen, nur mit dem Deselektieren (Filtern) hapert's noch:
Code: Alles auswählen
var selections = "\\.(flac|ape|cue|mp3|mp4|m4a|alac|wma)$";
cmd.RunCommand('Select DESELECT PATTERN="'+selections+'"');
var countFiles = stab.selected_files.count;
if (countFiles > 0) {
if (countEntries == 0) { var iomode = 2 } else { var iomode = 8 }
var objFSO = new ActiveXObject("Scripting.FileSystemObject");
var c = objFSO.OpenTextFile(playlistUCS2, iomode, true, -1);
for(i=0;i<stab.selected_files.count;i++) {
c.WriteLine(stab.selected_files(i));
countEntries++;
}
c.Close();
}
Der Versuch mit
cmd.RunCommand('Select DESELECT PATTERN="'+selections+'"') zu Erfolg und Ruhm zu gelangen wurde leider nicht honoriert. Kann DOpus hier überhaupt helfen oder muss man mit JScript ne Lösung suchen?
Edit2:
Auch wenn ich mehr durch Trial & Error zur Lösung gelangt bin als durch ein komplexes Verständnis der PATTERN Materie an sich, hier die nun die Code-Zeile die macht, was ich will:
cmd.RunCommand('Select DESELECT PATTERN="~(*'+selections.replace(/\\.|\$/g, "")+')"');
Bei Gelegenheit werd ich das Skript nochmal aufräumen und als gelöst pasten.