aboutsummaryrefslogtreecommitdiffstats
path: root/youtube/static/js/plyr-start.js
blob: 82b32d668402361417475708eff75fb1f3c72337 (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
126
127
128
(function main() {
  'use strict';

  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;
  }

  let qualityOptions = [];
  let qualityDefault;
  for (var src of data['uni_sources']) {
    qualityOptions.push(src.quality_string)
  }
  for (var src of data['pair_sources']) {
    qualityOptions.push(src.quality_string)
  }
  if (data['using_pair_sources'])
    qualityDefault = data['pair_sources'][data['pair_idx']].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;
      let 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].quality_string == quality) {
              changeQuality({'type': 'pair', 'index': i});
              return;
            }
          }
        }
      },
    },
    settings: ['captions', 'quality', 'speed', 'loop'],
  });

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