aboutsummaryrefslogtreecommitdiffstats
path: root/youtube/static/js/plyr-start.js
blob: 79a03016278eaa9b3db5ce80b3e0a216714e811d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
let captionsActive;

switch(true) {
case data.settings.subtitles_mode == 2:
  captionsActive = true;
  break;
case data.settings.subtitles_mode == 1 && data.has_manual_captions:
  captionsActive = true;
  break;
default:
  captionsActive = false;
}

var qualityOptions = [];
var qualityDefault;
for (var src of data['uni_sources']) {
  qualityOptions.push(src.quality_string)
}
for (var src of data['pair_sources']) {
  qualityOptions.push(src[0].quality_string)
}
if (data['using_pair_sources'])
  qualityDefault = data['pair_sources'][data['pair_idx']][0].quality_string;
else if (data['uni_sources'].length != 0)
  qualityDefault = data['uni_sources'][data['uni_idx']].quality_string;
else
  qualityDefault = 'None';



// Fix plyr refusing to work with qualities that are strings
Object.defineProperty(Plyr.prototype, 'quality', {
  set: function(input) {
    const config = this.config.quality;
    const options = this.options.quality;

    if (!options.length) {
      return;
    }

    // removing this line:
    //let quality = [!is.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is.number);
    // replacing with:
    quality = input;
    let updateStorage = true;

    if (!options.includes(quality)) {
      // Plyr sets quality to null at startup, resulting in the erroneous
      // calling of this setter function with input = null, and the
      // commented out code below would set the quality to something
      // unrelated at startup. Comment out and just return.
      return;
      /*const value = closest(options, quality);
        this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);
        quality = value; // Don't update storage if quality is not supported
        updateStorage = false;*/
    } // Update config


    config.selected = quality; // Set quality

    this.media.quality = quality; // Save to storage

    if (updateStorage) {
      this.storage.set({
        quality
      });
    }
  }
});

const player = new Plyr(document.getElementById('js-video-player'), {
  disableContextMenu: false,
  captions: {
    active: captionsActive,
    language: data.settings.subtitles_language,
  },
  controls: [
    'play-large',
    'play',
    'progress',
    'current-time',
    'duration',
    'mute',
    'volume',
    'captions',
    'settings',
    'fullscreen'
  ],
  iconUrl: "/youtube.com/static/modules/plyr/plyr.svg",
  blankVideo: "/youtube.com/static/modules/plyr/blank.webm",
  debug: false,
  storage: {enabled: false},
  quality: {
    default: qualityDefault,
    options: qualityOptions,
    forced: true,
    onChange: function(quality) {
      if (quality == 'None') {return;}
      if (quality.includes('(integrated)')) {
        for (var i=0; i < data['uni_sources'].length; i++) {
          if (data['uni_sources'][i].quality_string == quality) {
            changeQuality({'type': 'uni', 'index': i});
            return;
          }
        }
      } else {
        for (var i=0; i < data['pair_sources'].length; i++) {
          if (data['pair_sources'][i][0].quality_string == quality) {
            changeQuality({'type': 'pair', 'index': i});
            return;
          }
        }
      }
    },
  },
  settings: ['captions', 'quality', 'speed', 'loop'],
});

// Hide the external quality selector
window.addEventListener('DOMContentLoaded', function(){
  var qs = document.getElementById('quality-select');
  if (qs)
    qs.hidden = true;
});