WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)

Begonnen von TomPro, 16. Juni 2009, 19:24:54

Vorheriges Thema - Nächstes Thema

TomPro

[CUI]

So, habe wieder ein paar kleine Helferlein, welche man in sein Script einbauen kann.

1. Zero Pading zum auffüllen mit führenden Nullen:

//----------------------------------------------------------------------------
//------   Zero Padding
function ZPad() {
var V, Z, i;
var VStr, ZStr, PStr;

Z = 2;
switch (arguments.length) {
// fall-thru
case 2:; Z = Math.abs(parseInt(arguments[1]));
case 1:; V = parseFloat(arguments[0]); break;
default:; return "00";
}
ZStr = "";
for (i = 1; i <= Z; i++) ZStr += "0";
VStr = V.toString();
PStr = (VStr.length < Z) ? ZStr.substr(0,Z - VStr.length): "";
VStr = PStr + VStr;
return VStr;
}



Kurzbeschreibung:

Wird KEIN Parameter übergeben erhällt man als Antwort "00"
Wird nur EIN Parameter übergeben wird auf eine Zweistellige Zahl aufgefüllt also aus "1" mach "01". Größere Zahlen werden nicht angetastet also "1258" bleibt "1258"
Werden ZWEI Parameter übergeben so ist der erste Parameter die Zahl, und der zweite Parameter (durch ein Komma getrennt) auf wieviel Stellen aufgefüllt werden soll. Also aus " 1246,8" wird "00001246".



2. Cut Floating Point Number um die Kommazahlen zu begrenzen

//----------------------------------------------------------------------------
//------   Cut Floating Point Number
function CutPointNumber() {
var V, Z;

Z = 2;
switch (arguments.length) {
// fall-thru
case 2:; Z = Math.abs(parseInt(arguments[1]));
case 1:; V = parseFloat(arguments[0]); break;
default:; V = 0;
}
return (Math.round(Math.pow(10,Z) * V)) / Math.pow(10,Z);
}



Kurzbeschreibung:

Wird KEIN Parameter übergeben erhällt man als Antwort "0"
Wird nur EIN Parameter übergeben wird auf eine Zahl zweistellig hinter dem Komma gerundet also aus "125.4872358" mach "125.49", aber "125.4" bleibt "125.4".
Werden ZWEI Parameter übergeben so ist der erste Parameter die Zahl, und der zweite Parameter (durch ein Komma getrennt) auf wieviel Stellen hinterm Komma gerundet werden soll. Also aus "124.356782496,6" wird "124.356782".




3. Fix Floating Point Number zum Auffüllen oder Begrenzen der Nachkommazahlen

//----------------------------------------------------------------------------
//------   Fix Floating Point Number
function FixPointNumber() {
var V, Z, i;
var VStr, ZStr, PStr;

Z = 2;
switch (arguments.length) {
// fall-thru
case 2:; Z = Math.abs(parseInt(arguments[1]));
case 1:; V = parseFloat(arguments[0]); break;
default:;  return "0.00";
}
if (Z == 0) return Math.round(V).toString();
ZStr = "";
for (i = 1; i <= Z; i++) ZStr += "0";
V = CutPointNumber(V,Z)
VStr = V.toString();
if (VStr.lastIndexOf(".") == -1) {
VStr += "." + ZStr;
} else {
PStr = ZStr.substr(0,Z - (VStr.length - VStr.lastIndexOf(".") - 1));
VStr += PStr;
}
return VStr;
}




Kurzbeschreibung:

Wird KEIN Parameter übergeben erhällt man als Antwort "0.00"
Wird nur EIN Parameter übergeben wird auf eine Zahl zweistellig hinter dem Komma gerundet oder mit Nullen aufgefüllt also aus "125.4872358" mach "125.49", und aus "125.4" mach "125.40".
Werden ZWEI Parameter übergeben so ist der erste Parameter die Zahl, und der zweite Parameter (durch ein Komma getrennt) auf wieviel Stellen hinterm Komma gerundet oder aufgefüllt werden soll. Also aus "124.356782496,6" wird "124.356782" oder aus "176.235,6" wird "176.235000".

Viel Spass beim Einbauen.

TomPro

TomPro

[CUI]

Und noch einer zum Ersetzen verbotener Zeichen im Folder bzw. Filename

//----------------------------------------------------------------------------
//------   Repacing forbidden Charakter in Filestrings
//---------   Repacing for Filname
function ReplaceForFilename(RawName){
ReplaceForFolder(RawName)
RawName = RawName.replace(/\\/g,"_");
return RawName;
}

//---------   Repacing for Foldername
function ReplaceForFolder(RawName){
RawName = RawName.replace(/</g,"_");
RawName = RawName.replace(/>/g,"_");
RawName = RawName.replace(/:/g,"_");
RawName = RawName.replace(/\|/g,"_");
RawName = RawName.replace(/\?/g,"_");
RawName = RawName.replace(/\*/g,"_");
RawName = RawName.replace(/\"/g,"_");
RawName = RawName.replace(/\//g,"_");
return RawName;
}


Gruß TomPro

tedgo

@TomPro
Zum Thema "Floating Point":
Probier doch einfach mal den Zusatz toFixed(n) also z. B. fb.Volume.toFixed(2) ;)
Aber schön, deine Mühen zu verfolgen :)

TomPro

Das hat man dann davon, wenn mann eine Sprache nicht lernt sondern sich nur seine  Bedürfnisse zusammen klebt und sich der Rest auf Versuch und Irtum stützt.

Danke tedgo

Gruß TomPro

aeitscher

@ tompro

eine supergeschichte, dein 1st strike. allerdings hakt es manchmal aus. wovon ist es abhängig, dass das script greift und woran könnte es liegen, dass es bei manchen alben zu script error führt?
ich würde es gern für alle alben verwenden und fehler abstellen, hab nur keine idee, wonach ich suchen kann...
dank dir!


TomPro

Da mein kompletter 1st Srike ja noch gar nicht fertig ist, hatte ich hier nur einige Scriptbeispiele daraus eingestellt. Du müstest jetzt etwas genauer werden welche Du genutzt hast und wie sich der Fehler Zeigt (Auszug aus der Konsole).

@ tedgo

Eventuell sollten Frage und mögliche Antwort in einen gesonderten Thread verschoben werden, damit hier weiter Scriptbeispiele gepostet werden können.

Gruß TomPro

aeitscher

um den hier gehts: http://foobar-users.de/index.php?topic=2000.msg12132#msg12132

ich hab da hin und wieder ein weißes panel... mit dem script error - schriftzug. console-auszug hab ich dahingehend noch nicht eingeholt. dass die ganze geschichte noch nicht fertig ist, fällt im übrigen gar nicht auf. möglicherweise "erregt" mich einfach die oberfäche und die idee, dass mein statistikwahn "befriedigt" werden könnte.  :D

will mal beobachten, was sich die nächsten tage zeigt und dann ggf. einen console-auszug posten.
besten dank zunächst!!


TomPro

Ich schau mir mein altes Script noch mal an (hab gerade meine Nachtschicht für Heute zu Ende) aber ich bin gerade bei einer sehr viel eleganteren Lösung für das gleiche Problem. Tippe mal nach Weihnachten ist die neue Lösung Spruchreif.

Gruß TomPro

aeitscher

Error: WSH Panel Mod (GUID: 7D50E649-B495-4AA5-BF78-599CC3C11D3F): Laufzeitfehler in Microsoft JScript:
Objekt erforderlich
Ln: 117, Col: 2
<no source text available>
Opening track for playback: "X:\...\...\Panzerballett - 2005 - Panzerballett\06. Panzerballett - Abkrassen.mp3"

dieses steht inner console.

TomPro

[CUI]

Dort liegt die Routine für die Anpassung von Cover-Ratio (Länge mal Breite) an das Fenster-Ratio.

Ich gehe mal davon aus, das du dort im Ordner kein Cover abgelegt hast, und das Du am Anfang des Scrits bei:


//----------------------------------------------------------------------------
//------ Global
//--------- Variable
var INI_File = fb.FoobarPath + "1stStrike\\1stStrike.ini" // Path and Name of the INI Inifile
var NC_Cover = fb.FoobarPath + "1stStrike\\IMG\\NoCover.png" // Path and Name of a No Cover Image
var File_Path = fb.TitleFormat("$directory_path(%path%)") // Path  of a played File


den Pfad für ein NO-COVER Cover nicht angepasst hast, bzw. du kein NO-COVER Cover hast.

Gruß TomPro

aeitscher

grundsätzlich befinden sich bei mir alle cover als album_art im jeweiligen ordner. habe nun auch (hatte in der tat kein nocover.png) im 1ststrike-ordner einen unterordner img angelegt und ein nocover.png eingefügt.
dennoch:


WSH Panel Mod (GUID: 7D50E649-B495-4AA5-BF78-599CC3C11D3F): initliased in 0.0000026 s
Error: WSH Panel Mod (GUID: 7D50E649-B495-4AA5-BF78-599CC3C11D3F): Laufzeitfehler in Microsoft JScript:
Objekt erforderlich
Ln: 117, Col: 2
<no source text available>


auch nach neustart von foobar hat sichs so nicht erledigt.


aeitscher

sachema, könnte es unter umständen daran liegen, dass das cover im tag eingebettet sein muss?

TomPro

[CUI]

Zum Verständniss des Scripts:

Wenn Du bei laufendem Script, also kein Error, mit der linken Maustaste auf das WSH Panel klikst, erhällst Du ein Menue. Im oberen Drittel kannst Du zwischen den vorhandenen Bilder (nicht ausgegraut) wählen welches Du Aktuell sehen möchtest. Im mittleren Drittel kannst Du bestimmen auf welches Bild sich foobar wieder bei einem Neustart einstellen soll. Das untere Drittel ist für die Einstellungen dea Albumratings.

Die Tatsache, das nicht darstellbare Bilder im Menue ausgegraut werden zeigt, das die üblichen verdächtigen vor dem Anzeigen auf vorhanden sein gecheckt werden, auch das embedded Image. Danach erfollgt eigentlich eine Sicherheitsroutine die dafür sorgt, das wenn ein gewünschtes Bild nicht vorhanden ist automatisch auf ein vorhandenes, bis eben hin zum No-Cover-Image, gewechselt wird. Dafür verantwortlich ist der Funktionsaufruf CheckImage(Item) (die Funtion ab Zeile 138). Hier wird in dem Array ArtCheck[x] (x steht für Front: 1, Back: 2, Disc: 3, Icon: 4, Artist: 5, Embedded: 6) eine 1 für vorhanden und eine 0 für nicht vorhanden hinterlegt und in ArtCheck[0] die Nummer des leztmöglichen Bildes in der Rheienfolge 5-4-3-2-1-6 (also embedded zum Schluß) und wenn kein Bild vorhanden ist, DANN die 0 für das No-Cover-Cover.

In der Funktion SelectImage() (ab Zeile 156) wird dann der Variablen g_img nun das Bild zugewiesen welches zur Anzeige gelangen soll und aus dieser Funktion wird dann die Routine ab Zeile 113 zur Ermittlung des Ratios angestoßen. Der Funktionsaufruf GetRatio(image) weist der Variablen image das Cover zu dessen Breite in Zeile 117 mittels image.Width; ermittelt wird. Und hier stolpert ja das Script bei Dir.

Du könntest jetzt mittels dem Befehl fb.trace(x) an den entsprechenden Stellen für x die Variable eintragen und dann in der Konsole Dir anzeigen lassen um so rückwerts den Punkt zu finden wo das Script bei Dir hakt, oder warte noch ein weilchen, das neue Script steht (hoffentlich) kurz vor der Vollendung, auch wenn dadurch der 1st Srike leider immer noch nicht fertig ist, aber ein Bausteinchen weiter, welches ich dann hier schon wieder Posten werde.

Gruß TomPro


aeitscher

uiuiui tompro, danke für die sehr ausfühlriche erläuterung des ganzen, wenngleich diese für mich (ehrlich gesagt) böhmische dörfer bedeuten.

und: natürlich hatte ich trottel alles auf embedded cover gesetzt --> also kein wunder.

und: ich warte gern!

vielen dank und gute nacht denn mal.




TomPro

[CUI]

Mein Hirn springt gerade etwas hin und her, aufgrund meiner Versuche mehrer Audiostreams in foobar gleichzeitig zu erzeugen (NOCH NICHT FÜR DJ-FUNKTIONEN, sondern) um als Weckerfunktionen kleine Klingelgeräusche einzubinden (erste Tests wahren SEHR erfolgreich) habe ich schon mal eine Funktion Fertig, die den Eigentlichen Audiostream (Playlist) auf einen bestimmten Wert Faden kann und dabei den Wert vor dem Faden als Argument zurückgiebt, um diese Lautstärke später wieder Zurückzustellen.

Hier das Script

//----------------------------------------------------------------------------
//---   Script for WSH Panel for foobar2000
//---
//---   Windows Scripting Host Panel
//---   Modded by T.P. Wang
//---
//---   To use since Vers. 1.0.0
//----------------------------------------------------------------------------
//---   1stStrike (by TomPro) v 0.1.0
//----------------------------------------------------------------------------

//----------------------------------------------------------------------------
//------   FadeTo
function FadeTo () {
var VolMem, VolSet, Speed, Speed1, Speed2, Speed3, Step;

// Set Standard-Value
VolMem = fb.Volume;
VolSet = 100;
Speed = 15;

// Get Value
switch (arguments.length) {
// fall-thru
default:;
case 2:; Speed = (!isNaN(arguments[1])) ? Math.abs(arguments[1]) : 15;
case 1:; VolSet = (!isNaN(arguments[0])) ? Math.abs(arguments[0]) : 100; break;
case 0:; break;
}

// Check Value Range
VolSet = (VolSet <= 0) ? 0 : (VolSet >= 100) ? -100 : VolSet * -1;
Speed = (Speed <= 1) ? 0.01 : (Speed >= 100) ? 1 : Speed / 100;
Speed1 = Speed / 600;
Speed2 = Speed / 200;
Speed3 = Speed;
Speed = (VolMem < -40) ? Speed3 : (VolMem < -10) ? Speed2 : Speed1

// Check Direction and Fade
if (VolMem > VolSet) {
for (Step = VolMem; Step > VolSet; Step = Step - Speed) {
if (Step > 0 || Step < -100) break;
Speed = (Step < -40) ? Speed3 : (Step < -10) ? Speed2 : Speed1
fb.Volume = Step;
}
} else {
for (Step = VolMem; Step < VolSet; Step = Step + Speed) {
if (Step > 0 || Step < -100) break;
Speed = (Step < -40) ? Speed3 : (Step < -10) ? Speed2 : Speed1
fb.Volume = Step;
}
}

return VolMem;
}


ich kann bis zu 2 Parameter übergeben.
Der erste ist der Wert auf den gefadet werden soll (wenn kein Parameter angegeben wird wird auf -100dB gefadet).
Der zweite Wert ist die Geschwindigkeit, wird diese weggelassen so wird hier der Wert auf 15 gesetzt. Sinnvolle Einstellungen sind, je nach Anwendung ca. zwischen 2 und 30 wohingegen mögliche Einstellungen zwischen 1 und 100 liegen. kleine Zahl = Langsam.

Viel Spass beim Experimentieren.

Gruß TomPro