Timer läuft beim wechsel weiter

  • JavaScript

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Mokki.

    Timer läuft beim wechsel weiter

    Guten Tag!

    Zusammenfassung:
    Ich arbeite derzeit an einem kleinen Projekt, was mit der Youtube Iframe API arbeitet.

    Ich hab bisher alles fertig, jedoch wenn das Lied zu ende ist, wird dann der Timer gestoppt ( clearInterval(timer) ), aber auf eine Mysteriöse Art und Weise läuft er einfach wieder.
    Ich hab schon gedebuggt, da steht in der Konsole auch, das der Timer gestoppt wurde. Aber dann läuft er weiter und zählt in der Datenbank +1 hoch.
    -----------------------------------
    Was wird genau getan?
    Video ID's werden von der Datenbank via. Ajax geholt und die Musik wird abgespielt. Falls das Video zu ende ist, wird das nächste Video abgespielt (sofern vorhanden).

    Was ist das Problem?
    Das Video wird zwar abgespielt, aber in der Datenbank wird jede Sekunde ein neuer Wert eingetragen. Somit, wenn die Besucher die Seite neuladen immer an der selben Stelle sind.
    1sek => currentLength + 1 <- (Query)

    Request kann und darf nur von VOM Server selbst gemacht werden bzw. das Update-Request, damit in der Datenbank ständig +1 passiert.
    Aber das Problem ist der Timer. Der Timer startet am Anfang der Website als erstes, wenn die Musik läuft (YT.PLayerState.PLAYING Event).

    Das heißt, wenn er die Musik via. Ajax-Request geholt hat und das JSON-decoded hat, wird der Timer gestartet und die Musik.
    Wenn die Musik endet, wird ein neuer Request gemacht, damit der nächste Titel ausgewählt wird. Das Problem ist dann wieder, das der Timer von der ersten Musik nicht anhaltet.
    Somit laufen dann 2x Timer und er updated jede Sekunde immer 2 Einträge.

    Aber wenn der nächste Titel dran ist, dann wird von der alten Musik die Spalte "currentLength" auf 0 gesetzt. Damit die Musik auch wieder von vorne spielt.

    ---------------------------
    Mein Code:

    HTML-Quellcode

    1. $(document).ready(function() {
    2. $('#loader').css('width', '100%');
    3. });
    4. var volume = $('#volume').slider();
    5. var tag = document.createElement('script');
    6. tag.src = 'https://www.youtube.com/iframe_api';
    7. var firstScriptTag = document.getElementsByTagName('script')[0];
    8. firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
    9. var player;
    10. function onYouTubeIframeAPIReady() {
    11. player = new YT.Player('player', {
    12. height: '0',
    13. width: '0',
    14. events: {
    15. 'onReady': onPlayerReady,
    16. 'onStateChange': onPlayerStateChange
    17. },
    18. playerVars: {
    19. controls: 0,
    20. iv_load_policy: 3,
    21. html5: 1,
    22. rel: 0,
    23. wmode: 'transparent',
    24. showinfo: 0
    25. }
    26. });
    27. }
    28. $('#volume').on('change', function() {
    29. player.setVolume(volume.slider('getValue'));
    30. });
    31. $(document).on('click', ".fa-pause", function () {
    32. $('#playerControl').each(function() {
    33. $('#playerControl').removeClass('fa-pause');
    34. $('#playerControl').addClass('fa-play');
    35. });
    36. stopVideo();
    37. });
    38. $(document).on('click', ".fa-play", function () {
    39. $('#playerControl').each(function() {
    40. $('#playerControl').removeClass('fa-play');
    41. $('#playerControl').addClass('fa-pause');
    42. });
    43. $.ajax({
    44. type: 'POST',
    45. url: '{{ \Illuminate\System\Config::get(["url"]) }}/player/current',
    46. success: function(x) {
    47. console.log(x);
    48. var obj = jQuery.parseJSON(x);
    49. playVideo(obj.id, obj.current);
    50. $('.videoTitle').empty();
    51. $('.videoTitle').append(obj.name);
    52. }
    53. });
    54. });
    55. function onPlayerReady(e) {
    56. player.setVolume(volume.slider('getValue'));
    57. }
    58. var done = false;
    59. var timer;
    60. function onPlayerStateChange(e) {
    61. if (e.data == YT.PlayerState.PLAYING && !done) {
    62. stopVideo();
    63. $('#playerControl').removeClass('fa-pause');
    64. $('#playerControl').addClass('fa-play');
    65. $('.videoTitle').append(e.target.getVideoData().title);
    66. done = true;
    67. }
    68. if(e.data == YT.PlayerState.PAUSED && !done) {
    69. playVideo();
    70. $('#playerControl').removeClass('fa-pause');
    71. $('#playerControl').addClass('fa-play');
    72. done = true;
    73. }
    74. if(e.data == YT.PlayerState.PLAYING) {
    75. createTimer(e.target.getVideoData().video_id); //Hier wird der Timer gestartet, falls die Musik spielt
    76. }
    77. if(e.data == YT.PlayerState.ENDED) {
    78. $.ajax({
    79. type: 'POST',
    80. url: '{{ \Illuminate\System\Config::get(["url"]) }}/player/next/'+e.target.getVideoData().video_id,
    81. success: function(x) {
    82. clearInterval(timer); //Hier wird der Timer vom ersten Title gestoppt!
    83. console.log('Stopped: ' + e.target.getVideoData().video_id);
    84. window.setTimeout(function() {
    85. var obj = jQuery.parseJSON(x);
    86. playVideo(obj.id, obj.current);
    87. $('.videoTitle').empty();
    88. $('.videoTitle').append(obj.name);
    89. }, 1500);
    90. }
    91. });
    92. }
    93. }
    94. function createTimer(videoID) {
    95. timer = window.setInterval(function() {
    96. $.ajax({
    97. type: 'POST',
    98. url: '{{ \Illuminate\System\Config::get(['url']) }}/player/update/' + videoID,
    99. success: function(x) {
    100. console.log(videoID);
    101. }
    102. })
    103. }, 1000);
    104. }
    105. function stopVideo() {
    106. player.stopVideo();
    107. }
    108. function playVideo(id, time) {
    109. player.loadVideoById(id, time);
    110. player.playVideo();
    111. }


    Ich habe ein Bild von der Konsole nochmal als Dateianhang hochgeladen.
    Danke für eure Aufmerksamkeit!

    Mit freundlichen Grüßen

    EDIT1 - Das mit den komischen Namen sind die ID's der Videos.
    ID = Timer gestartet*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „meikel__“ ()