ppvm_player.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. // @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3-or-Later
  2. function setup_playback(description) {
  3. document.getElementById("no-script").classList.remove("noscript");
  4. document.getElementById("controls").classList.add("javascript");
  5. video_manifest = description;
  6. console.log(description);
  7. player = document.getElementById("player");
  8. player.addEventListener("pause", (event) => playStateChanged(false));
  9. player.addEventListener("playing", (event) => playStateChanged(true));
  10. filteredOptions = filterOptions(description.entries);
  11. if(filteredOptions.length == 0){
  12. player.src = "invalid://invalid";
  13. document.getElementById("unplayable-modal").showModal();
  14. return;
  15. }
  16. player.src = filteredOptions[0].path;
  17. qualitySelector = document.getElementById("quality-selector");
  18. filteredOptions.forEach(option => {
  19. opt = document.createElement("option")
  20. opt.value = option.path;
  21. opt.innerHTML = option.label;
  22. qualitySelector.appendChild(opt);
  23. });
  24. startRes = findOptimalOptionForScreen(filteredOptions);
  25. qualitySelector.value = startRes.path
  26. qualitySelected();
  27. doSpeedTest(startRes, filteredOptions);
  28. }
  29. function qualitySelected() {
  30. qualitySelector = document.getElementById("quality-selector");
  31. player = document.getElementById("player");
  32. paused = player.paused;
  33. time = player.currentTime;
  34. player.src = qualitySelector.value;
  35. player.load();
  36. player.currentTime = time;
  37. if(!paused) {
  38. player.play();
  39. }
  40. }
  41. function filterOptions(options) {
  42. player = document.getElementById("player");
  43. return options.filter(o => o.type === "video" && player.canPlayType(`${o.mimetype}; codecs="${o.metadata.codecs}"`));
  44. }
  45. function findOptimalOptionForScreen(options) {
  46. screenSize = Math.max(window.screen.width, window.screen.height);
  47. screenSize = screenSize * window.devicePixelRatio
  48. filtered = options.filter(o => o.type === "video" && Math.max(o.metadata.size.split("x")[0], o.metadata.size.split("x")[1]) <= screenSize);
  49. console.log(filtered);
  50. if(filtered.length == 0){
  51. return options[options.length - 1];
  52. }
  53. return filtered[0];
  54. }
  55. function downloadVideo() {
  56. document.getElementById("download-modal").showModal();
  57. }
  58. function showInfo() {
  59. document.getElementById("info-modal").showModal();
  60. }
  61. function shareVideo() {
  62. document.getElementById("share-modal").showModal();
  63. }
  64. function playStateChanged(playing) {
  65. controls = document.getElementById("controls")
  66. if(playing) {
  67. controls.classList.remove("paused")
  68. }
  69. else {
  70. controls.classList.add("paused")
  71. }
  72. }
  73. function doSpeedTest(currentOption, options) {
  74. startTime = window.performance.now();
  75. request = new XMLHttpRequest();
  76. request.onreadystatechange = function() {
  77. if(request.readyState === 2) {
  78. // Reset start time, headers received.
  79. startTime = window.performance.now();
  80. }
  81. if(request.readyState === 4 && (request.status === 200 || request.status === 206)) {
  82. endTime = window.performance.now();
  83. size = request.response.size;
  84. rate = size / ((endTime - startTime) / 1000)
  85. console.log(`Detected connection rate: ${rate} bytes/sec`);
  86. filtered = options.filter(o => o.type === "video" && o.byterate < rate);
  87. if(filtered.length == 0) {
  88. filtered = [options[options.length - 1]];
  89. }
  90. optimal = findOptimalOptionForScreen(filtered);
  91. if(optimal !== currentOption) {
  92. qualitySelector.value = optimal.path
  93. console.log("Switched res");
  94. qualitySelected();
  95. }
  96. else {
  97. console.log("Got it right first try B)");
  98. }
  99. }
  100. }
  101. requestSize = Math.min(options[0].filesize, Math.round(options[0].byterate));
  102. request.open("GET", options[0].path);
  103. request.responseType = "blob";
  104. request.setRequestHeader("Range", `bytes=0-${requestSize}`);
  105. request.send();
  106. }
  107. // @license-end