Musikdateien aus mehreren Unterordnern mit Foobar öffnen

Aktuelle Version: 12.6 (09.06.2017)
Alles zum Thema Directory Opus
Benutzeravatar
tbone
Berater
Beiträge: 394
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64
Produkt: aktuelle Beta-Version
Version DOpus: Pro

Re: Musikdateien aus mehreren Unterordnern mit Foobar öffnen

Beitrag von tbone » 7. Sep 2017 08:33

Versuch mal anstatt "TOVAR" -> "SETVAR". "TOVAR" legt die Selektion in den globalen Kontext, "SETVAR" in den Kontext des TABs. Mein Fehler! o)

Es legt die Selektion auch nicht als Array ab, sondern EOL getrennt als String, sodass man hier nochmal eben in ein Array aufsplitten muss um die Länge zu erhalten. Nochmal mein Fehler! Tut mir leid. o) Um die Anzahl zu erhalten also eher so versuchen:

Code: Alles auswählen

cmd.RunCommand('SelectEx FILES LINEAR PATH="'+stab.path+'" RECURSE '
		+'ITEMCOUNTPERC=100 TOFILE="'+playlistUnicode+'" SETVAR=SelectEx.Result NAME="'+selections+'" '
		+'ENCODING=unicode XLOG=a');
var countEntries = (''+data.func.sourcetab.vars("SelectEx.Result")).split('\r\n').length;
In der letzten Zeile addieren wir sicherheitshalber einen Leerstring zu unserer Variable (das macht eine Typkonvertierung zu String, falls es keiner ist). Auf dem String-Object rufen wir .split() auf, das erzeugt ein JScript-Array und trennt den langen String in Einzelteile an jeder '\r\n' Position (Zeilenende). Das resultierende Array hat dann die Eigenschaft .length (hier also nicht .count, weil es kein DO-spezifisches Array ist).

Und "schon" haben wir das.. o)

Mecum
Beiträge: 101
Registriert: 13. Dez 2008 13:34
Betriebssystem: Windows 7 Pro
Produkt: DOpus 11
Version DOpus: Pro

Re: Musikdateien aus mehreren Unterordnern mit Foobar öffnen

Beitrag von Mecum » 8. Sep 2017 09:22

Also vorab vielen lieben Dank für deine Unterstützng, hat ja nimmer wirklich was mit DOpus im engeren Sinne zu tun - von daher echt nett von dir die Zeit hier aufzubringen.

Im Grunde sollte jetzt eigentlich alles in Ordnung sein, würde die option "SETVAR=SelectEx.Result" die APPEND option nicht ignorieren. Das führt dazu, dass nur der letzte Durchlauf der for-schleife in der SETVAR-Variablen landet. Somit ist die imo sicherere proof-Variante über countEntries leider noch nicht brauchbar, da, selbst wenn in den ersten Foldern Einträge gefunden wurden, im letzten aber keiner, SelectEx.Result leer ist.

Wenn ich nicht ganz falsch liege, ist das allerdings ein Problem, dass du direkt in deinem Skript fixen müsstest. Sollte dem so sein und du vorhast, das auch zu machen, würde ich mich freuen. Für die Lösung meines aktuellen Vorhabens ist es aber nicht von Dringlichkeit, da ich ja mit dem Rückgabewert von SelectEx (0/-1) selbst arbeiten kann.

Hier nochmal der (an sich funktionstüchtige) Codeabschnitt für den multiplen Durchlauf mit anschliessender Auszählung:

Code: Alles auswählen

if (stab.selected_dirs.count) {
	for(i=0;i<stab.selected_dirs.count;i++){
		var dirItem = stab.selected_dirs(i);
		cmd.RunCommand('SelectEx FILES LINEAR PATH="'+dirItem.realpath+'" RECURSE '
			+'ITEMCOUNTPERC=100 TOFILE="'+playlistUnicode+'" SETVAR=SelectEx.Result NAME="'+selections+'" '
			+'ENCODING=unicode APPEND XLOG=a');
	}
} else {
.
.
.
}

if ((''+clickData.func.sourcetab.vars("SelectEx.Result")).length == 0) {
	//needed cause string conversion for countEntries always gives a return of minimum 1
	var countEntries = 0;
} else {
	var countEntries = (''+clickData.func.sourcetab.vars("SelectEx.Result")).split('\r\n').length;
}
Edit:
Denkfehler^^, auch die Rückgabe der SelextEx Funktion selbst ist durch den letzten Durchlauf nicht aussagekräftig. Somit bleibt zzt nur übrig die Datei selbst auszulesen um zu erfahren, ob es gültige Einträge gibt. Ich kann aber auch bei jedem Durchlauf die SelectEx.Result Variable prüfen und so countEntries erstellen - mal testen, wieviel an Performance das bei 30 Ordnern und mehr kostet.

Performanceunterschied ist mit freiem Auge und Stoppuhr in der Hand nicht messbar^^. Würde also rein um die Kosmetik gehen.

Benutzeravatar
tbone
Berater
Beiträge: 394
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64
Produkt: aktuelle Beta-Version
Version DOpus: Pro

Re: Musikdateien aus mehreren Unterordnern mit Foobar öffnen

Beitrag von tbone » 8. Sep 2017 18:16

Was SelectEx in SelectEx.Result jeweils zurückgibt, können wir ja selbst direkt "APPEND"en bzw. die Menge der Elemente selber Hinzurechnen.
Du hast Recht, der Trick mit dem .split() um die Menge der Elemente zu erhalten funktioniert nicht gut, wenn der zu splittende String leer ist - .split() gibt dann ein Array mit nur einem Element zurück (dem Leerstring) - mit Länge 1, das wollen wir nicht - können wir aber einfach abfangen.
Hier eine Version die bei mir reibungslos klappt (was die Anzahl der gefunden Elemente angeht), den Foobar-Aufruf musst Du unten nochmal einbauen. Und falls alles geht, zeig doch nochmal den kompletten Code, mit funktionierem Foobar-Aufruf.

Code: Alles auswählen

var selections = "\\.(flac|mp3|cue)$";
var playlistUnicode = "%TEMP%\\foobar.m3u";
var playlistUnicode = DOpus.FSUtil.Resolve(playlistUnicode);

function OnClick(data) {

	var f = data.func, stab = f.sourcetab, cmd = f.command, countEntries = 0;
	cmd.deselect = false;

	function runSelectEx( cmd, path) {
		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="'+playlistUnicode+'" SETVAR=SelectEx.Result NAME="'+selections+'" '
				+'ENCODING=unicode APPEND XLOG=a');
		return countElements(stab.vars("SelectEx.Result").value);
	}
	
	if (DOpus.FSUtil.Exists(playlistUnicode)) //delete playlist
		cmd.RunCommand('Delete "'+playlistUnicode+'" QUIET');

	if (stab.selected_dirs.count!=0) // folders selected, using folders
		for(i=0;i<stab.selected_dirs.count;i++)
			countEntries += runSelectEx(cmd, stab.selected_dirs(i).realpath);

	if (stab.selected_dirs.count==0) // no folders selected, using tab path (all folders)
		countEntries = runSelectEx(cmd, stab.path);

	DOpus.Output("Entries: " + countEntries);
	
	//run foobar here..
	//if (DOpus.FSUtil.Exists("%TEMP%\foobar.m3u")) //do not run foobar for no results/no playlist file created
	//	cmd.RunCommand('Foobar /add "%TEMP%\foobar.m3u"');
}
Das XLOG=a vielleicht auch nochmal entfernen bei Dir, wie gesagt, das kann ordentlich Cycles in DO kosten.

Benutzeravatar
Kundal
Moderator
Beiträge: 1337
Registriert: 20. Apr 2010 21:26
Betriebssystem: Win7 & Win 10 Pro 64 bit
Produkt: DOpus 12 x64 - Letzte Betaversion
Version DOpus: Pro

Re: Musikdateien aus mehreren Unterordnern mit Foobar öffnen

Beitrag von Kundal » 8. Sep 2017 22:33

Nachdem ich diesen thread mitverfolgt habe und vor Allem die Konvertierung nach utf-8 auch für mich von Interesse war, habe ich den Code mal vervollständigt. Danke für eure Vorgaben. Bei mir funktioniert es super.
Alle wichtigen Pfade, Argumente für Foobar und zu findende Dateitypen können am Anfang des Scripts editiert werden.

Code: Alles auswählen

var foobarPath = "/programfilesx86\\foobar2000\\foobar2000.exe"
var foobarArguments = "/add /immediate"
var selections = "\\.(flac|mp3|cue|ape|wma|m4a)$";
var playlistUnicode = "%TEMP%\\foobar.m3u8";
var playlistUnicode = DOpus.FSUtil.Resolve(playlistUnicode);
var playlistTmp = "%TEMP%\\foobar.tmp";
var playlistTmp = DOpus.FSUtil.Resolve(playlistTmp);

function OnClick(data) {

	var f = data.func, stab = f.sourcetab, cmd = f.command, countEntries = 0;
	cmd.deselect = false;

	function runSelectEx( cmd, path) {
		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="'+playlistTmp+'" SETVAR=SelectEx.Result NAME="'+selections+'" '
				+'ENCODING=unicode APPEND');
		return countElements(stab.vars("SelectEx.Result").value);
	}
	
	if (DOpus.FSUtil.Exists(playlistUnicode)) //delete playlist
		cmd.RunCommand('Delete "'+playlistUnicode+'" NORECYCLE QUIET');

	if (DOpus.FSUtil.Exists(playlistTmp)) //delete tempfile
		cmd.RunCommand('Delete "'+playlistTmp+'" NORECYCLE QUIET');

	if (stab.selected_dirs.count!=0) // folders selected, using folders
		for(i=0;i<stab.selected_dirs.count;i++)
			countEntries += runSelectEx(cmd, stab.selected_dirs(i).realpath);

	if (stab.selected_dirs.count==0) // no folders selected, using tab path (all folders)
		countEntries = runSelectEx(cmd, stab.path);

	DOpus.Output("Entries: " + countEntries);

	if (DOpus.FSUtil.Exists(playlistTmp)) {
		var fso = new ActiveXObject("Scripting.FileSystemObject");
    	        var f1 = fso.OpenTextFile(playlistTmp,1,false,-1);
    	        var txt = f1.ReadAll();
		var stream = new ActiveXObject('ADODB.Stream');
		stream.Open;
		stream.Type = 2;
		stream.Position = 0;
		stream.Charset = "utf-8";
		stream.WriteText(txt);
		stream.SaveToFile(playlistUnicode, 2);
		stream.Close;
	}

	if (DOpus.FSUtil.Exists(playlistUnicode)) //do not run foobar for no results/no playlist file created
		cmd.RunCommand('"'+foobarPath+'" "'+playlistUnicode+'" '+foobarArguments+'');
}

Benutzeravatar
tbone
Berater
Beiträge: 394
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64
Produkt: aktuelle Beta-Version
Version DOpus: Pro

Re: Musikdateien aus mehreren Unterordnern mit Foobar öffnen

Beitrag von tbone » 8. Sep 2017 22:52

Very good! o)

Aber müsste bei dem Part wo das Encoding gewandelt wird, nicht noch ein Test rein, ob die Datei zu wandelnde Datei überhaupt existiert?
Oder schreibt SelectEx immer eine Datei, auch wenn nichts "selektiert" wurde? Weiß ich grad nicht. o)

Benutzeravatar
Kundal
Moderator
Beiträge: 1337
Registriert: 20. Apr 2010 21:26
Betriebssystem: Win7 & Win 10 Pro 64 bit
Produkt: DOpus 12 x64 - Letzte Betaversion
Version DOpus: Pro

Re: Musikdateien aus mehreren Unterordnern mit Foobar öffnen

Beitrag von Kundal » 8. Sep 2017 23:15

Recht hast du. Wenn nichts gefunden wurde bricht SelectEx natürlich mit "No items, aborting" ab und es gibt eine Fehlermeldung, weil playlistTmp nicht existiert. Habe den Test oben im Script ergänzt.

Mecum
Beiträge: 101
Registriert: 13. Dez 2008 13:34
Betriebssystem: Windows 7 Pro
Produkt: DOpus 11
Version DOpus: Pro

Re: Musikdateien aus mehreren Unterordnern mit Foobar öffnen

Beitrag von Mecum » 9. Sep 2017 07:39

Ich muss zugeben, tbone, deine Variante die countEntries Variable zu erstellen sieht um einiges eleganter aus als die meinige :D

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 !!! :D

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.

Mecum
Beiträge: 101
Registriert: 13. Dez 2008 13:34
Betriebssystem: Windows 7 Pro
Produkt: DOpus 11
Version DOpus: Pro

Re: Musikdateien aus mehreren Unterordnern mit Foobar öffnen

Beitrag von Mecum » 14. Sep 2017 15:57

Sodala, nachdem ich mich jetzt ein wenig rumgespielt habe würde ich gerne, bevor ich das Skript als fertig paste, noch auf eine Merkwürdigkeit hinweisen. KA, ob das ein Bug ist oder einfach mein Verständnis nicht tief genug geht um die mysteriösen Dinge, die im Hintergrund passieren, zu verstehen^^.

Das Deselektieren funktioniert wie bereits im vorigen Post beschrieben einwandfrei. Allerdings nur, solange nicht zuvor die DOpus Funktion clickData.func.sourcetab.selected_files.count aufgerufen wurde.

Zwei Beispiele dazu - inklusive jeweils einem einfachen Skript zur Nachvollziehbarkeit:

Beispiel A:

cmd.RunCommand('Select DESELECT PATTERN="~(*'+selections.replace(/\\.|\$/g, "")+')"');
if (stab.selected_files.count > 0) {

Code: Alles auswählen

function OnClick(clickData) {

	var f = clickData.func, stab = f.sourcetab, cmd = f.command, countEntries = 0;
	cmd.deselect = false;

	var playlistUCS2 = stab.path + "\\_playlist.txt";
	var selections = "\\.(flac|ape|cue|mp3|mp4|m4a|alac|wma)$";
		
	cmd.RunCommand('Select DESELECT PATTERN="~(*'+selections.replace(/\\.|\$/g, "")+')"');
	
	if (stab.selected_files.count > 0) {
		var objFSO = new ActiveXObject("Scripting.FileSystemObject");
		var c = objFSO.OpenTextFile(playlistUCS2, 2, true, -1);
		
		for(i=0;i<stab.selected_files.count;i++) {
			c.WriteLine(stab.selected_files(i));
			countEntries++;
		}
		c.Close();
		DOpus.Output("countEntries: " + countEntries);
	}
}
Resultat:
Die ungewünschten Dateien werden sowohl visuell als auch im Array deselektiert.

Beispiel B:

if (stab.selected_files.count > 0) {
cmd.RunCommand('Select DESELECT PATTERN="~(*'+selections.replace(/\\.|\$/g, "")+')"');

Code: Alles auswählen

function OnClick(clickData) {

	var f = clickData.func, stab = f.sourcetab, cmd = f.command, countEntries = 0;
	cmd.deselect = false;

	var playlistUCS2 = stab.path + "\\_playlist.txt";
	var selections = "\\.(flac|ape|cue|mp3|mp4|m4a|alac|wma)$";
		
	if (stab.selected_files.count > 0) {
		cmd.RunCommand('Select DESELECT PATTERN="~(*'+selections.replace(/\\.|\$/g, "")+')"');

		var objFSO = new ActiveXObject("Scripting.FileSystemObject");
		var c = objFSO.OpenTextFile(playlistUCS2, 2, true, -1);
		
		for(i=0;i<stab.selected_files.count;i++) {
			c.WriteLine(stab.selected_files(i));
			countEntries++;
		}
		c.Close();
		DOpus.Output("countEntries: " + countEntries);
	}
}
Resultat:
Die ungewünschten Dateien werden zwar visuell aber nicht im Array deselektiert, was man sowohl an der countEntries-Variable als auch am Ergebnis in der "_playlist.txt" sehen kann.

Es ist natürlich möglich, trotz dieser Kuriosität die Bedingungen als auch die Funktionen entsprechend so anzuordnen, dass das Ergebnis passt - aber halt nicht ganz so schön^^.

Benutzeravatar
tbone
Berater
Beiträge: 394
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64
Produkt: aktuelle Beta-Version
Version DOpus: Pro

Re: Musikdateien aus mehreren Unterordnern mit Foobar öffnen

Beitrag von tbone » 14. Sep 2017 16:12

Wenn mit stab.selected_files arbeitest und dann "Select.." aufrufst, musst Du die Daten im Tab-Object stab aktualisieren -> stab.Update() aufrufen.
Danach sollte stab.selected_files.count auch die korrekte Menge Elemente zurückgeben. In stab ist halt ein "Snapshot" des Tabs, so wie er beim Aufruf aussah (was ist selektiert, wieviele Elemente, welcher ViewMode etc.). Scripting-Befehle die auf den Tab zielen, ändern den Snapschuss dann nicht, den muss man selbst aktualisieren, wie gesagt, mit stab.Update().

Klingt mir so, als ist das das problematische, Dir unbekannte Detail. o)

Mecum
Beiträge: 101
Registriert: 13. Dez 2008 13:34
Betriebssystem: Windows 7 Pro
Produkt: DOpus 11
Version DOpus: Pro

Re: Musikdateien aus mehreren Unterordnern mit Foobar öffnen

Beitrag von Mecum » 14. Sep 2017 16:34

Oh ja, das klingt natürlich logisch, perfekt :)
Dann kann ich das Skript doch einfacher zamkleistern als gedacht^^

Vielen Dank für die prompte Info

Mecum
Beiträge: 101
Registriert: 13. Dez 2008 13:34
Betriebssystem: Windows 7 Pro
Produkt: DOpus 11
Version DOpus: Pro

Re: Musikdateien aus mehreren Unterordnern mit Foobar öffnen

Beitrag von Mecum » 14. Sep 2017 17:50

Hier nun meine fertige Lösung.

Der Skript-Schalter durchsucht mit Hilfe der neuesten SelectEx-Version von tbone alle markierten Ordner und markierten Dateien nach den gewünschten Formaten, erstellt im TEMP-Ordner die Datei "playlist.ucs2", konvertiert diese danach ins Format UTF-8 als "playlist.utf8" und übergibt bei Erfolg die Playliste im Anschluss an Foobar.

Grundsätzlich könnte man mit diesen paar Zeilen auch nach Bildern, Videos, oder anderen Formate suchen, diese in eine beliebige Datei schreiben und danach ein Programm der Wahl öffnen.

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+' XLOG=off'); //' XLOG=a'
		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 if (stab.selected_files.count == 0) { //just once for the current source path
		countEntries = runSelectEx(cmd, stab.path, "");
	}
	
	cmd.RunCommand('Select DESELECT PATTERN="~(*'+selections.replace(/\\.|\$/g, "")+')"');
	stab.Update();

	if (stab.selected_files.count > 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();
	}
	
	if (countEntries > 0) { //transcode ucs2-le to utf-8 and run foobar

		var objFSO = new ActiveXObject("Scripting.FileSystemObject");
		var c = objFSO.OpenTextFile(playlistUCS2, 1, false, -1);
		var playlistContent = c.ReadAll(); c.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);
	}
	cmd.RunCommand('Select DESELECT ALLFILES');
}
Vielen Dank nochmal an tbone für die ganze Arbeit :D

Benutzeravatar
tbone
Berater
Beiträge: 394
Registriert: 22. Nov 2014 21:16
Betriebssystem: 7*64
Produkt: aktuelle Beta-Version
Version DOpus: Pro

Re: Musikdateien aus mehreren Unterordnern mit Foobar öffnen

Beitrag von tbone » 14. Sep 2017 22:27

Wunderprächtig! o)
Jetzt nochmal eine mikrooptimierte Version mit den netten Details als ausgelagerte Funktion.
So lässt sich für den nächsten Button alles einfacher zusammenstecken was wir so erfunden haben. o)

Wenn ich das jetzt aber so sehe, dass auch die selektierten Dateien "eingeklingt" werden..
Also da wäre eine Variante ohne SelectEx dann jetzt doch angebrachter. Vielleicht in v0.4? o)
Dein "Select"-Trick um die Selektion zu Filtern war gut, hier jetzt ohne Tab.Update() aber fixer.

Code: Alles auswählen

////////////////////////////////////////////////////////////////////////////////
// Button: Add2FoobarPlaylist v0.3
// 
// This button adds selected files and folders to the foobar playlist.
// When there are no items selected, all items will be added.
//
// https://www.haage-partner.de/forum/viewtopic.php?f=47&t=5131
////////////////////////////////////////////////////////////////////////////////
var foobar  = { 
        path    : "D:\\bin\\play\\foobar2000\\foobar2000.exe",
        pattern : "\\.(flac|ape|cue|mp3|mp4|m4a|alac|wma)$",
        args    : "/add",
        tmpUTF8 : "%TEMP%\\foobar.tmp.playlist.m3u8",
        tmpUCS2 : "%TEMP%\\foobar.tmp.playlist.ucs2"
    }
////////////////////////////////////////////////////////////////////////////////
function OnClick(data) {
    var f = data.func, stab = f.sourcetab, cmd = f.command; cmd.deselect = false;
    var fso = new ActiveXObject("Scripting.FileSystemObject"), countEntries = 0;
    ////////////////////////////////////////////////////////////////////////////
    function runSelectEx(cmd, path) {
        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="'+foobar.tmpUCS2+'" ' +
                'SETVAR=SelectEx.Result NAME="'+foobar.pattern+'" ' +
                'ENCODING=unicode APPEND NODESELECT XLOG=off'); //' XLOG=a'
        return countElements(stab.vars("SelectEx.Result").value);
    }
    ////////////////////////////////////////////////////////////////////////////
    foobar.tmpUTF8 = DOpus.FSUtil.Resolve(foobar.tmpUTF8);
    foobar.tmpUCS2 = DOpus.FSUtil.Resolve(foobar.tmpUCS2);
    emptyFile(foobar.tmpUCS2, fso);
    
    if (stab.selected_dirs.count) //folders selected, run SelectEx for each
        for(i=0;i<stab.selected_dirs.count;i++)
            countEntries += runSelectEx(cmd, stab.selected_dirs(i).realpath);
    else 
        if (!stab.selected_files.count) //run SelectEx just once for tab-path
            countEntries = runSelectEx(cmd, stab.path);
    
    if (stab.selected_files.count) {    
        for(var i=0,appendMe='';i<stab.selected_files.count;i++) {
            var file=stab.selected_files(i), name=file.name+'';
            if (name.search(foobar.pattern)==-1) continue;
            appendMe+=file.realpath+'\r\n';
            countEntries++;
        }
        appendToFile(foobar.tmpUCS2, appendMe, fso);
    }
    
    if (countEntries) {
        transcodeUCS2LEtoUTF8(foobar.tmpUCS2, foobar.tmpUTF8, fso); //unicode>utf8
        cmd.RunCommand('"'+foobar.path+'" "'+foobar.args+'" "'+foobar.tmpUTF8+'"');
    }
    
    DOpus.Output("Added "+countEntries+" files to playlist.");
}
////////////////////////////////////////////////////////////////////////////////
function appendToFile(filePath, content, fso) {
    fso = fso || new ActiveXObject("Scripting.FileSystemObject");
    if (!content) return;
    var file = fso.OpenTextFile(filePath, 8, true, -1);
    file.Write(content); file.Close();
}
////////////////////////////////////////////////////////////////////////////////
function transcodeUCS2LEtoUTF8(pathUCS2, pathUTF8, fso){
    fso = fso || new ActiveXObject("Scripting.FileSystemObject");
    var fileUCS2 = fso.OpenTextFile(pathUCS2, 1, false, -1), content = '';
    if (!fileUCS2.AtEndOfStream) content = fileUCS2.ReadAll(); fileUCS2.Close();
    var objStream = new ActiveXObject("ADODB.Stream");
    objStream.Open();
    objStream.Type = 2;
    objStream.Position = 0;
    objStream.Charset = "utf-8";
    objStream.WriteText = content;
    objStream.SaveToFile(pathUTF8, 2);
    objStream.Close();
}
////////////////////////////////////////////////////////////////////////////////
function emptyFile(filePath, fso) {
    fso = fso || new ActiveXObject("Scripting.FileSystemObject");
    fso.OpenTextFile(filePath, 2, true, 0).Close();
}

Mecum
Beiträge: 101
Registriert: 13. Dez 2008 13:34
Betriebssystem: Windows 7 Pro
Produkt: DOpus 11
Version DOpus: Pro

Re: Musikdateien aus mehreren Unterordnern mit Foobar öffnen

Beitrag von Mecum » 15. Sep 2017 10:57

Tja, was soll ich da noch sagen? Ich hätt's nicht besser skripten können   :mrgreen:

works like a charm...  :D

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste