ARD Mediathek Download

Erweitert den Video-Player um einen Download-Button.

  1. // ==UserScript==
  2. // @name ARD Mediathek Download
  3. // @namespace schwarztee
  4. // @description Erweitert den Video-Player um einen Download-Button.
  5. // @include http://www.ardmediathek.de/*
  6. // @copyright 2015, schwarztee
  7. // @license MIT
  8. // @version 0.1.2
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. 'use strict';
  13.  
  14. (function(){
  15. // Helfer: DOM-Element finden
  16. function find( selector ) { return document.querySelector( selector ); }
  17. // Video-URL finden
  18. function findVideoURL()
  19. {
  20. // nach HTML5-Player suchen
  21. var htmlVideo = find( 'video.ardplayer-mediacanvas source' );
  22. // nach Flash-Player suchen
  23. var flashObject = find( 'object.ardplayer-mediacanvas' );
  24. // HTML5 gefunden?
  25. if ( htmlVideo )
  26. {
  27. // URL einfach von src-Attribut nehmen
  28. return htmlVideo.src;
  29. }
  30. // Flash gefunden?
  31. if ( flashObject )
  32. {
  33. // Player-ID herausfinden
  34. var id = flashObject.id.replace( /\w+_(\d+)/, '$1' );
  35. // relevante Konfiguration holen
  36. var player = window.ardplayer[ 'eventCtrlplayer_'+id ];
  37. // Daten zum aktuellen Stream erfahren
  38. var currentStream = player.getPlayingStreamObject();
  39. // URL extrahieren
  40. var url = currentStream._stream;
  41. // mp4-Link in URL vorhanden?
  42. if ( /^http.*mp4$/.test( url ) )
  43. {
  44. // passt, URL zurückgeben
  45. return url;
  46. }
  47. else
  48. {
  49. // hmm, wahrscheinlich liegt RTMP-Stream vor
  50. // na gut, dann versuchen, alle mp4-Streams zu holen
  51. var mediaStreamArray = player.mc._mediaArray[1]._mediaStreamArray;
  52. // Stream mit passender Qualität finden
  53. for ( var index = 0; index < mediaStreamArray.length; index++ )
  54. {
  55. // Qualität dieses Streams gleich der des aktuell abgespielten?
  56. if ( mediaStreamArray[index]._quality == currentStream._quality )
  57. {
  58. // perfekt, URL(s) zu dieser Datei extrahieren
  59. url = mediaStreamArray[index]._stream;
  60. // falls mehrere Dateien zu dieser Qualität vorliegen…
  61. if ( url.length && url[0].length > 1 )
  62. {
  63. // …einfach die erste nehmen
  64. return url[0];
  65. }
  66. else
  67. {
  68. // ansonsten direkt die gefundene URL zurückgeben
  69. return url;
  70. }
  71. }
  72. }
  73. }
  74. }
  75. // kein Video gefunden
  76. return false;
  77. }
  78. // Download-Button einrichten
  79. function setupDownloadButton( url )
  80. {
  81. // Container für Steuer-Buttons zurechtlegen
  82. var controlBar = find( '.ardplayer-player-funktion' );
  83. // nach schon vorhandenem Download-Link suchen
  84. var link = find( 'a.video-download' );
  85. // falls noch nicht vorhanden
  86. if ( !link )
  87. {
  88. // Klassenname für Abspiel-Button
  89. var buttonClass = 'ardplayer-btn-playpause';
  90. // hübschen Button erzeugen
  91. var button = document.createElement( 'button' );
  92. button.setAttribute( 'title', "Video herunterladen" );
  93. button.setAttribute( 'class', buttonClass );
  94. button.setAttribute( 'style', 'transform: rotate(90deg); border: 0;' );
  95. // Mouseover-Effekt für Button
  96. button.onmouseenter = function() { button.setAttribute( 'class', buttonClass+' hover' ); };
  97. button.onmouseleave = function() { button.setAttribute( 'class', buttonClass ); };
  98. // frischen Link erzeugen
  99. link = document.createElement( 'a' );
  100. link.setAttribute( 'class', 'video-download' );
  101. link.target = '_blank';
  102. // neuen Button verlinken und den anderen Buttons voranstellen
  103. link.appendChild( button );
  104. controlBar.insertBefore( link, controlBar.childNodes[0] );
  105. }
  106. // URL setzen
  107. link.href = url;
  108. }
  109. // letzte Video-URL merken
  110. var lastURL = '';
  111. // Button hinzufügen oder erneuern
  112. function manageButton()
  113. {
  114. // aktuelle Video-URL suchen
  115. var newURL = findVideoURL();
  116. // URL vorhanden und geändert?
  117. if ( newURL && newURL != lastURL )
  118. {
  119. // Entwicklerinformation
  120. console.log( "[ARD Mediathek Download] Stream-URL:", newURL );
  121. // Download-Button hinzufügen oder aktualisieren
  122. setupDownloadButton( newURL );
  123. // neue URL merken
  124. lastURL = newURL;
  125. }
  126. }
  127. // regelmäßig DOM prüfen; ein neuer Player kann jederzeit geladen werden
  128. setInterval( manageButton, 1000 );
  129. })();