Bitte um denkanstoss - Wiedergabemodus in eigenem Playlistscript steuern

  • Hallo Experten,

    ich bin in Javascript sehr neu und nutze den JWPlayer aus dem Hause Longtailvideo für eine Musiksuchmaschine. Der User kann in einer Top-Liste und Suchfunktion Lieder suchen und diese in seine Playlist hinzufügen.

    Die Playlist ist nur ein div im DOM Baum und wird nicht in eine DB gepflegt oder sonstiges. Im JS Code wird nun aus dem DIV der Titel und die ID per match extrahiert und daraus dann die Playlist erstellt.

    Der Player hat ein onComplete() Event welches aufgerufen wird wenn ein Titel zuende ist. In diesem Event wird die Playlist neu gematcht (der User kann ja während
    dem hören den Playlistinhalt oder die Reihenfolge verändert haben) und die Position des aktuellen Titels (getPlaylistItem() des players) mit
    indexOf im Array der Titel bestimmt. Daraufhin wird der nächste titel abgespielt.

    Nun weiß ich nicht wie ich folgende Problematik umgehen kann:

    Wenn ein Titel mehrfach in der Playlist vorhanden ist findet indexOf ja das erste Vorkommen. Immer wenn der Player dann bei dem Titel, der
    mehrfach in der Playlist ist, angekommen ist springt er natürlich zum Lied nach dem ersten Vorkommen zurück.

    Und wenn der aktuell abgespielte Titel gelöscht wird fängt die Playlist bei Index 0 an (wegen Zeile 47-51 im Script, wo der geklickte Titel + die PlaylistTitel aufsteigend eingetragen werden wenn der aktuelle Titel nicht oder nicht mehr in der Playlist ist.)

    Jetzt die sicherlich erwartete Frage:
    Wie konnte ich diese "bugs" fixen?

    Vielen Dank für euere Hilfe !

    Ich stell mal noch das Script in nen Codeblock:

  • wichtig wär hier auch nochmal die playlist zu sehen und die einfachste lösung liegt auf der hand :)
    durchlaufe das array mit einer anderen id und verpass dem div nen data-id attribut (is zwar nicht valide unter halb allem was nicht html 5 is, sollte aber keine side-effects haben) dann durchlaufe deine playlist, such dort nach der element-ID , die es nur 1 mal geben darf und lies vom element das attribut aus, um den player mit neuem stoff zu versorgen

  • alternativ kannste bereits gespielte elemente entfernen aus der liste und in einem hidden div sichern, für das neuladen der liste nachdem die durchlaufen wurde :)

    und dein code ist grausig, aber das nur am rande.
    ich empfehle dir javascript auszulagern und mit jquery zu arbeiten, da haste nen wesentlich übersichtlicheren code ;)

  • Das Problem mit den doppelten Titel hab ich unter anderm mit deiner Hilfe lösen können, aber ich verstehe deinen Tipp nicht...

    [code}alternativ kannste bereits gespielte elemente entfernen aus der liste und in einem hidden div sichern, für das neuladen der liste nachdem die durchlaufen wurde[/code]

    Wenn ich das mache dann würden ja alle schonmal gespielten titel nicht mehr kommen !!!???

    Sag mir mal ob ich dich nicht verstehe, oder ob ich nicht weiss was du meinst, oder hast du nicht verstanden wie die liste funktionieren soll !?

    Das Problem wegen einem gelöschten Titel habe ich noch nichtmal ansatzweise gelöst Kannst mir da noch helfen.

    grüsse

  • das heisst du sammelst das was bereits lief in einem anderen div, zählst die elemente in deiner playlist, die einen eintrag widerspiegeln und sobald du auf 0 bist hauste inhalt aus dem hidden div in deine playlist rein und startest bei beim ersten element erneut.
    zum index:
    da die seite ja nicht neu lädt, kannst du doch die zu spielende position als start-index nehmen oder nicht?
    einfach den wert in ner variablen speichern.
    und du solltest dir bei solchen dingen echt mal gedanken um die nutzung von jQuery machen, damit ist das ganze wesentlich komfortabler zu lösen ;)

  • Hi synaptic !

    ...das würde ja im Prinzip nur die Playlist von vorn nach hinten spieln. Das tut ja schon.

    oder siehst du das anders ?

    Schöne Grüsse

  • nee eben net..
    also das vorn nach hinten is bei normalem durchlaufen und dadurch dass du die gelaufenen tracks "entfernst" (eher: verschiebst)kannst du auch jederzeit die liste von vorne starten.
    und das mit dem index muss über eine globale variable laufen die du innerhalb der funktionen fütterst, so kannste dir die stelle merken, wo du gewesen bist, wenn ein track gelöscht wird.

    aber ich muss auch gestehen, es ist müßig, wenn du nur so sporadisch reinschaust, ich muss mir jedes mal das gesamte thema neu ansehen, um zu checken, worum es eigentlich geht

  • Hi !

    Ich habe nicht alles so gemacht wie du es empfohlen hast ( kam damit nicht zurecht ), aber bin schon fast am Ziel. Habe nur mehr einen Fehler, und der wird ab dem zweiten Titel ausgegeben. Du siehst den Fehler links oberhalb vomm Player beim Titel da steht dann z.B. Sie hören: Hugo - 99 Problems' , '6 also wird mir irgendwo die Reihenfolge im Titel mitgegeben.

    Hätte es ja gerne so gemacht wie du schreibst, aber blicke da echt nicht durch.

    Sieh mal http://bewerbung.wmw.cc/play2

    Lg

  • Nachtrag :)

    Gelegentlich kommt auch einfach,

    Sie hören:2 komplett ohne Titel :)

  • Sorry für die Zeitabstände.

    Hier ist der Code, der den Titel setzt:

    Code
    jwplayer().onPlaylistItem(
    function(){
    var item = jwplayer().getPlaylistItem();
    var itemx = item.title;
    document.getElementById('player_titel').innerHTML = 'Sie hören: '+itemx;
    }
    );

    Das onPlaylistItem Event wird aufgerufen, sobald sich der Titel im Player ändert.

    getPlaylistItem gibt das Objekt des aktuellen Titels zurück (enthält link (url des youtube vids), title(Titel des Liedes), description (in meinem Fall die ID des Videos) und tags(in meinem Fall visible oder wenn das Video gelöscht wurde hidden).

    Wenn man einen Titel anklickt wird durch folgenden Code der Titel in das Playlistarray (links) eingefügt:


    links.push({file:'http://www.youtube.com/v/'+clickedVid , title: clickedVidTitel , description: clickedVidNumb , tags: 'visible'});

    Das array wird dann als Playlist in den Player eingefügt.

    Und dann gibt es noch das onComplete() Event vom Player.

    Dieses wird angestoßen wenn ein Lied fertig gespielt ist, bevor das nächste anfängt.

    Darin ist folgender Code enthalten:

    Ich hoffe die Kommentare machen dir den Code bisschen logisch.

  • na aber offensichtlich gibt es doch dann beim rückgabewert nen problem...
    du müsstest immer eine ausgabe bekommen, außer das playlistitem ist "defekt".
    haste schomma bei longtail direkt angefragt im forum? die sollten mit dem player mehr expertise aufbringen können, als wir/ich hier.
    hab den player bisher nur gesehen, nie benutzt ;)

  • Also es muss an meinem Code liegen. In den früheren Versionen
    z.B. http://bewerbung.wmw.cc/play/
    funktioniert es richtig, da kommt immer der gewünschte Titel.

    Erst seit der letzten Änderung (ID in description und visible/hidden in tags des playlist items) tritt der Fehler auf.

    Es wirkt als könnte er das Ende der Attribute nicht richtig erkennen weil ja manchmal auch titel' , 'nummer erscheint.

  • mmh seltsam..
    also ich bräuchte mal die lokalen files als entwicklungs-zip-file, damit ich mir das alles zusammen mal genauer ansehen kann.
    bzw haste da einiges, was ich eh anders machen würde^^ aber darum gehts ja hier net..
    ööhm ich kann auch derzeit nich sagen, bis wann ich da durch wäre, da ich morgen wieder ins büro muss (hatte urlaub) und erstma sehen muss, wieviel ich dort zu tun haben werde.

  • Okay ich habs gefunden.

    Ich hatte einen dritten Parameter hinzugefügt im onclick event, der den Titel in den Playlist schießt und vergessen den regExp beim matchen anzupassen.

    Danke für deine Hilfe und Bemühungen =)