ppvm_player.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. }
  28. function qualitySelected() {
  29. qualitySelector = document.getElementById("quality-selector");
  30. player = document.getElementById("player");
  31. paused = player.paused;
  32. time = player.currentTime;
  33. player.src = qualitySelector.value;
  34. player.load();
  35. player.currentTime = time;
  36. if(!paused) {
  37. player.play();
  38. }
  39. }
  40. function filterOptions(options) {
  41. player = document.getElementById("player");
  42. return options.filter(o => o.type === "video" && player.canPlayType(`${o.mimetype}; codecs="${o.metadata.codecs}"`));
  43. }
  44. function findOptimalOptionForScreen(options) {
  45. screenSize = Math.max(window.screen.width, window.screen.height);
  46. screenSize = screenSize * window.devicePixelRatio
  47. filtered = options.filter(o => o.type === "video" && Math.max(o.metadata.size.split("x")[0], o.metadata.size.split("x")[1]) <= screenSize);
  48. console.log(filtered);
  49. if(filtered.length == 0){
  50. return options[options.length - 1];
  51. }
  52. return filtered[0];
  53. }
  54. function downloadVideo() {
  55. document.getElementById("download-modal").showModal();
  56. }
  57. function showInfo() {
  58. document.getElementById("info-modal").showModal();
  59. }
  60. function shareVideo() {
  61. document.getElementById("share-modal").showModal();
  62. }
  63. function playStateChanged(playing) {
  64. controls = document.getElementById("controls")
  65. if(playing) {
  66. controls.classList.remove("paused")
  67. }
  68. else {
  69. controls.classList.add("paused")
  70. }
  71. }
  72. var speedTestStart;
  73. var speed = 0;
  74. function startSpeedTest() {
  75. speedTestStart = Date.now();
  76. }
  77. function speedTestProgress(transferred) {
  78. loadTime = Date.now() - speedTestStart;
  79. if(loadTime < 1) {
  80. loadTime = 1;
  81. }
  82. speed = transferred / loadTime;
  83. }
  84. // @license-end