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, jetzt spricht foobar auch zu uns.

zunächst de Code:

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

//----------------------------------------------------------------------------
//------   Speech API
var SPF = {
Default : 0,
Async : 1,
PurgeBeforeSpeak : 2,
IsFilename : 4,
IsXML : 8,
IsNotXML : 16,
PersistXML : 32,
NlpMask : 64,
NlpSpeakPunc : 64,
VoiceMask : 127,
UnusedFlags : -128
}

function SapiPlayWav() {
var SoundFile, Flag;

// Set Standard-Value
SoundFile = fb.FoobarPath + "1stStrike\\snd\\ding.wav";
Flag = SPF.Default;

// Get Value
switch (arguments.length) {
// fall-thru
case 2:; Flag = parseInt(arguments[1]);
case 1:; SoundFile = String(arguments[0]); break;
default:;
}

// Check Value
if (isNaN(Flag)) Flag = SPF.Default;
if (!FSO.FileExists(SoundFile)) {
if (fb.IsPlaying && !fb.IsPaused) {
fb.Pause();
SapiFnF(SoundFile);
fb.Play();
} else {
SapiFnF(SoundFile);
}
return;
}

// operate
var SapiVoiceObj = new ActiveXObject("SAPI.SpVoice");
var SapiFileObj = new ActiveXObject("SAPI.SpFileStream.1");
SapiFileObj.Open(SoundFile);
SapiVoiceObj.Speakstream(SapiFileObj, Flag);
delete SapiFileObj;
delete SapiVoiceObj;
}

function SapiSpeakTextFile() {
var TextFile, Flag;

// Set Standard-Value
TextFile = fb.FoobarPath + "1stStrike\\TestFiles\\__SAPI Test.txt";

// Get Value
switch (arguments.length) {
// fall-thru
case 2:; Flag = parseInt(arguments[1]);
case 1:; TextFile = String(arguments[0]); break;
default:;
}

// Check Value
if (isNaN(Flag)) Flag = SPF.Default;
if (!FSO.FileExists(TextFile)) {
if (fb.IsPlaying && !fb.IsPaused) {
fb.Pause();
SapiFnF(TextFile);
fb.Play();
} else {
SapiFnF(TextFile);
}
return;
}

// operate
var SapiVoiceObj = new ActiveXObject("SAPI.SpVoice");
SapiVoiceObj.Speak(TextFile, Flag | SPF.IsFilename);
delete SapiVoiceObj;
}

function SapiSpeakText() {
var Text, Flag;

// Set Standard-Value
Text = "No Text to Speak";
Flag = SPF.Default;

// Get Value
switch (arguments.length) {
// fall-thru
case 2:; Flag = parseInt(arguments[1]);
case 1:; Text = String(arguments[0]); break;
default:;
}

// Check Value
if (isNaN(Flag)) Flag = SPF.Default;

// operate
var SapiVoiceObj = new ActiveXObject("SAPI.SpVoice");
SapiVoiceObj.Speak(Text, SPF.Default);
delete SapiVoiceObj;
}

function SapiFnF(FileName) {
SapiSpeakText("File ");
SapiSpeakText(FileName.substring(FileName.lastIndexOf("\\") + 1));
SapiSpeakText(" not found!");
}

function SapiTest(Type) {
SapiPlayWav();
switch (Type) {
default:;
SapiSpeakText("Welcome to TomPro's 1st Strike!");
break;
case 1:;
SapiSpeakText("This is a Speechtest,, Dies ist ein Sprechtest.");
break;
case 2:;
SapiSpeakTextFile();
break;
case 3:;
SapiSpeakText("This is a Speechtest,, Dies ist ein Sprechtest.");
SapiPlayWav();
SapiSpeakTextFile(fb.FoobarPath + "1stStrike\\TestFiles\\__SAPI Test.txt");
break;
}
SapiPlayWav();
}


Wichtig, bei längeren Texten kann es zu Timeoutproblemen kommen, deswegen gegebenenfalls in den Preferences die Zeit auf 0 oder eine entsprechend hohe Zahl stellen.

Zusammen mit dem FadeTo() von oben kann man nun als GAG einen automatisierten Ramp Talk generieren.

Kurz ein paar Anmerkungen:

Die Funktionen, die von einem Script aus angesprochen werden könnten sind:
- SapiPlayWav()
- SapiSpeakTextFile()
- SapiSpeakText()

Zur internen Fehlerausgabe für ein nicht gefundenes File gibt es noch die Funktion:
- SapiFnF(FileName)

Und zum Testen des ganzen gibt es:
- SapiTest(Type)

Jede der drei oberen Hauptfunktionen kan mit bis zu 2 Parametern angesprochen werden. Der jeweils erste Parameter ergiebt sich aus der Funktion (Pfad eines wav-Fils, Pfad eines txt-Files, String zum Vorlesen) und der zweite Parameter ist ein Flag welches übergeben werden kann. Die Funktionen der Einzelnen Flags habe ich noch nicht exact ergründet, da, wie ich schon häufiger schrieb, ich erstens nicht wirklich programieren gelernt habe und zweitens alle relevanten verfügbaren Informationen die ich über den Sprachsythesyser im Netz gefunden habe auf englisch sind; eine Sprache mit der ich weitestens auf Kriegsfuß stehe.

Ich denke mir das mit der Speach API von MS noch mehr zu realisieren ist, da diese ja wav-Dateien abspielen kann.

Ein gedankliches Beispiel, für die, die wirklich programieren könne quasi zum Anreiz:

Man Focusiert eine Datei in der Playlist, und anschließen drückt man einen Knopf, jetzt wird die Datei im Hintergrund zu "Vorhöhren.wav" in ein Standad-Verzeichnis gewandelt und anschließend über einen weitern Audioausgang, der ja in der Systemsteuerung für die SAPI eingestellt werde kann, ausgegeben. Schon hätte Foobar einen zweiten Audiostream, der weniger fürs direkte DJ-ing aber eben für eine Vorhöhrfunktion genutzt werden kann.

Dies währe nur eine Möglichkeit. Mit etwas Javascript Know How und Fantasie giebt es bestimmt bald witere Interessante Möglichkeiten. Derweil bastele ich noch an meine Weckerfunktion.

MFG TomPro

Erste Änderung:
Ach - eines hätte ich beinahe noch vergessen. es werden für dei Standard-Values zwei Dateien (einmal wav und einmal txt) inklusive Pfadangabe benötigt. Bitte entsprechend anpassen, da, wenn die 3 Hauptfunktionen ohne Parameter aufgerufen werden, diese Standards ausgegeben werden.

Zweite Änderung:
Und noch eins. Zur Abfrage ob ein für die Ausgabe benötigtes File existiert wird noch ein File System Objekt benötigt, welche hier im Script nicht auftauch, da ich solche Blöcke wie oben als Includs bei mir einbinde.

Also im vorliegenden Fall:
// @import "%fb2k_path%1stStrike\js\SAPI.js"

Der Befehl für das File System Objekt lautet:
var FSO = new ActiveXObject("Scripting.FileSystemObject");

TomPro

[CUI]

Hier ein weiterer kleiner Helfer für die Scriptsammlung:


//------   Format Multi
function FormatMulti(Field) {
var Helper1, Helper2, Helper3, SP, i;

// Generate arrays for multivalue fields
Helper1 = Field.split("; ");
Helper2 = new Array;

// Change direction if ", " detectet
for (i = 0; i < Helper1.length; i++) {
SP = Helper1[i].lastIndexOf(", ");
if (SP == -1) {
Helper2[i] = Helper1[i];
} else {
Helper2[i] = Helper1[i].substr(SP + 2) + " " + Helper1[i].substr(0, SP);
}
}

// Generate one string by inserting ", " and/or " & " between the multivalues if needed
switch (Helper2.length) {
default:;
case 3:; Helper3 = Helper2.pop();
Field = Helper2.join(", ") + " & " + Helper3; break;
  case 2:; Field = Helper2.join(" & "); break;
  case 1:; Field = Helper2[0]; break;
}
return Field;
}


Beim kompletten auslesen eines Multivalue Fields (Artist, Album Artist, Featuring, Performer, Genre) werden die einzelnen Daten ja üblicherweise durch "; " getrennt. Dies wird benutzt um daraus ein Array mit den jeweiligen Daten zu befüllen, um diese separat noch bearbeiten zu können.

Für alle jene, welche wie ich in den Tags zuerst den Nachnamen, und dann den Vornamen, getrennt durch ein Komma, bzw. "Beatles, The" schreiben, um diese hallt alphanumerisch richtig sortieren zu lassen, wird im nächsten Schritt dieses tuen wieder umgekehrt. Also aus den oben genannten "Beatles, The" wird für die Ausgabe wieder "The Beatles".

Am Schluß wird das Ganze wieder einem normalen String übergeben, dabei wird in Abhängigkeit der Anzahl der Dateien ein " & " oder ", " und vor dem letzten ein " & " geschrieben.

Also :
aus Genesis wird Genesis
aus Queen; Rodgers, Paul wird Queen & Paul Rodgers
aus Morse, Neal; Portnoy, Mike; George, Randy wird Neal Morse , Mike Portnoy & Randy George

Viel Spass.

grimes

Status

liefert den Status verschiedener Funktionen auf einen Blick.

optional: Loop, Gap, Alarm, Timebomb-Skripte (in diesem thread erhältlich)

Screenshot:



//status by grimes
//fb2k 1.0+, WSH Panel Mod 1.3.0+ required
//DUI/CUI ready

function RGB(r, g, b) {
    return (0xff000000 | (r << 16) | (g << 8) | (b));
}

var alarm;
var gap;
var loop;
var timebomb;
var skip;
var playbackorder2 = fb.PlaybackOrder;
var playbackorder;
var cmd2 = "no track started";
var reason2 = "no track stopped";
var paused = fb.IsPaused;
var playing = fb.IsPlaying;
var stopped = !(fb.IsPlaying || fb.IsPaused);
var volume = fb.Volume;
var seektime = 0;

switch (playbackorder2) {
case 0:
    playbackorder = "Default";
    break;

case 1:
    playbackorder = "Repeat (Playlist)";
    break;

case 2:
    playbackorder = "Repeat (Track)";
    break;

case 3:
    playbackorder = "Random";
    break;

case 4:
    playbackorder = "Shuffle (tracks)";
    break;

case 5:
    playbackorder = "Shuffle (albums)";
    break;

case 6:
    playbackorder = "Shuffle (folders)";
    break;

default:
    playbackorder = "undetermined";
}

var dui = window.InstanceType;

//var g_font = gdi.Font("Segoi UI", 12, 0);
var g_font = dui == 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
//var color = RGB(200,0,0);
var color = dui == 1 ? window.GetColorDUI(2) : RGB(200,0,0);
//var color2 = RGB(0,0,0);
var color2 = dui == 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);

function on_paint(gr) {
    gr.FillSolidRect(0, 0, window.Width, window.Height, dui == 1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
    if (fb.CursorFollowPlayback) {
        gr.DrawString("CursorFollowPlayback (" + fb.CursorFollowPlayback + ")", g_font, color, 0, -180, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("CursorFollowPlayback (" + fb.CursorFollowPlayback + ")", g_font, color2, 0, -180, window.Width, window.Height, 0x11005000);
    }
    if (fb.PlaybackFollowCursor) {
        gr.DrawString("PlaybackFollowCursor (" + fb.PlaybackFollowCursor + ")", g_font, color, 0, -160, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("PlaybackFollowCursor (" + fb.PlaybackFollowCursor + ")", g_font, color2, 0, -160, window.Width, window.Height, 0x11005000);
    }
     if (fb.StopAfterCurrent) {
        gr.DrawString("StopAfterCurrent (" + fb.StopAfterCurrent + ")", g_font, color, 0, -140, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("StopAfterCurrent (" + fb.StopAfterCurrent + ")", g_font, color2, 0, -140, window.Width, window.Height, 0x11005000);
    }
    gr.DrawString("Playback Order: " + playbackorder, g_font, color2, 0, -120, window.Width, window.Height, 0x11005000);
    if (playing) {
        gr.DrawString("Playing (" + playing + ")", g_font, color, 0, -80, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("Playing (" + playing + ")", g_font, color2, 0, -80, window.Width, window.Height, 0x11005000);
    }
    gr.DrawString("Last playback starting command: " + cmd2, g_font, color2, 0, -60, window.Width, window.Height, 0x11005000);
    if (stopped) {
        gr.DrawString("Stopped (" + stopped + ")", g_font, color, 0, -40, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("Stopped (" + stopped + ")", g_font, color2, 0, -40, window.Width, window.Height, 0x11005000);
    }
    gr.DrawString("Last reason for playback stop: " + reason2, g_font, color2, 0, -20, window.Width, window.Height, 0x11005000);
    if (paused) {
        gr.DrawString("Paused (" + paused + ")", g_font, color, 0, 0, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("Paused (" + paused + ")", g_font, color2, 0, 0, window.Width, window.Height, 0x11005000);
    }
    gr.DrawString("Volume: " + volume + "dB", g_font, color2, 0, 40, window.Width, window.Height, 0x11005000);
    gr.DrawString("Seektime: " + seektime + "s", g_font, color2, 0, 60, window.Width, window.Height, 0x11005000);
    if (loop) {
        gr.DrawString("Loop (" + loop + ")", g_font, color, 0, 100, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("Loop (" + loop + ")", g_font, color2, 0, 100, window.Width, window.Height, 0x11005000);
    }
    if (gap) {
        gr.DrawString("Gap (" + gap + ")", g_font, color, 0, 120, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("Gap (" + gap + ")", g_font, color2, 0, 120, window.Width, window.Height, 0x11005000);
    }
    if (alarm) {
        gr.DrawString("Alarm (" + alarm + ")", g_font, color, 0, 140, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("Alarm (" + alarm + ")", g_font, color2, 0, 140, window.Width, window.Height, 0x11005000);
    }
    if (timebomb) {
        gr.DrawString("Timebomb (" + timebomb + ")", g_font, color, 0, 160, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("Timebomb (" + timebomb + ")", g_font, color2, 0, 160, window.Width, window.Height, 0x11005000);
    }
    if (skip) {
        gr.DrawString("Skip (" + skip + ")", g_font, color, 0, 180, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("Skip (" + skip + ")", g_font, color2, 0, 180, window.Width, window.Height, 0x11005000);
    }
}

function on_mouse_lbtn(x, y) {
    window.Repaint();
}

function on_cursor_follow_playback_changed(state) {
    window.Repaint();
}

function on_playback_follow_cursor_changed(state) {
    window.Repaint();
}

function on_playlist_stop_after_current_changed(state) {
    window.Repaint();
}

function on_playback_order_changed(new_order_index) {
    switch (new_order_index) {
    case 0:
        playbackorder = "Default";
        break;

    case 1:
        playbackorder = "Repeat (Playlist)";
        break;

    case 2:
        playbackorder = "Repeat (Track)";
        break;

    case 3:
        playbackorder = "Random";
        break;

    case 4:
        playbackorder = "Shuffle (tracks)";
        break;

    case 5:
        playbackorder = "Shuffle (albums)";
        break;

    case 6:
        playbackorder = "Shuffle (folders)";
        break;

    default:
        playbackorder = "undetermined";
    }
    window.Repaint();
}

function on_playback_starting(cmd, is_paused) {
    switch (cmd) {
    case 0:
        cmd2 = "default";
        break;

    case 1:
        cmd2 = "play";
        break;

    case 2:
        cmd2 = "next";
        break;

    case 3:
        cmd2 = "prev";
        break;

    case 4:
        cmd2 = "settrack";
        break;

    case 5:
        cmd2 = "rand";
        break;

    case 6:
        cmd2 = "resume";
        break;

    default:
        cmd2 = "undetermined";
    }
    playing = !is_paused;
    stopped = false;
    paused = is_paused;
    window.Repaint();
}

function on_playback_stop(reason) {
    switch (reason) {
    case 0:
        reason2 = "user";
        break;

    case 1:
        reason2 = "eof";
        break;

    case 2:
        reason2 = "starting another";
        break;

    case 3:
        reason2 = "shutting down";
        break;

    default:
        reason2 = "undetermined";
    }
    stopped = true;
    paused = false;
    playing = false;
    seektime = 0;
    window.Repaint();
}

function on_playback_pause(state) {
    paused = state;
    playing = !state;
    stopped = false;
    window.Repaint();
}

function on_volume_change(val) {
    volume = val;
    window.Repaint();
}

function on_playback_seek(time) {
    seektime = time;
    seektime = (Math.round(seektime * 100)) / 100;
    window.Repaint();
}

function on_notify_data(name, info) {
    if (name === "alarm") {
        alarm = new Boolean(info);
        if (info === "") {
            alarm = false;
        }
        window.Repaint();
    }
    if (name === "gap") {
        gap = new Boolean(info);
        if (info === "") {
            gap = false;
        }
    }
    if (name === "loop") {
        loop = new Boolean(info);
        if (info === "") {
            loop = false;
        }
    }
    if (name === "timebomb") {
        timebomb = new Boolean(info);
        if (info === "") {
            timebomb = false;
        }
    }
    if (name === "skip") {
        skip = new Boolean(info);
        if (info === "") {
            skip = false;
        }
    }
    window.Repaint();
}

function on_colors_changed() {
    color = dui ==1 ? window.GetColorDUI(2) : RGB(200,0,0);
    color2 = dui ==1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
    window.Repaint();
}

function on_font_changed() {
    g_font = dui == 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
    window.Repaint();
}


ADD: Skip (true/false)

grimes

Wieder was zum Ausprobieren...

Skip

Überspringe Tracks mit Ratings kleiner 1,2,3,4,5


//skip by grimes
//fb2k 1.0+, WSH Panel Mod 1.3.0+ required
//DUI/CUI ready


function RGB(r,g,b){ return (0xff000000|(r<<16)|(g<<8)|(b)); }

var g_font = gdi.Font("Segoe UI", 16, 0);
var g_font2 = gdi.Font("Segoe UI", 20, 0);
var g_font3 = gdi.Font("Segoe UI", 12, 0);
var dui = window.InstanceType;
var rating;
var rat = window.GetProperty("Set Rating:", 3);
var skip = false;
var skipping = false;
var count = 0;
//var color = RGB(200,0,0);
var color = dui == 1 ? window.GetColorDUI(2) : RGB(200,0,0);
//var color2 = RGB(0,0,0);
var color2 = dui == 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);


function on_paint(gr){
gr.FillSolidRect(0, 0, window.Width, window.Height, dui == 1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
    if (skip) {
        gr.DrawString("Skip (true) " + count + " x", g_font2, color, 0, -80, window.Width, window.Height, 0x11005000);
    }
    else {
        gr.DrawString("Skip (false)", g_font2, color, 0, -80, window.Width, window.Height, 0x11005000);
    }
    gr.DrawString("Skip track with rating less " + rat, g_font, color2, 0, -40, window.Width, window.Height, 0x11005000);
    if (skipping) {
        gr.DrawString("Skipping", g_font, color2, 0, 0, window.Width, window.Height, 0x11005000);
    }
    gr.DrawString("enable/disable skip = lbtn, set rating = wheel", g_font3, color2, 0, 40, window.Width, window.Height, 0x11005000);
}

function on_mouse_mbtn_down(x,y){
    if (!next){
        next = true; 
    }
    else {
        next = false;
    }
window.Repaint();
}

function on_mouse_lbtn_down(x,y){
    if (!skip){
        skip = true; 
        window.NotifyOthers("skip", "true"); //true
    }
    else {
        skip = false;
        window.NotifyOthers("skip", ""); // false
    }
window.Repaint();
}

function on_playback_new_track(){
    rating = fb.TitleFormat("%rating%");
    rating = rating.Eval();
    rating = parseInt(rating);
    if (rating < rat && skip) {
        skipping = true;
        fb.Next();
        count++;
    }
    else {
        skipping = false;
    }
    window.Repaint();
}

function on_mouse_wheel(delta){
for (i = 0; i<delta; i++) {rat++;}
for (i = 0; i<-delta; i++) {rat--;}
if(rat <= 1) { rat = 1}
    if(rat >= 5) { rat = 5}
window.Repaint();
}

function on_playback_stop(reason) {
    if (reason === 0) {
        count = 0;
        skipping = false;
    }
    window.Repaint();
}

function on_colors_changed() {
    color = dui ==1 ? window.GetColorDUI(2) : RGB(200,0,0);
    color2 = dui ==1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
    window.Repaint();
}

function on_font_changed() {
    window.Repaint();
}




Andre69

Hallo.

Ich finde die Idee eines Albumratings von TomPro gut.
Ich finde auch die Idee von grimes das ganze mit einer Datenbank zu verknüpfen gut. :D
Daran arbeite ich gerade und habe noch Fragen.

Ich habe die Standard Farbe Olive genommen.
Im Playlist View macht er der Lesbarkeit halber die Zeilen in zwei Farben.
Die eine Farbe kann ich mit window.GetColorDUI(1) ermitteln und die andere ?

Andre69

Hier nun das Ranking mit MySQL

Seite 1


Seite2


Code
http://pastebin.com/f122399e3

Der Code ist aus allen Himmelsrichtungen des Internets zusammengeschraubt.
Die Anzeige ist armselig zusammengeschustert und passt nur in das kleine Fenster.

In MySQL muss nur noch eine Tabelle erstellt werden.

CREATE TABLE IF NOT EXISTS `ranking` (
  `track` text NOT NULL,
  `title` text NOT NULL,
  `artist` text NOT NULL,
  `album` text NOT NULL,
  `year` year(4) NOT NULL,
  `played` smallint(6) NOT NULL,
  `tstamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


Villeicht kann das ja jemand brauchen.  8)

tedgo

Interessante Sache, dieses Ranking.
Vielleicht übernehme ich die Idee.

Dein Code ließe sich aber um einiges "erleichtern".
Speziell in on_paint stellst du ja eine Menge an.

Übrigens:
Für die ColorType*** und FontType*** braucht man nicht zwingend die Variablen einbauen.
Es reicht, wenn du die Variablen oben weglässt und dafür z. B. anstatt window.GetColorCUI(ColorTypeCUI.text) nur die zugeordnete Zahl, also window.GetColorCUI(0) aufrufst.
Ist zwar für den "Leser" des Codes weniger übersichtlich (wenn er die zugeordneten Zahlen nicht kennt), aber je weniger im Code steht, um so schneller lädt er.
Macht immerhin einen minimalen Performance-Gewinn. Natürlich nur spürbar, wenn du deinen ganzen Code etwas entrümpelst. Z. B. auch statt DrawString GdiDrawText verwendest.

PS: Oh, ein seltener Anne Clark Hörer. Mir wird ganz warm ums Herz  :)

grimes

Super, es funzt!!  Super Arbeit. :crazy:

Habe jetzt eigentlich nichts zum Kritisieren...
Vielleicht die Grafik zum "Umblättern" (siehe Screenshot: roter Kreis). Woher bekomme ich die? Und passt das dann zu meinem Hintergrund?

Screenshot des Panels:


Dann mal ne Frage, werden auf Seite 1 immer nur die ersten 10 Einträge der Datenbank gezeigt? Besser wären die letzten 10, aber es gibt ja schon "show recently played"...

Andre69

Danke.

Ja, Codeoptimierung ist noch ein Thema -- später. ;)

Auf Seite 1 werden die Top 10 der am meisten gehörten Lieder angezeigt.

Wer schon foo_playcount benutzt kann das nutzen um die Datenbank mit den Infos zu füllen.

Man braucht dazu foo_texttools. In dessen config erstellt man den Pattern: "%track%##%title%##%artist%##%album%##%date%##%play_count%##%first_played%" mit dem Namen ranking
Unter Library - Search gibt man ein "%play_count% GREATER 0" und erstellt eine neue Playlist. Alle Titel markieren - rechte Maustaste und "Utilities - Text Tools - copy:ranking"
Das ganze dann in Notepad++ einfügen. Mit ersetzen die Anführungsstriche Escapen also " mit \" ersetzen dann ^(.*) mit "\1 dann ## mit ";" ersetzen und (.*)$ mit \1" ersetzen (Nicht vergessen "reguläre Ausdrücke" anzuschalten). Das ganze als liste.csv abspeichern und mit phpMyAdmin in die Datenbank Importieren.

Du kannst das Bild im Anhang benutzen oder den anderen Code benutzen :D

Geänderte Version ( die Seiten werden mit Mausrad gewechselt [macht den Code schonmal schlanker])
http://pastebin.com/f67eff569

grimes

ZitatAuf Seite 1 werden die Top 10 der am meisten gehörten Lieder angezeigt.

Ach, ich hatte die alle bisher nur einmal gespielt und deswegen die Funktion nicht erkannt.
Ich habe mir allerdings schon eine playlist "playcount sorted" gemacht, das diese Funktion übernimmt. Habe deswegen die Top 10 aus dem Skript genommen. Dann aus den Top 5 (Album, Artist) ne Top 10 Liste gemacht.

Zur Datenbank: Kann man nicht auch noch den "Rating"-Tag in die Datenbank einlesen lassen. Wenn die Datenbank einigermaßen gefüllt ist, kann man dann z.B. "Album-Ratings" oder "Artist-Ratings" erstellen.
ZitatDu kannst das Bild im Anhang benutzen oder den anderen Code benutzen Lachend
Anhang??? Ahh. Gefunden!!

EDIT: Typo

grimes

ZitatMan braucht dazu foo_texttools. In dessen config erstellt man den Pattern: "%track%##%title%##%artist%##%album%##%date%##%play_count%##%first_played%" mit dem Namen ranking
Unter Library - Search gibt man ein "%play_count% GREATER 0" und erstellt eine neue Playlist. Alle Titel markieren - rechte Maustaste und "Utilities - Text Tools - copy:ranking"
Das ganze dann in Notepad++ einfügen. Mit ersetzen die Anführungsstriche Escapen also " mit \" ersetzen dann ^(.*) mit "\1 dann ## mit ";" ersetzen und (.*)$ mit \1" ersetzen (Nicht vergessen "reguläre Ausdrücke" anzuschalten). Das ganze als liste.csv abspeichern und mit phpMyAdmin in die Datenbank Importieren.

Bekomme Fehlermeldung:
ZitatFatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 33759742 bytes) in C:\xampp\phpMyAdmin\libraries\sqlparser.lib.php  on line 222


EDIT: So sieht die Syntax von liste.cvs aus:

"01;Intro Tape and Audience;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;8;2008-08-20 17:21:30"
"02;Time and a Word;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;4;2008-07-15 04:48:27"
"03;Owner of a Lonely Heart;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;3;2008-08-02 23:59:38"
"04;Teakbois;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;2;2008-08-23 23:47:50"
"05;Clap;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;3;2008-07-15 04:51:08"
"06;Mood for a Day;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;4;2008-07-30 00:17:17"
"07;Keyboard Solo;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;1;2008-07-11 23:55:38"
"08;Long Distance Runaround;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;1;2008-12-04 13:42:01"


EDIT2: Ich Hirni, die Datei muss ja liste.csv statt liste.cvs heissen :-[

Jetzt: Ungültige Anzahl an Feldern in Zeile 1.

Andre69

Zitat"01;Intro Tape and Audience;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;8;2008-08-20 17:21:30"
"02;Time and a Word;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;4;2008-07-15 04:48:27"
"03;Owner of a Lonely Heart;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;3;2008-08-02 23:59:38"
"04;Teakbois;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;2;2008-08-23 23:47:50"
"05;Clap;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;3;2008-07-15 04:51:08"
"06;Mood for a Day;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;4;2008-07-30 00:17:17"
"07;Keyboard Solo;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;1;2008-07-11 23:55:38"
"08;Long Distance Runaround;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;1;2008-12-04 13:42:01"


EDIT2: Ich Hirni, die Datei muss ja liste.csv statt liste.cvs heissen :-[

Jetzt: Ungültige Anzahl an Feldern in Zeile 1.
Ja, weil jedes feld mit " abgeschlossen werden muss. Du musst wie oben in der Anleitung steht aus ## ";" machen. Also aus doppelkreutzdoppelkreutz anführungsstrichesemikolonanführungsstriche.
Sollte dann so aussehen:

"02";"Time and a Word";"Yes";"Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1)";"1989";"4";"2008-07-15 04:48:27"


ZitatZur Datenbank: Kann man nicht auch noch den "Rating"-Tag in die Datenbank einlesen lassen. Wenn die Datenbank einigermaßen gefüllt ist, kann man dann z.B. "Album-Ratings" oder "Artist-Ratings" erstellen.
Gute Idee. Werde das mal hinzufügen.

Andre69


  • So, Code überarbeitet und vereinfacht.
  • Der Text passt sich jetzt dem Fenster an ( naja fast ).
  • Rating hab ich mal hinzugefügt.
http://pastebin.com/f24265311

Zitat von: tedgo in 23. Januar 2010, 09:31:22
PS: Oh, ein seltener Anne Clark Hörer. Mir wird ganz warm ums Herz  :)
Naja, höre ich nicht mehr so oft. Die gepostete Liste war nur aus Testzwecken.  ::)

PS: Diese Thread könnte eigendlich ins Customize root verschoben werden. WSH Panel ist ja DUI/CUI.

grimes

Der Code gefällt mir immer besser. :top:

Zu den Ratings: Du hast bisher die Summe aller Ratings pro album oder artist (SELECT SUM(rating)). Besser wäre Summe der Ratings / Anzahl tracks eines Albums oder Artists (Durchschnittlicher Wert). Sonst landen Alben mit 100 tracks immer ganz oben auf der Liste.

tedgo

@Andre69
Zitat von: Andre69 in 23. Januar 2010, 18:35:36
PS: Diese Thread könnte eigendlich ins Customize root verschoben werden. WSH Panel ist ja DUI/CUI.
Darüber haben grimes und ich schon diskutiert.

Bevor wir aber irgendwas irgendwo hinschieben, möchte ich alle Script-Schreiber bitten, ihre geposteten Scripts auf Kompatibilität zu DUI zu überprüfen und gegebenenfalls - falls eine Kompatibilität nicht gegeben ist - Scriptteile dahingehend zu ergänzen.
Falls nicht gewünscht ist, ein Script kompatibel zu machen, dann bitte ich darum, dass die entsprechenden Scripts mit einem vorangestelltem [CUI] kenntlich gemacht werden.

Das gilt auch für künftig gepostete Scripts.
Falls also ein Script nur für CUI oder DUI ist, dieses bitte entsprechend mit [CUI] bzw. [DUI] kenntlich machen.
Dann können wir den Thread verschieben.
Danke.