videos werden nicht (mehr) geladen: jquery.unveil.js / jquery.js

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

YotErra

Mitglied
hey ihr lieben,
nach sehr viel arbeit und sehr viel hilfe in veränderung der .js habe ich eine youtube-songliste erstellt:
POZILEI (ich selbst von .js kaum ahnung...)

alles in der jquery.unveil.js / jquery.js wurde hier dank des forums quasi traumhaft angepasst: damit nur geladen wird was sichtbar, und beim scrollen nur geladen wenn scrollbalken steht (damit nicht beim ganz ans ende scrollen alles sichtbare geladen wird) und wenn ein neues video angeklickt wird wird das laufende automatisch gestoppt. träumchen. theoretisch milliarden links möglich ohne ladezeitperformence zu killen... (theoretisch)

dann irgendwann gab es aber praktisch schon mal einen ladefehler, da hat youtube was geändert, die videos wurden nicht mehr reingeladen. hier im forum wurde herausgefunden woran es lag. u.a. in der index.html zeile 450 (Brackets)

function onPlayerReady(event) {
$(event.target.f).prev("img").hide(); // bis Juni 2020 "event.target.a" -> jquery unveil funktioniert nicht mehr ;
}

und nun werden die videos schon seit etlichen monaten wieder nicht geladen...
ist hier jemand der ggf. helfen kann dies zu beheben?
YotErra
 
Zuletzt bearbeitet:

Sempervivum

Erfahrenes Mitglied
Hallo YotErra und Willkommen zurück!
Ich habe mir das angesehen und das Ergebnis ist, dass Youtube mal wieder etwas geändert hat: Den iFrame bekommt man jetzt durch event.target.h. Wenn Du das änderst, müsste es wieder funktionieren.
So weit die schnelle Lösung. Es gibt auch noch einen anderen Weg, und zwar kann man über die Funktion getVideoData() die ID des Videos heraus finden und darüber wieder das Ladebild. Dazu müsste aber die Video-ID dem Ladebild zugeordnet werden, z. B. als data-Attribut:
Code:
        function onPlayerReady(event) {
            const
                // Video-ID aus Videodaten auslesen:
                videoid = event.target.getVideoData().video_id,
                // daraus das Ladebild ermitteln:
                loadingImg = $('img[data-video-id="' + videoid + '"]');
            // und das Ladebild verbergen:
            loadingImg.css('display', 'none');
https://www.tutorials.de/threads/jquery-unveil-funktioniert-nicht-mehr.409127/#post-2117955 ;
        }

        function createPlayer(id) {
            // der ursprüngliche iFrame, der im HTML-Text steht.
            // dieser wird später zunächst durch ein div und dann
            // wieder durch den iFrame von YT ersetzt.
            const iFrame = $("#" + id);

            // Video-ID beim Ladebild als data-Attribut speichern:
            iFrame.prev('img').attr('data-video-id', players[id].videoid);

            iFrame.replaceWith('<div id="' + id + '"></div>');
            players[id].player = new YT.Player(id, {
                height: '226',
                width: '400',
                videoId: players[id].videoid,
                events: {
                    'onStateChange': onPlayerStateChange,
                    'onReady': onPlayerReady
                }
            });
            players[id].created = true;
        }
(ungetestet)
Natürlich hat man dann auch keine Garantie, dass YT nicht etwas wieder ändert, aber solch eine Getter-Funktion sollte eigentlich stabiler sein.
 

YotErra

Mitglied
hey Sempervivum - jajajaja - es funktionert mit h! POZILEI
tausend dank!
ich probiere in den kommenden wochen mich auch in die getVideoData() reinzufuxen - habe allerdings nach wie vor keinen js plan, da werde ich bestimmt Fragen fragen.

Sehr nervig ist auch dies andauernde "Dieses Video ist nicht verfügbar." - dafür gibt es bestimmt keinen anderen trick als regelmäßig zu checken und ggf. neuen link einfügen, wa?
 

Sempervivum

Erfahrenes Mitglied
Sehr nervig ist auch dies andauernde "Dieses Video ist nicht verfügbar."
Dazu habe ich mich ein wenig umgesehen und dieses gefunden:
How can I detect if YouTube videos have been removed using their iFrame API
Man kann es also über die API erkennen und z. B. in die Console schreiben. Oder, etwas aufwändiger, mit Ajax an den Server schicken und in ein Logfile schreiben.
Allerdings, die Aktivitäten um das zu reparieren, kann man wahrscheinlich nicht automatisieren.
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…