mirror of
				https://github.com/TeamPiped/Piped.git
				synced 2024-08-14 23:57:27 +00:00 
			
		
		
		
	Commit everything.
This commit is contained in:
		
							parent
							
								
									90e6240f33
								
							
						
					
					
						commit
						cc7f0f2c85
					
				
					 11 changed files with 394 additions and 458 deletions
				
			
		| 
						 | 
					@ -5,6 +5,7 @@
 | 
				
			||||||
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
 | 
					    <meta http-equiv="X-UA-Compatible" content="IE=edge">
 | 
				
			||||||
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
 | 
					    <meta name="viewport" content="width=device-width,initial-scale=1.0">
 | 
				
			||||||
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
 | 
					    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
 | 
				
			||||||
 | 
					    <link title="Piped" type="application/opensearchdescription+xml" rel="search" href="<%= BASE_URL %>opensearch.xml">
 | 
				
			||||||
    <title><%= htmlWebpackPlugin.options.title %></title>
 | 
					    <title><%= htmlWebpackPlugin.options.title %></title>
 | 
				
			||||||
  </head>
 | 
					  </head>
 | 
				
			||||||
  <body>
 | 
					  <body>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/opensearch.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/opensearch.xml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,9 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
 | 
				
			||||||
 | 
					    <ShortName>Piped</ShortName>
 | 
				
			||||||
 | 
					    <LongName>Piped Search</LongName>
 | 
				
			||||||
 | 
					    <Description>Search for videos, channels, and playlists on Piped</Description>
 | 
				
			||||||
 | 
					    <InputEncoding>UTF-8</InputEncoding>
 | 
				
			||||||
 | 
					    <Image width="48" height="48" type="image/x-icon">https://piped.kavin.rocks/favicon.ico</Image>
 | 
				
			||||||
 | 
					    <Url type="text/html" method="get" template="https://piped.kavin.rocks/search?q={searchTerms}" />
 | 
				
			||||||
 | 
					</OpenSearchDescription>
 | 
				
			||||||
| 
						 | 
					@ -64,15 +64,11 @@ export default {
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            fetch(
 | 
					            this.fetchJson(
 | 
				
			||||||
                Constants.BASE_URL +
 | 
					                Constants.BASE_URL +
 | 
				
			||||||
                    "/suggestions?query=" +
 | 
					                    "/suggestions?query=" +
 | 
				
			||||||
                    encodeURI(this.searchText + e.key)
 | 
					                    encodeURI(this.searchText + e.key)
 | 
				
			||||||
            )
 | 
					            );
 | 
				
			||||||
                .then(resp => resp.json())
 | 
					 | 
				
			||||||
                .then(json => {
 | 
					 | 
				
			||||||
                    this.searchSuggestions = json;
 | 
					 | 
				
			||||||
                });
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,6 +7,7 @@
 | 
				
			||||||
            v-if="channel.bannerUrl"
 | 
					            v-if="channel.bannerUrl"
 | 
				
			||||||
            v-bind:src="channel.bannerUrl"
 | 
					            v-bind:src="channel.bannerUrl"
 | 
				
			||||||
            style="width: 100%"
 | 
					            style="width: 100%"
 | 
				
			||||||
 | 
					            loading="lazy"
 | 
				
			||||||
        />
 | 
					        />
 | 
				
			||||||
        <p v-html="this.channel.description.replaceAll('\n', '<br>')"></p>
 | 
					        <p v-html="this.channel.description.replaceAll('\n', '<br>')"></p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,17 +23,23 @@
 | 
				
			||||||
                    class="uk-link-muted uk-text-justify"
 | 
					                    class="uk-link-muted uk-text-justify"
 | 
				
			||||||
                    v-bind:to="item.url || '/'"
 | 
					                    v-bind:to="item.url || '/'"
 | 
				
			||||||
                >
 | 
					                >
 | 
				
			||||||
                    <img style="width: 100%" v-bind:src="item.thumbnail" />
 | 
					                    <img
 | 
				
			||||||
 | 
					                        style="width: 100%"
 | 
				
			||||||
 | 
					                        v-bind:src="item.thumbnail"
 | 
				
			||||||
 | 
					                        loading="lazy"
 | 
				
			||||||
 | 
					                    />
 | 
				
			||||||
                    <a>{{ item.title }}</a>
 | 
					                    <a>{{ item.title }}</a>
 | 
				
			||||||
                </router-link>
 | 
					                </router-link>
 | 
				
			||||||
                <br />
 | 
					                <br />
 | 
				
			||||||
                <div>
 | 
					                <div>
 | 
				
			||||||
                    <b class="uk-text-small uk-align-left">
 | 
					                    <b class="uk-text-small uk-align-left">
 | 
				
			||||||
                        {{ timeFormat(item.duration) }}
 | 
					 | 
				
			||||||
                    </b>
 | 
					 | 
				
			||||||
                    <b class="uk-text-small uk-align-right">
 | 
					 | 
				
			||||||
                        <font-awesome-icon icon="eye"></font-awesome-icon>
 | 
					                        <font-awesome-icon icon="eye"></font-awesome-icon>
 | 
				
			||||||
                        {{ item.views }} views
 | 
					                        {{ item.views }} views
 | 
				
			||||||
 | 
					                        <br />
 | 
				
			||||||
 | 
					                        {{ item.uploadedDate }}
 | 
				
			||||||
 | 
					                    </b>
 | 
				
			||||||
 | 
					                    <b class="uk-text-small uk-align-right">
 | 
				
			||||||
 | 
					                        {{ timeFormat(item.duration) }}
 | 
				
			||||||
                    </b>
 | 
					                    </b>
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
| 
						 | 
					@ -58,13 +65,9 @@ export default {
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    methods: {
 | 
					    methods: {
 | 
				
			||||||
        async fetchChannel() {
 | 
					        async fetchChannel() {
 | 
				
			||||||
            return await (
 | 
					            return await this.fetchJson(
 | 
				
			||||||
                await fetch(
 | 
					                Constants.BASE_URL + "/channels/" + this.$route.params.channelId
 | 
				
			||||||
                    Constants.BASE_URL +
 | 
					            );
 | 
				
			||||||
                        "/channels/" +
 | 
					 | 
				
			||||||
                        this.$route.params.channelId
 | 
					 | 
				
			||||||
                )
 | 
					 | 
				
			||||||
            ).json();
 | 
					 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        async getChannelData() {
 | 
					        async getChannelData() {
 | 
				
			||||||
            this.fetchChannel()
 | 
					            this.fetchChannel()
 | 
				
			||||||
| 
						 | 
					@ -78,15 +81,13 @@ export default {
 | 
				
			||||||
                document.body.offsetHeight - window.innerHeight
 | 
					                document.body.offsetHeight - window.innerHeight
 | 
				
			||||||
            ) {
 | 
					            ) {
 | 
				
			||||||
                this.loading = true;
 | 
					                this.loading = true;
 | 
				
			||||||
                fetch(
 | 
					                this.fetchJson(
 | 
				
			||||||
                    Constants.BASE_URL +
 | 
					                    Constants.BASE_URL +
 | 
				
			||||||
                        "/nextpage/channels/" +
 | 
					                        "/nextpage/channels/" +
 | 
				
			||||||
                        this.$route.params.channelId +
 | 
					                        this.$route.params.channelId +
 | 
				
			||||||
                        "?url=" +
 | 
					                        "?url=" +
 | 
				
			||||||
                        encodeURIComponent(this.channel.nextpage)
 | 
					                        encodeURIComponent(this.channel.nextpage)
 | 
				
			||||||
                )
 | 
					                ).then(json => {
 | 
				
			||||||
                    .then(body => body.json())
 | 
					 | 
				
			||||||
                    .then(json => {
 | 
					 | 
				
			||||||
                    this.channel.relatedStreams.concat(json.relatedStreams);
 | 
					                    this.channel.relatedStreams.concat(json.relatedStreams);
 | 
				
			||||||
                    this.channel.nextpage = json.nextpage;
 | 
					                    this.channel.nextpage = json.nextpage;
 | 
				
			||||||
                    this.loading = false;
 | 
					                    this.loading = false;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,8 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
    <div v-if="playlist">
 | 
					    <div v-if="playlist">
 | 
				
			||||||
        <h1 class="uk-text-center">
 | 
					        <h1 class="uk-text-center">
 | 
				
			||||||
            <img v-bind:src="playlist.avatarUrl" />{{ playlist.name }}
 | 
					            <img v-bind:src="playlist.avatarUrl" loading="lazy" />
 | 
				
			||||||
 | 
					            {{ playlist.name }}
 | 
				
			||||||
        </h1>
 | 
					        </h1>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <b
 | 
					        <b
 | 
				
			||||||
| 
						 | 
					@ -9,7 +10,7 @@
 | 
				
			||||||
                class="uk-text-justify"
 | 
					                class="uk-text-justify"
 | 
				
			||||||
                v-bind:to="playlist.uploaderUrl || '/'"
 | 
					                v-bind:to="playlist.uploaderUrl || '/'"
 | 
				
			||||||
            >
 | 
					            >
 | 
				
			||||||
                <img v-bind:src="playlist.uploaderAvatar" />
 | 
					                <img v-bind:src="playlist.uploaderAvatar" loading="lazy" />
 | 
				
			||||||
                {{ playlist.uploader }}</router-link
 | 
					                {{ playlist.uploader }}</router-link
 | 
				
			||||||
            ></b
 | 
					            ></b
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
| 
						 | 
					@ -28,7 +29,11 @@
 | 
				
			||||||
                    class="uk-link-muted uk-text-justify"
 | 
					                    class="uk-link-muted uk-text-justify"
 | 
				
			||||||
                    v-bind:to="item.url || '/'"
 | 
					                    v-bind:to="item.url || '/'"
 | 
				
			||||||
                >
 | 
					                >
 | 
				
			||||||
                    <img style="width: 100%" v-bind:src="item.thumbnail" />
 | 
					                    <img
 | 
				
			||||||
 | 
					                        style="width: 100%"
 | 
				
			||||||
 | 
					                        v-bind:src="item.thumbnail"
 | 
				
			||||||
 | 
					                        loading="lazy"
 | 
				
			||||||
 | 
					                    />
 | 
				
			||||||
                    <a>{{ item.title }}</a>
 | 
					                    <a>{{ item.title }}</a>
 | 
				
			||||||
                </router-link>
 | 
					                </router-link>
 | 
				
			||||||
                <br />
 | 
					                <br />
 | 
				
			||||||
| 
						 | 
					@ -67,11 +72,9 @@ export default {
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    methods: {
 | 
					    methods: {
 | 
				
			||||||
        async fetchPlaylist() {
 | 
					        async fetchPlaylist() {
 | 
				
			||||||
            return await (
 | 
					            return await await this.fetchJson(
 | 
				
			||||||
                await fetch(
 | 
					 | 
				
			||||||
                Constants.BASE_URL + "/playlists/" + this.$route.query.list
 | 
					                Constants.BASE_URL + "/playlists/" + this.$route.query.list
 | 
				
			||||||
                )
 | 
					            );
 | 
				
			||||||
            ).json();
 | 
					 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        async getPlaylistData() {
 | 
					        async getPlaylistData() {
 | 
				
			||||||
            this.fetchPlaylist()
 | 
					            this.fetchPlaylist()
 | 
				
			||||||
| 
						 | 
					@ -86,18 +89,14 @@ export default {
 | 
				
			||||||
                document.body.offsetHeight - window.innerHeight
 | 
					                document.body.offsetHeight - window.innerHeight
 | 
				
			||||||
            ) {
 | 
					            ) {
 | 
				
			||||||
                this.loading = true;
 | 
					                this.loading = true;
 | 
				
			||||||
                fetch(
 | 
					                this.fetchJson(
 | 
				
			||||||
                    Constants.BASE_URL +
 | 
					                    Constants.BASE_URL +
 | 
				
			||||||
                        "/nextpage/playlists/" +
 | 
					                        "/nextpage/playlists/" +
 | 
				
			||||||
                        this.$route.query.list +
 | 
					                        this.$route.query.list +
 | 
				
			||||||
                        "?url=" +
 | 
					                        "?url=" +
 | 
				
			||||||
                        encodeURIComponent(this.playlist.nextpage)
 | 
					                        encodeURIComponent(this.playlist.nextpage)
 | 
				
			||||||
                )
 | 
					                ).then(json => {
 | 
				
			||||||
                    .then(body => body.json())
 | 
					                    this.playlist.relatedStreams.concat(json.relatedStreams);
 | 
				
			||||||
                    .then(json => {
 | 
					 | 
				
			||||||
                        this.playlist.relatedStreams.concat(
 | 
					 | 
				
			||||||
                            json.relatedStreams
 | 
					 | 
				
			||||||
                        );
 | 
					 | 
				
			||||||
                    this.playlist.nextpage = json.nextpage;
 | 
					                    this.playlist.nextpage = json.nextpage;
 | 
				
			||||||
                    this.loading = false;
 | 
					                    this.loading = false;
 | 
				
			||||||
                    json.relatedStreams.map(stream =>
 | 
					                    json.relatedStreams.map(stream =>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,7 +15,11 @@
 | 
				
			||||||
                    class="uk-text-emphasis"
 | 
					                    class="uk-text-emphasis"
 | 
				
			||||||
                    v-bind:to="result.url || '/'"
 | 
					                    v-bind:to="result.url || '/'"
 | 
				
			||||||
                >
 | 
					                >
 | 
				
			||||||
                    <img style="width: 100%" v-bind:src="result.thumbnail" />
 | 
					                    <img
 | 
				
			||||||
 | 
					                        style="width: 100%"
 | 
				
			||||||
 | 
					                        v-bind:src="result.thumbnail"
 | 
				
			||||||
 | 
					                        loading="lazy"
 | 
				
			||||||
 | 
					                    />
 | 
				
			||||||
                    <p>{{ result.name }}</p>
 | 
					                    <p>{{ result.name }}</p>
 | 
				
			||||||
                </router-link>
 | 
					                </router-link>
 | 
				
			||||||
                <router-link
 | 
					                <router-link
 | 
				
			||||||
| 
						 | 
					@ -25,6 +29,8 @@
 | 
				
			||||||
                    <p>{{ result.uploaderName }}</p>
 | 
					                    <p>{{ result.uploaderName }}</p>
 | 
				
			||||||
                </router-link>
 | 
					                </router-link>
 | 
				
			||||||
                {{ result.duration ? timeFormat(result.duration) : "" }}
 | 
					                {{ result.duration ? timeFormat(result.duration) : "" }}
 | 
				
			||||||
 | 
					                <br />
 | 
				
			||||||
 | 
					                {{ "1/1/2020" }}
 | 
				
			||||||
                <b v-if="result.views" class="uk-text-small uk-align-right">
 | 
					                <b v-if="result.views" class="uk-text-small uk-align-right">
 | 
				
			||||||
                    <font-awesome-icon icon="eye"></font-awesome-icon>
 | 
					                    <font-awesome-icon icon="eye"></font-awesome-icon>
 | 
				
			||||||
                    {{ result.views }} views
 | 
					                    {{ result.views }} views
 | 
				
			||||||
| 
						 | 
					@ -57,13 +63,11 @@ export default {
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    methods: {
 | 
					    methods: {
 | 
				
			||||||
        async fetchResults() {
 | 
					        async fetchResults() {
 | 
				
			||||||
            return await (
 | 
					            return await await this.fetchJson(
 | 
				
			||||||
                await fetch(
 | 
					 | 
				
			||||||
                Constants.BASE_URL +
 | 
					                Constants.BASE_URL +
 | 
				
			||||||
                    "/search?q=" +
 | 
					                    "/search?q=" +
 | 
				
			||||||
                    encodeURIComponent(this.$route.query.search_query)
 | 
					                    encodeURIComponent(this.$route.query.search_query)
 | 
				
			||||||
                )
 | 
					            );
 | 
				
			||||||
            ).json();
 | 
					 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        async updateResults() {
 | 
					        async updateResults() {
 | 
				
			||||||
            document.title = this.$route.query.search_query + " - Piped";
 | 
					            document.title = this.$route.query.search_query + " - Piped";
 | 
				
			||||||
| 
						 | 
					@ -78,7 +82,7 @@ export default {
 | 
				
			||||||
                document.body.offsetHeight - window.innerHeight
 | 
					                document.body.offsetHeight - window.innerHeight
 | 
				
			||||||
            ) {
 | 
					            ) {
 | 
				
			||||||
                this.loading = true;
 | 
					                this.loading = true;
 | 
				
			||||||
                fetch(
 | 
					                this.fetchJson(
 | 
				
			||||||
                    Constants.BASE_URL +
 | 
					                    Constants.BASE_URL +
 | 
				
			||||||
                        "/nextpage/search" +
 | 
					                        "/nextpage/search" +
 | 
				
			||||||
                        "?url=" +
 | 
					                        "?url=" +
 | 
				
			||||||
| 
						 | 
					@ -87,15 +91,11 @@ export default {
 | 
				
			||||||
                        encodeURIComponent(this.results.id) +
 | 
					                        encodeURIComponent(this.results.id) +
 | 
				
			||||||
                        "&q=" +
 | 
					                        "&q=" +
 | 
				
			||||||
                        encodeURIComponent(this.$route.query.search_query)
 | 
					                        encodeURIComponent(this.$route.query.search_query)
 | 
				
			||||||
                )
 | 
					                ).then(json => {
 | 
				
			||||||
                    .then(body => body.json())
 | 
					 | 
				
			||||||
                    .then(json => {
 | 
					 | 
				
			||||||
                    this.results.nextpage = json.nextpage;
 | 
					                    this.results.nextpage = json.nextpage;
 | 
				
			||||||
                    this.results.id = json.id;
 | 
					                    this.results.id = json.id;
 | 
				
			||||||
                    this.loading = false;
 | 
					                    this.loading = false;
 | 
				
			||||||
                        json.items.map(stream =>
 | 
					                    json.items.map(stream => this.results.items.push(stream));
 | 
				
			||||||
                            this.results.items.push(stream)
 | 
					 | 
				
			||||||
                        );
 | 
					 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,7 +15,11 @@
 | 
				
			||||||
                    class="uk-text-emphasis"
 | 
					                    class="uk-text-emphasis"
 | 
				
			||||||
                    v-bind:to="video.url || '/'"
 | 
					                    v-bind:to="video.url || '/'"
 | 
				
			||||||
                >
 | 
					                >
 | 
				
			||||||
                    <img style="width: 100%" v-bind:src="video.thumbnail" />
 | 
					                    <img
 | 
				
			||||||
 | 
					                        style="width: 100%"
 | 
				
			||||||
 | 
					                        v-bind:src="video.thumbnail"
 | 
				
			||||||
 | 
					                        loading="lazy"
 | 
				
			||||||
 | 
					                    />
 | 
				
			||||||
                    <p>{{ video.title }}</p>
 | 
					                    <p>{{ video.title }}</p>
 | 
				
			||||||
                </router-link>
 | 
					                </router-link>
 | 
				
			||||||
                <router-link
 | 
					                <router-link
 | 
				
			||||||
| 
						 | 
					@ -24,10 +28,14 @@
 | 
				
			||||||
                >
 | 
					                >
 | 
				
			||||||
                    <p>{{ video.uploaderName }}</p>
 | 
					                    <p>{{ video.uploaderName }}</p>
 | 
				
			||||||
                </router-link>
 | 
					                </router-link>
 | 
				
			||||||
                {{ timeFormat(video.duration) }}
 | 
					                <b class="uk-text-small uk-align-left">
 | 
				
			||||||
                <b class="uk-text-small uk-align-right">
 | 
					 | 
				
			||||||
                    <font-awesome-icon icon="eye"></font-awesome-icon>
 | 
					                    <font-awesome-icon icon="eye"></font-awesome-icon>
 | 
				
			||||||
                    {{ video.views }} views
 | 
					                    {{ video.views }} views
 | 
				
			||||||
 | 
					                    <br />
 | 
				
			||||||
 | 
					                    {{ video.uploadedDate }}
 | 
				
			||||||
 | 
					                </b>
 | 
				
			||||||
 | 
					                <b class="uk-text-small uk-align-right">
 | 
				
			||||||
 | 
					                    {{ timeFormat(video.duration) }}
 | 
				
			||||||
                </b>
 | 
					                </b>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
| 
						 | 
					@ -50,7 +58,7 @@ export default {
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    methods: {
 | 
					    methods: {
 | 
				
			||||||
        async fetchTrending() {
 | 
					        async fetchTrending() {
 | 
				
			||||||
            return await (await fetch(Constants.BASE_URL + "/trending")).json();
 | 
					            return await this.fetchJson(Constants.BASE_URL + "/trending");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,13 +1,9 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
    <div class="uk-container uk-container-xlarge">
 | 
					    <div class="uk-container uk-container-xlarge">
 | 
				
			||||||
        <video
 | 
					        <video controls ref="player"></video>
 | 
				
			||||||
            controls
 | 
					 | 
				
			||||||
            ref="player"
 | 
					 | 
				
			||||||
            class="video-js preview-player-dimensions"
 | 
					 | 
				
			||||||
        ></video>
 | 
					 | 
				
			||||||
        <h1 class="uk-text-bold">{{ video.title }}</h1>
 | 
					        <h1 class="uk-text-bold">{{ video.title }}</h1>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <img :src="video.uploaderAvatar" />
 | 
					        <img :src="video.uploaderAvatar" loading="lazy" />
 | 
				
			||||||
        <router-link class="uk-text-bold" v-bind:to="video.uploaderUrl || '/'">
 | 
					        <router-link class="uk-text-bold" v-bind:to="video.uploaderUrl || '/'">
 | 
				
			||||||
            <a>{{ video.uploader }}</a>
 | 
					            <a>{{ video.uploader }}</a>
 | 
				
			||||||
        </router-link>
 | 
					        </router-link>
 | 
				
			||||||
| 
						 | 
					@ -56,7 +52,11 @@
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
            <router-link class="uk-link-muted" v-bind:to="related.url">
 | 
					            <router-link class="uk-link-muted" v-bind:to="related.url">
 | 
				
			||||||
                <p class="uk-text-emphasis">{{ related.title }}</p>
 | 
					                <p class="uk-text-emphasis">{{ related.title }}</p>
 | 
				
			||||||
                <img style="width: 100%" v-bind:src="related.thumbnail" />
 | 
					                <img
 | 
				
			||||||
 | 
					                    style="width: 100%"
 | 
				
			||||||
 | 
					                    v-bind:src="related.thumbnail"
 | 
				
			||||||
 | 
					                    loading="lazy"
 | 
				
			||||||
 | 
					                />
 | 
				
			||||||
            </router-link>
 | 
					            </router-link>
 | 
				
			||||||
            <p>
 | 
					            <p>
 | 
				
			||||||
                <router-link
 | 
					                <router-link
 | 
				
			||||||
| 
						 | 
					@ -73,14 +73,8 @@
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
import("video.js/dist/video-js.css");
 | 
					const shaka = import("shaka-player/dist/shaka-player.compiled.js");
 | 
				
			||||||
import("@silvermine/videojs-quality-selector/dist/css/quality-selector.css");
 | 
					 | 
				
			||||||
import videojs from "video.js";
 | 
					 | 
				
			||||||
import("videojs-hotkeys");
 | 
					 | 
				
			||||||
import Constants from "@/Constants.js";
 | 
					import Constants from "@/Constants.js";
 | 
				
			||||||
import("@silvermine/videojs-quality-selector").then(module => {
 | 
					 | 
				
			||||||
    module.default(videojs);
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default {
 | 
					export default {
 | 
				
			||||||
    name: "App",
 | 
					    name: "App",
 | 
				
			||||||
| 
						 | 
					@ -119,22 +113,18 @@ export default {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    methods: {
 | 
					    methods: {
 | 
				
			||||||
        async fetchVideo() {
 | 
					        fetchVideo() {
 | 
				
			||||||
            return await (
 | 
					            return this.fetchJson(
 | 
				
			||||||
                await fetch(
 | 
					 | 
				
			||||||
                Constants.BASE_URL + "/streams/" + this.$route.query.v
 | 
					                Constants.BASE_URL + "/streams/" + this.$route.query.v
 | 
				
			||||||
                )
 | 
					            );
 | 
				
			||||||
            ).json();
 | 
					 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        async fetchSponsors() {
 | 
					        async fetchSponsors() {
 | 
				
			||||||
            return await (
 | 
					            await this.fetchJson(
 | 
				
			||||||
                await fetch(
 | 
					 | 
				
			||||||
                Constants.BASE_URL +
 | 
					                Constants.BASE_URL +
 | 
				
			||||||
                    "/sponsors/" +
 | 
					                    "/sponsors/" +
 | 
				
			||||||
                    this.$route.query.v +
 | 
					                    this.$route.query.v +
 | 
				
			||||||
                    '?category=["sponsor","interaction","selfpromo","music_offtopic"]'
 | 
					                    '?category=["sponsor","interaction","selfpromo","music_offtopic"]'
 | 
				
			||||||
                )
 | 
					            );
 | 
				
			||||||
            ).json();
 | 
					 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        onChange() {
 | 
					        onChange() {
 | 
				
			||||||
            if (localStorage)
 | 
					            if (localStorage)
 | 
				
			||||||
| 
						 | 
					@ -142,7 +132,9 @@ export default {
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        async getVideoData() {
 | 
					        async getVideoData() {
 | 
				
			||||||
            this.fetchVideo()
 | 
					            this.fetchVideo()
 | 
				
			||||||
                .then(data => (this.video = data))
 | 
					                .then(data => {
 | 
				
			||||||
 | 
					                    this.video = data;
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
                .then(() => {
 | 
					                .then(() => {
 | 
				
			||||||
                    document.title = this.video.title + " - Piped";
 | 
					                    document.title = this.video.title + " - Piped";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -151,96 +143,63 @@ export default {
 | 
				
			||||||
                        .replaceAll("https://www.youtube.com", "")
 | 
					                        .replaceAll("https://www.youtube.com", "")
 | 
				
			||||||
                        .replaceAll("\n", "<br>");
 | 
					                        .replaceAll("\n", "<br>");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    const options = {
 | 
					 | 
				
			||||||
                        autoplay: false,
 | 
					 | 
				
			||||||
                        controlBar: {
 | 
					 | 
				
			||||||
                            children: [
 | 
					 | 
				
			||||||
                                "playToggle",
 | 
					 | 
				
			||||||
                                "currentTimeDisplay",
 | 
					 | 
				
			||||||
                                "progressControl",
 | 
					 | 
				
			||||||
                                "volumePanel",
 | 
					 | 
				
			||||||
                                "qualitySelector",
 | 
					 | 
				
			||||||
                                "captionsButton",
 | 
					 | 
				
			||||||
                                "fullscreenToggle"
 | 
					 | 
				
			||||||
                            ]
 | 
					 | 
				
			||||||
                        },
 | 
					 | 
				
			||||||
                        responsive: false,
 | 
					 | 
				
			||||||
                        aspectRatio: "16:9"
 | 
					 | 
				
			||||||
                    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    const noPrevPlayer = !this.player;
 | 
					                    const noPrevPlayer = !this.player;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if (noPrevPlayer) {
 | 
					                    var streams = [];
 | 
				
			||||||
                        this.player = videojs(this.$refs.player, options);
 | 
					
 | 
				
			||||||
                        if (localStorage)
 | 
					                    streams.push(...this.video.audioStreams);
 | 
				
			||||||
                            this.player.volume(
 | 
					                    streams.push(...this.video.videoStreams);
 | 
				
			||||||
                                localStorage.getItem("volume") || 1
 | 
					
 | 
				
			||||||
 | 
					                    const dash = require("../utils/DashUtils.js").default.generate_dash_file_from_formats(
 | 
				
			||||||
 | 
					                        streams,
 | 
				
			||||||
 | 
					                        this.video.duration
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (noPrevPlayer) {
 | 
				
			||||||
 | 
					                        setTimeout(function() {
 | 
				
			||||||
 | 
					                            shaka
 | 
				
			||||||
 | 
					                                .then(shaka => shaka.default)
 | 
				
			||||||
 | 
					                                .then(shaka => {
 | 
				
			||||||
 | 
					                                    console.log(shaka);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                    shaka.polyfill.installAll();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                    this.player = new shaka.Player(
 | 
				
			||||||
 | 
					                                        document.querySelector("video")
 | 
				
			||||||
 | 
					                                    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                    this.player.load(
 | 
				
			||||||
 | 
					                                        "data:application/dash+xml;charset=utf-8;base64," +
 | 
				
			||||||
 | 
					                                            btoa(dash)
 | 
				
			||||||
 | 
					                                    );
 | 
				
			||||||
 | 
					                                });
 | 
				
			||||||
 | 
					                        }, 0);
 | 
				
			||||||
 | 
					                        // if (localStorage)
 | 
				
			||||||
 | 
					                        //     this.player.volume(
 | 
				
			||||||
 | 
					                        //         localStorage.getItem("volume") || 1
 | 
				
			||||||
 | 
					                        //     );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    shaka;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    console.log(this.player);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if (this.$route.query.t)
 | 
					                    if (this.$route.query.t)
 | 
				
			||||||
                        this.player.currentTime(this.$route.query.t);
 | 
					                        this.player.currentTime(this.$route.query.t);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    this.player.hotkeys({
 | 
					                    // this.player.poster(this.video.thumbnailUrl);
 | 
				
			||||||
                        volumeStep: 0.1,
 | 
					 | 
				
			||||||
                        seekStep: 5,
 | 
					 | 
				
			||||||
                        enableModifiersForNumbers: false,
 | 
					 | 
				
			||||||
                        enableHoverScroll: true
 | 
					 | 
				
			||||||
                    });
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    this.player.poster(this.video.thumbnailUrl);
 | 
					                    // this.video.subtitles.map(subtitle => {
 | 
				
			||||||
 | 
					                    //     this.player.addRemoteTextTrack({
 | 
				
			||||||
                    var src = [];
 | 
					                    //         kind: "captions",
 | 
				
			||||||
 | 
					                    //         src: subtitle.url.replace("fmt=ttml", "fmt=vtt"),
 | 
				
			||||||
                    // src.push({
 | 
					                    //         label: "Track",
 | 
				
			||||||
                    //     src:
 | 
					                    //         language: "en",
 | 
				
			||||||
                    //         "data:application/dash+xml;charset=utf-8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPE1QRCB0eXBlPSJzdGF0aWMiIHhtbG5zPSJ1cm46bXBlZzpkYXNoOnNjaGVtYTptcGQ6MjAxMSIgbWluQnVmZmVyVGltZT0iUFQxLjVTIiBtZWRpYVByZXNlbnRhdGlvbkR1cmF0aW9uPSJQVDIyMC43NjIyMDgzMzMzMzMzMlMiIHByb2ZpbGVzPSJ1cm46bXBlZzpkYXNoOnByb2ZpbGU6aXNvZmYtbWFpbjoyMDExIj4KICA8UGVyaW9kIHN0YXJ0PSJQVDBTIj4KICAgIDxBZGFwdGF0aW9uU2V0PgogICAgICA8UmVwcmVzZW50YXRpb24gaWQ9InZpZGVvMDEiIG1pbWVUeXBlPSJ2aWRlby9tcDQiIGNvZGVjcz0iYXZjMS42NDAwMjgiIGJhbmR3aWR0aD0iMjgxNjM0Ij4KICAgICAgICAgIDxCYXNlVVJMPmh0dHBzOi8vcGlwZWRwcm94eS5rYXZpbi5yb2Nrcy92aWRlb3BsYXliYWNrP2V4cGlyZT0xNjA1NjkxNTMzJmVpPUxaUzBYLVA5RG9TLWh3YU95Sl9vRHcmaXA9MjA5LjE0MS40Ni4zOCZpZD0wN2FmZTI0MmY2ODg4ZDdjJml0YWc9MjQ4JmFpdGFncz0xMzMlMkMxMzQlMkMxMzUlMkMxMzYlMkMxMzclMkMxNjAlMkMyNDIlMkMyNDMlMkMyNDQlMkMyNDclMkMyNDglMkMyNzgmc291cmNlPXlvdXR1YmUmcmVxdWlyZXNzbD15ZXMmbWg9U0EmbW09MzElMkMyOSZtbj1zbi1uNHY3c243cyUyQ3NuLW40djdrbmxrJm1zPWF1JTJDcmR1Jm12PW0mbXZpPTUmcGw9MjMmZ2NyPXVzJmluaXRjd25kYnBzPTExMTI1MCZ2cHJ2PTEmbWltZT12aWRlbyUyRndlYm0mbnM9dllDakpkUFdQTWVjeHhrS3NlXzF4QUFGJmdpcj15ZXMmY2xlbj01MDE0MDM4NyZkdXI9MjIwLjc2MiZsbXQ9MTYwNTY0ODY5MjQyNjI0NSZtdD0xNjA1NjY5ODg1JmZ2aXA9NSZrZWVwYWxpdmU9eWVzJmM9V0VCJnR4cD01NDMyNDM0Jm49blYweDdYZXlodTV4R2ZIJnNwYXJhbXM9ZXhwaXJlJTJDZWklMkNpcCUyQ2lkJTJDYWl0YWdzJTJDc291cmNlJTJDcmVxdWlyZXNzbCUyQ2djciUyQ3ZwcnYlMkNtaW1lJTJDbnMlMkNnaXIlMkNjbGVuJTJDZHVyJTJDbG10JmxzcGFyYW1zPW1oJTJDbW0lMkNtbiUyQ21zJTJDbXYlMkNtdmklMkNwbCUyQ2luaXRjd25kYnBzJmxzaWc9QUczQ194QXdSQUlnUGh1ZklrTzBfZFBSdnFNRFhvRVZsYV9Dbzk1ZkpOYXdwbEM4QWE4eDJCd0NJRVhlOHdnTFJKeUFvZ2xNZmVPak1YTTF0d2hkcnRVWEV3eWowRVZOajFXTSZzaWc9QU9xMFFKOHdSUUloQVA5VDNQNXBCemJpZ3FoaXd2OXVlZjJDMlVoWFlmOHNfbDU2RzFla1VjV25BaUFCU0pSNFdLRlMxS05nUkhjRkUtVGJFRWFiWUtSYlA4YnItcVlzRTczVFFnPT0maG9zdD1yNS0tLXNuLW40djdzbjdzLmdvb2dsZXZpZGVvLmNvbTwvQmFzZVVSTD4KICAgICAgICA8U2VnbWVudEJhc2UgaW5kZXhSYW5nZT0iNzQwLTYyMTc0ODMxIj4KICAgICAgICAgIDxJbml0aWFsaXphdGlvbiByYW5nZT0iMC03NDAiLz4KICAgICAgICA8L1NlZ21lbnRCYXNlPgogICAgICAgIDwvUmVwcmVzZW50YXRpb24+CiAgICA8L0FkYXB0YXRpb25TZXQ+CiAgPC9QZXJpb2Q+CjwvTVBEPgo=",
 | 
					                    //         type: "captions/captions.vtt"
 | 
				
			||||||
                    //     type: "application/dash+xml",
 | 
					                    //     });
 | 
				
			||||||
                    //     label: "DASH"
 | 
					 | 
				
			||||||
                    // });
 | 
					                    // });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    this.video.videoStreams.map(stream =>
 | 
					                    // this.player.src(src);
 | 
				
			||||||
                        src.push({
 | 
					 | 
				
			||||||
                            src: stream.url,
 | 
					 | 
				
			||||||
                            type: stream.mimeType,
 | 
					 | 
				
			||||||
                            label: stream.quality,
 | 
					 | 
				
			||||||
                            videoOnly: stream.videoOnly
 | 
					 | 
				
			||||||
                        })
 | 
					 | 
				
			||||||
                    );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        this.video.audioStreams.map(stream =>
 | 
					 | 
				
			||||||
                            src.push({
 | 
					 | 
				
			||||||
                                src: stream.url,
 | 
					 | 
				
			||||||
                                type: stream.mimeType,
 | 
					 | 
				
			||||||
                                label: stream.quality
 | 
					 | 
				
			||||||
                        })
 | 
					 | 
				
			||||||
                    );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    this.video.subtitles.map(subtitle => {
 | 
					 | 
				
			||||||
                        this.player.addRemoteTextTrack({
 | 
					 | 
				
			||||||
                            kind: "captions",
 | 
					 | 
				
			||||||
                            src: subtitle.url.replace("fmt=ttml", "fmt=vtt"),
 | 
					 | 
				
			||||||
                            label: "Track",
 | 
					 | 
				
			||||||
                            language: "en",
 | 
					 | 
				
			||||||
                            type: "captions/captions.vtt"
 | 
					 | 
				
			||||||
                        });
 | 
					 | 
				
			||||||
                    });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    this.player.src(src);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    const currentSrc = src.filter(
 | 
					 | 
				
			||||||
                        src => src.src == this.player.currentSrc()
 | 
					 | 
				
			||||||
                    )[0];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    if (currentSrc.videoOnly)
 | 
					 | 
				
			||||||
                        if (!this.audioplayer)
 | 
					 | 
				
			||||||
                            this.audioplayer = new Audio(
 | 
					 | 
				
			||||||
                                this.video.audioStreams.slice(-1)[0].url
 | 
					 | 
				
			||||||
                        );
 | 
					 | 
				
			||||||
                    else
 | 
					 | 
				
			||||||
                        this.audioplayer.src = this.video.audioStreams.slice(
 | 
					 | 
				
			||||||
                                -1
 | 
					 | 
				
			||||||
                            )[0].url;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if (noPrevPlayer) {
 | 
					                    if (noPrevPlayer) {
 | 
				
			||||||
                        this.player.on("timeupdate", () => {
 | 
					                        this.player.on("timeupdate", () => {
 | 
				
			||||||
| 
						 | 
					@ -262,77 +221,28 @@ export default {
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
                                });
 | 
					                                });
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
 | 
					                        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            if (this.audioplayer) {
 | 
					                        // this.player.on("volumechange", () => {
 | 
				
			||||||
                                const delay =
 | 
					                        //     if (this.audioplayer)
 | 
				
			||||||
                                        this.audioplayer.currentTime -
 | 
					                        //         this.audioplayer.volume = this.player.volume();
 | 
				
			||||||
                                        this.player.currentTime(),
 | 
					                        //     if (localStorage)
 | 
				
			||||||
                                    absdelay = Math.abs(delay);
 | 
					                        //         localStorage.setItem(
 | 
				
			||||||
 | 
					                        //             "volume",
 | 
				
			||||||
 | 
					                        //             this.player.volume()
 | 
				
			||||||
 | 
					                        //         );
 | 
				
			||||||
 | 
					                        // });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                console.log(delay);
 | 
					                        // this.player.on("ended", () => {
 | 
				
			||||||
 | 
					                        //     if (
 | 
				
			||||||
                                if (absdelay > 0.05) {
 | 
					                        //         this.selectedAutoPlay &&
 | 
				
			||||||
                                    this.audioplayer.currentTime =
 | 
					                        //         this.video.relatedStreams.length > 0
 | 
				
			||||||
                                        absdelay > 0.2
 | 
					                        //     )
 | 
				
			||||||
                                            ? this.player.currentTime()
 | 
					                        //         this.$router.push(
 | 
				
			||||||
                                            : this.player.currentTime() - delay;
 | 
					                        //             this.video.relatedStreams[0].url
 | 
				
			||||||
 | 
					                        //         );
 | 
				
			||||||
 | 
					                        // });
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                            }
 | 
					 | 
				
			||||||
                        });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        this.player.on("play", () => {
 | 
					 | 
				
			||||||
                            if (this.audioplayer) this.audioplayer.play();
 | 
					 | 
				
			||||||
                        });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        this.player.on("pause", () => {
 | 
					 | 
				
			||||||
                            if (this.audioplayer) {
 | 
					 | 
				
			||||||
                                this.audioplayer.currentTime = this.player.currentTime();
 | 
					 | 
				
			||||||
                                this.audioplayer.pause();
 | 
					 | 
				
			||||||
                            }
 | 
					 | 
				
			||||||
                        });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        this.player.on("volumechange", () => {
 | 
					 | 
				
			||||||
                            if (this.audioplayer)
 | 
					 | 
				
			||||||
                                this.audioplayer.volume = this.player.volume();
 | 
					 | 
				
			||||||
                            if (localStorage)
 | 
					 | 
				
			||||||
                                localStorage.setItem(
 | 
					 | 
				
			||||||
                                    "volume",
 | 
					 | 
				
			||||||
                                    this.player.volume()
 | 
					 | 
				
			||||||
                                );
 | 
					 | 
				
			||||||
                        });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        this.player.on("ended", () => {
 | 
					 | 
				
			||||||
                            if (
 | 
					 | 
				
			||||||
                                this.selectedAutoPlay &&
 | 
					 | 
				
			||||||
                                this.video.relatedStreams.length > 0
 | 
					 | 
				
			||||||
                            )
 | 
					 | 
				
			||||||
                                this.$router.push(
 | 
					 | 
				
			||||||
                                    this.video.relatedStreams[0].url
 | 
					 | 
				
			||||||
                                );
 | 
					 | 
				
			||||||
                        });
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    if (!noPrevPlayer)
 | 
					 | 
				
			||||||
                        this.player
 | 
					 | 
				
			||||||
                            .remoteTextTracks()
 | 
					 | 
				
			||||||
                            .map(track =>
 | 
					 | 
				
			||||||
                                this.player.removeRemoteTextTrack(track)
 | 
					 | 
				
			||||||
                            );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    this.video.subtitles.map(subtitle => {
 | 
					 | 
				
			||||||
                        this.player.addRemoteTextTrack(
 | 
					 | 
				
			||||||
                            {
 | 
					 | 
				
			||||||
                                kind: "captions",
 | 
					 | 
				
			||||||
                                src: subtitle.url.replace(
 | 
					 | 
				
			||||||
                                    "fmt=ttml",
 | 
					 | 
				
			||||||
                                    "fmt=vtt"
 | 
					 | 
				
			||||||
                                ),
 | 
					 | 
				
			||||||
                                label: "Track",
 | 
					 | 
				
			||||||
                                type: "captions/captions.vtt"
 | 
					 | 
				
			||||||
                            },
 | 
					 | 
				
			||||||
                            false
 | 
					 | 
				
			||||||
                        ).mode = "showing";
 | 
					 | 
				
			||||||
                    });
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    //const parent = this.player.el().querySelector(".vjs-progress-holder")
 | 
					                    //const parent = this.player.el().querySelector(".vjs-progress-holder")
 | 
				
			||||||
                    //TODO: Add sponsors on seekbar: https://github.com/ajayyy/SponsorBlock/blob/e39de9fd852adb9196e0358ed827ad38d9933e29/src/js-components/previewBar.ts#L12
 | 
					                    //TODO: Add sponsors on seekbar: https://github.com/ajayyy/SponsorBlock/blob/e39de9fd852adb9196e0358ed827ad38d9933e29/src/js-components/previewBar.ts#L12
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,6 +33,12 @@ const mixin = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return str;
 | 
					            return str;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        fetchJson: function (url, options) {
 | 
				
			||||||
 | 
					            return fetch(url, options)
 | 
				
			||||||
 | 
					                .then(response => {
 | 
				
			||||||
 | 
					                    return response.json();
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										189
									
								
								src/utils/DashUtils.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										189
									
								
								src/utils/DashUtils.js
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,189 @@
 | 
				
			||||||
 | 
					// Based of https://github.com/GilgusMaximus/yt-dash-manifest-generator/blob/master/src/DashGenerator.js
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const xml = require('xml-js')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DashUtils = {
 | 
				
			||||||
 | 
					    generate_dash_file_from_formats(VideoFormats, VideoLength) {
 | 
				
			||||||
 | 
					        const generatedJSON = this.generate_xmljs_json_from_data(VideoFormats, VideoLength)
 | 
				
			||||||
 | 
					        return xml.json2xml(generatedJSON)
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    generate_xmljs_json_from_data(VideoFormatArray, VideoLength) {
 | 
				
			||||||
 | 
					        const convertJSON = {
 | 
				
			||||||
 | 
					            "declaration": {
 | 
				
			||||||
 | 
					                "attributes": {
 | 
				
			||||||
 | 
					                    "version": "1.0",
 | 
				
			||||||
 | 
					                    "encoding": "utf-8"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "elements": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "type": "element",
 | 
				
			||||||
 | 
					                    "name": "MPD",
 | 
				
			||||||
 | 
					                    "attributes": {
 | 
				
			||||||
 | 
					                        "xmlns": "urn:mpeg:dash:schema:mpd:2011",
 | 
				
			||||||
 | 
					                        "profiles": "urn:mpeg:dash:profile:full:2011",
 | 
				
			||||||
 | 
					                        "minBufferTime": "PT1.5S",
 | 
				
			||||||
 | 
					                        "type": "static",
 | 
				
			||||||
 | 
					                        "mediaPresentationDuration": `PT${VideoLength}S`
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "elements": [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "type": "element",
 | 
				
			||||||
 | 
					                            "name": "Period",
 | 
				
			||||||
 | 
					                            "elements": this.generate_adaptation_set(VideoFormatArray)
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return convertJSON
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    generate_adaptation_set(VideoFormatArray) {
 | 
				
			||||||
 | 
					        const adaptationSets = []
 | 
				
			||||||
 | 
					        const mimeTypes = []
 | 
				
			||||||
 | 
					        const mimeObjects = [[]]
 | 
				
			||||||
 | 
					        // sort the formats by mime types
 | 
				
			||||||
 | 
					        VideoFormatArray.forEach((videoFormat) => {
 | 
				
			||||||
 | 
					            // the dual formats should not be used
 | 
				
			||||||
 | 
					            if (videoFormat.mimeType.indexOf("video") != -1 && !videoFormat.videoOnly) {
 | 
				
			||||||
 | 
					                return
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            // if these properties are not available, then we skip it because we cannot set these properties
 | 
				
			||||||
 | 
					            //if (!(videoFormat.hasOwnProperty('initRange') && videoFormat.hasOwnProperty('indexRange'))) {
 | 
				
			||||||
 | 
					            //   return
 | 
				
			||||||
 | 
					            //}
 | 
				
			||||||
 | 
					            const mimeType = videoFormat.mimeType
 | 
				
			||||||
 | 
					            const mimeTypeIndex = mimeTypes.indexOf(mimeType)
 | 
				
			||||||
 | 
					            if (mimeTypeIndex > -1) {
 | 
				
			||||||
 | 
					                mimeObjects[mimeTypeIndex].push(videoFormat)
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                mimeTypes.push(mimeType)
 | 
				
			||||||
 | 
					                mimeObjects.push([])
 | 
				
			||||||
 | 
					                mimeObjects[mimeTypes.length - 1].push(videoFormat)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        // for each MimeType generate a new Adaptation set with Representations as sub elements
 | 
				
			||||||
 | 
					        for (let i = 0; i < mimeTypes.length; i++) {
 | 
				
			||||||
 | 
					            let isVideoFormat = false
 | 
				
			||||||
 | 
					            const adapSet = {
 | 
				
			||||||
 | 
					                "type": "element",
 | 
				
			||||||
 | 
					                "name": "AdaptationSet",
 | 
				
			||||||
 | 
					                "attributes": {
 | 
				
			||||||
 | 
					                    "id": i,
 | 
				
			||||||
 | 
					                    "mimeType": mimeTypes[i],
 | 
				
			||||||
 | 
					                    "startWithSAP": "1",
 | 
				
			||||||
 | 
					                    "subsegmentAlignment": "true"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "elements": []
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (!mimeTypes[i].includes("audio")) {
 | 
				
			||||||
 | 
					                adapSet.attributes.scanType = "progressive"
 | 
				
			||||||
 | 
					                isVideoFormat = true
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            mimeObjects[i].forEach((format) => {
 | 
				
			||||||
 | 
					                if (isVideoFormat) {
 | 
				
			||||||
 | 
					                    adapSet.elements.push(this.generate_representation_video(format))
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    adapSet.elements.push(this.generate_representation_audio(format))
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					            adaptationSets.push(adapSet)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return adaptationSets
 | 
				
			||||||
 | 
					    }, generate_representation_audio(Format) {
 | 
				
			||||||
 | 
					        const representation =
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "type": "element",
 | 
				
			||||||
 | 
					            "name": "Representation",
 | 
				
			||||||
 | 
					            "attributes": {
 | 
				
			||||||
 | 
					                "id": Format.itag,
 | 
				
			||||||
 | 
					                "codecs": Format.codec,
 | 
				
			||||||
 | 
					                "bandwidth": Format.bitrate
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "elements": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "type": "element",
 | 
				
			||||||
 | 
					                    "name": "AudioChannelConfiguration",
 | 
				
			||||||
 | 
					                    "attributes": {
 | 
				
			||||||
 | 
					                        "schemeIdUri": "urn:mpeg:dash:23003:3:audio_channel_configuration:2011",
 | 
				
			||||||
 | 
					                        "value": "2"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "type": "element",
 | 
				
			||||||
 | 
					                    "name": "BaseURL",
 | 
				
			||||||
 | 
					                    "elements": [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "type": "text",
 | 
				
			||||||
 | 
					                            "text": Format.url
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "type": "element",
 | 
				
			||||||
 | 
					                    "name": "SegmentBase",
 | 
				
			||||||
 | 
					                    "attributes": {
 | 
				
			||||||
 | 
					                        "indexRange": `${Format.indexStart}-${Format.indexEnd}`
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "elements": [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "type": "element",
 | 
				
			||||||
 | 
					                            "name": "Initialization",
 | 
				
			||||||
 | 
					                            "attributes": {
 | 
				
			||||||
 | 
					                                "range": `${Format.initStart}-${Format.initEnd}`
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return representation
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    generate_representation_video(Format) {
 | 
				
			||||||
 | 
					        const representation =
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "type": "element",
 | 
				
			||||||
 | 
					            "name": "Representation",
 | 
				
			||||||
 | 
					            "attributes": {
 | 
				
			||||||
 | 
					                "id": Format.itag,
 | 
				
			||||||
 | 
					                "codecs": Format.codec,
 | 
				
			||||||
 | 
					                "bandwidth": Format.bitrate,
 | 
				
			||||||
 | 
					                "width": Format.width,
 | 
				
			||||||
 | 
					                "height": Format.height,
 | 
				
			||||||
 | 
					                "maxPlayoutRate": "1",
 | 
				
			||||||
 | 
					                "frameRate": Format.fps
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "elements": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "type": "element",
 | 
				
			||||||
 | 
					                    "name": "BaseURL",
 | 
				
			||||||
 | 
					                    "elements": [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "type": "text",
 | 
				
			||||||
 | 
					                            "text": Format.url
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "type": "element",
 | 
				
			||||||
 | 
					                    "name": "SegmentBase",
 | 
				
			||||||
 | 
					                    "attributes": {
 | 
				
			||||||
 | 
					                        "indexRange": `${Format.indexStart}-${Format.indexEnd}`
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    "elements": [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "type": "element",
 | 
				
			||||||
 | 
					                            "name": "Initialization",
 | 
				
			||||||
 | 
					                            "attributes": {
 | 
				
			||||||
 | 
					                                "range": `${Format.initStart}-${Format.initEnd}`
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return representation
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default DashUtils;
 | 
				
			||||||
							
								
								
									
										231
									
								
								yarn.lock
									
										
									
									
									
								
							
							
						
						
									
										231
									
								
								yarn.lock
									
										
									
									
									
								
							| 
						 | 
					@ -806,7 +806,7 @@
 | 
				
			||||||
    "@babel/types" "^7.4.4"
 | 
					    "@babel/types" "^7.4.4"
 | 
				
			||||||
    esutils "^2.0.2"
 | 
					    esutils "^2.0.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@babel/runtime@^7.0.0", "@babel/runtime@^7.11.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
 | 
					"@babel/runtime@^7.0.0", "@babel/runtime@^7.11.0", "@babel/runtime@^7.3.4", "@babel/runtime@^7.8.4":
 | 
				
			||||||
  version "7.12.13"
 | 
					  version "7.12.13"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.13.tgz#0a21452352b02542db0ffb928ac2d3ca7cb6d66d"
 | 
					  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.13.tgz#0a21452352b02542db0ffb928ac2d3ca7cb6d66d"
 | 
				
			||||||
  integrity sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw==
 | 
					  integrity sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw==
 | 
				
			||||||
| 
						 | 
					@ -940,14 +940,6 @@
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
 | 
					  resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
 | 
				
			||||||
  integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
 | 
					  integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@silvermine/videojs-quality-selector@^1.2.4":
 | 
					 | 
				
			||||||
  version "1.2.4"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@silvermine/videojs-quality-selector/-/videojs-quality-selector-1.2.4.tgz#6aff612b692f59bb2c0eede76d49469918669cc9"
 | 
					 | 
				
			||||||
  integrity sha512-bLCoOk2kEhebXjuREMIjCqM1ZYQOnIJ8/McF2NcTsK6RluuHUSnFzZrH98sWkHGOTNrt+g9m27+kLlR6+x5jYg==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    class.extend "0.9.1"
 | 
					 | 
				
			||||||
    underscore "1.9.1"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@soda/friendly-errors-webpack-plugin@^1.7.1":
 | 
					"@soda/friendly-errors-webpack-plugin@^1.7.1":
 | 
				
			||||||
  version "1.8.0"
 | 
					  version "1.8.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.0.tgz#84751d82a93019d5c92c0cf0e45ac59087cd2240"
 | 
					  resolved "https://registry.yarnpkg.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.0.tgz#84751d82a93019d5c92c0cf0e45ac59087cd2240"
 | 
				
			||||||
| 
						 | 
					@ -1136,38 +1128,6 @@
 | 
				
			||||||
    "@types/webpack-sources" "*"
 | 
					    "@types/webpack-sources" "*"
 | 
				
			||||||
    source-map "^0.6.0"
 | 
					    source-map "^0.6.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@videojs/http-streaming@2.4.2":
 | 
					 | 
				
			||||||
  version "2.4.2"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@videojs/http-streaming/-/http-streaming-2.4.2.tgz#0289c1833e33f3242d1faf5f52a4052ec15abdcf"
 | 
					 | 
				
			||||||
  integrity sha512-yXT85ao2t9Sg/aQN2MV1AYikoRToxCaHD8rRR1+SuOWOv9+z8+M4X9ZvxIdFF3pFgZ67Widp/6xyRrDn2u2QWQ==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    "@babel/runtime" "^7.12.5"
 | 
					 | 
				
			||||||
    "@videojs/vhs-utils" "^2.3.0"
 | 
					 | 
				
			||||||
    aes-decrypter "3.1.0"
 | 
					 | 
				
			||||||
    global "^4.4.0"
 | 
					 | 
				
			||||||
    m3u8-parser "4.5.0"
 | 
					 | 
				
			||||||
    mpd-parser "0.15.0"
 | 
					 | 
				
			||||||
    mux.js "5.8.0"
 | 
					 | 
				
			||||||
    video.js "^6 || ^7"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@videojs/vhs-utils@^2.2.1", "@videojs/vhs-utils@^2.3.0":
 | 
					 | 
				
			||||||
  version "2.3.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@videojs/vhs-utils/-/vhs-utils-2.3.0.tgz#490a3a00dfc1b51d85d5dcf8f8361e2d4c4d1440"
 | 
					 | 
				
			||||||
  integrity sha512-ThSmm91S7tuIJ757ON50K4y7S/bvKN4+B0tu303gCOxaG57PoP1UvPfMQZ90XGhxwNgngexVojOqbBHhTvXVHQ==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    "@babel/runtime" "^7.5.5"
 | 
					 | 
				
			||||||
    global "^4.3.2"
 | 
					 | 
				
			||||||
    url-toolkit "^2.1.6"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@videojs/xhr@2.5.1":
 | 
					 | 
				
			||||||
  version "2.5.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@videojs/xhr/-/xhr-2.5.1.tgz#26bc5a79dbb3b03bfb13742c6ce559f89e90719e"
 | 
					 | 
				
			||||||
  integrity sha512-wV9nGESHseSK+S9ePEru2+OJZ1jq/ZbbzniGQ4weAmTIepuBMSYPx5zrxxQA0E786T5ykpO8ts+LayV+3/oI2w==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    "@babel/runtime" "^7.5.5"
 | 
					 | 
				
			||||||
    global "~4.4.0"
 | 
					 | 
				
			||||||
    is-function "^1.0.1"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"@vue/babel-helper-vue-jsx-merge-props@^1.2.1":
 | 
					"@vue/babel-helper-vue-jsx-merge-props@^1.2.1":
 | 
				
			||||||
  version "1.2.1"
 | 
					  version "1.2.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz#31624a7a505fb14da1d58023725a4c5f270e6a81"
 | 
					  resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz#31624a7a505fb14da1d58023725a4c5f270e6a81"
 | 
				
			||||||
| 
						 | 
					@ -1714,16 +1674,6 @@ address@^1.1.2:
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6"
 | 
					  resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6"
 | 
				
			||||||
  integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==
 | 
					  integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
aes-decrypter@3.1.0:
 | 
					 | 
				
			||||||
  version "3.1.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/aes-decrypter/-/aes-decrypter-3.1.0.tgz#fc0b1d703f97a64aa3f7b13528f4661971db68c4"
 | 
					 | 
				
			||||||
  integrity sha512-wL1NFwP2yNrJG4InpXYFhhYe9TfonnDyhyxMq2+K9/qt+SrZzUieOpviN6pkDly7GawTqw5feehk0rn5iYo00g==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    "@babel/runtime" "^7.5.5"
 | 
					 | 
				
			||||||
    "@videojs/vhs-utils" "^2.2.1"
 | 
					 | 
				
			||||||
    global "^4.3.2"
 | 
					 | 
				
			||||||
    pkcs7 "^1.0.4"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
aggregate-error@^3.0.0:
 | 
					aggregate-error@^3.0.0:
 | 
				
			||||||
  version "3.1.0"
 | 
					  version "3.1.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
 | 
					  resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
 | 
				
			||||||
| 
						 | 
					@ -2565,11 +2515,6 @@ class-utils@^0.3.5:
 | 
				
			||||||
    isobject "^3.0.0"
 | 
					    isobject "^3.0.0"
 | 
				
			||||||
    static-extend "^0.1.1"
 | 
					    static-extend "^0.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class.extend@0.9.1:
 | 
					 | 
				
			||||||
  version "0.9.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/class.extend/-/class.extend-0.9.1.tgz#b4ee417c693740a44a92a6d64f1c9540641b097a"
 | 
					 | 
				
			||||||
  integrity sha1-tO5BfGk3QKRKkqbWTxyVQGQbCXo=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
clean-css@4.2.x:
 | 
					clean-css@4.2.x:
 | 
				
			||||||
  version "4.2.3"
 | 
					  version "4.2.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78"
 | 
					  resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78"
 | 
				
			||||||
| 
						 | 
					@ -3388,11 +3333,6 @@ dom-serializer@0:
 | 
				
			||||||
    domelementtype "^2.0.1"
 | 
					    domelementtype "^2.0.1"
 | 
				
			||||||
    entities "^2.0.0"
 | 
					    entities "^2.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dom-walk@^0.1.0:
 | 
					 | 
				
			||||||
  version "0.1.2"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
 | 
					 | 
				
			||||||
  integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
domain-browser@^1.1.1:
 | 
					domain-browser@^1.1.1:
 | 
				
			||||||
  version "1.2.0"
 | 
					  version "1.2.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
 | 
					  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
 | 
				
			||||||
| 
						 | 
					@ -3504,6 +3444,11 @@ elliptic@^6.5.3:
 | 
				
			||||||
    minimalistic-assert "^1.0.0"
 | 
					    minimalistic-assert "^1.0.0"
 | 
				
			||||||
    minimalistic-crypto-utils "^1.0.0"
 | 
					    minimalistic-crypto-utils "^1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					eme-encryption-scheme-polyfill@^2.0.1:
 | 
				
			||||||
 | 
					  version "2.0.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/eme-encryption-scheme-polyfill/-/eme-encryption-scheme-polyfill-2.0.2.tgz#6d3edb6d95951883a499f2d6dafbd84a5574f8c3"
 | 
				
			||||||
 | 
					  integrity sha512-tZXuxVUCV1GmlQBGGVVNAt6lXBUxjDFqIAPAhz4F5Z/TvCi/coojxcZGEO5k+KMt/dWRFmXaK5pxKCMehue/oA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
emoji-regex@^7.0.1:
 | 
					emoji-regex@^7.0.1:
 | 
				
			||||||
  version "7.0.3"
 | 
					  version "7.0.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
 | 
					  resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
 | 
				
			||||||
| 
						 | 
					@ -3696,10 +3641,10 @@ eslint-visitor-keys@^2.0.0:
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
 | 
					  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
 | 
				
			||||||
  integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
 | 
					  integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
eslint@^7.20.0:
 | 
					eslint@^7.18.0:
 | 
				
			||||||
  version "7.20.0"
 | 
					  version "7.19.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.20.0.tgz#db07c4ca4eda2e2316e7aa57ac7fc91ec550bdc7"
 | 
					  resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.19.0.tgz#6719621b196b5fad72e43387981314e5d0dc3f41"
 | 
				
			||||||
  integrity sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw==
 | 
					  integrity sha512-CGlMgJY56JZ9ZSYhJuhow61lMPPjUzWmChFya71Z/jilVos7mR/jPgaEfVGgMBY5DshbKdG8Ezb8FDCHcoMEMg==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@babel/code-frame" "7.12.11"
 | 
					    "@babel/code-frame" "7.12.11"
 | 
				
			||||||
    "@eslint/eslintrc" "^0.3.0"
 | 
					    "@eslint/eslintrc" "^0.3.0"
 | 
				
			||||||
| 
						 | 
					@ -4360,22 +4305,6 @@ glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
 | 
				
			||||||
    once "^1.3.0"
 | 
					    once "^1.3.0"
 | 
				
			||||||
    path-is-absolute "^1.0.0"
 | 
					    path-is-absolute "^1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
global@4.3.2:
 | 
					 | 
				
			||||||
  version "4.3.2"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
 | 
					 | 
				
			||||||
  integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    min-document "^2.19.0"
 | 
					 | 
				
			||||||
    process "~0.5.1"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
global@^4.3.1, global@^4.3.2, global@^4.4.0, global@~4.4.0:
 | 
					 | 
				
			||||||
  version "4.4.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
 | 
					 | 
				
			||||||
  integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    min-document "^2.19.0"
 | 
					 | 
				
			||||||
    process "^0.11.10"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
globals@^11.1.0:
 | 
					globals@^11.1.0:
 | 
				
			||||||
  version "11.12.0"
 | 
					  version "11.12.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
 | 
					  resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
 | 
				
			||||||
| 
						 | 
					@ -4830,11 +4759,6 @@ indexes-of@^1.0.1:
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
 | 
					  resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
 | 
				
			||||||
  integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
 | 
					  integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
individual@^2.0.0:
 | 
					 | 
				
			||||||
  version "2.0.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/individual/-/individual-2.0.0.tgz#833b097dad23294e76117a98fb38e0d9ad61bb97"
 | 
					 | 
				
			||||||
  integrity sha1-gzsJfa0jKU52EXqY+zjg2a1hu5c=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
infer-owner@^1.0.3, infer-owner@^1.0.4:
 | 
					infer-owner@^1.0.3, infer-owner@^1.0.4:
 | 
				
			||||||
  version "1.0.4"
 | 
					  version "1.0.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
 | 
					  resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
 | 
				
			||||||
| 
						 | 
					@ -5070,11 +4994,6 @@ is-fullwidth-code-point@^3.0.0:
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
 | 
					  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
 | 
				
			||||||
  integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
 | 
					  integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
is-function@^1.0.1:
 | 
					 | 
				
			||||||
  version "1.0.2"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08"
 | 
					 | 
				
			||||||
  integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
is-glob@^3.1.0:
 | 
					is-glob@^3.1.0:
 | 
				
			||||||
  version "3.1.0"
 | 
					  version "3.1.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
 | 
					  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
 | 
				
			||||||
| 
						 | 
					@ -5373,11 +5292,6 @@ jsprim@^1.2.2:
 | 
				
			||||||
    json-schema "0.2.3"
 | 
					    json-schema "0.2.3"
 | 
				
			||||||
    verror "1.10.0"
 | 
					    verror "1.10.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
keycode@^2.2.0:
 | 
					 | 
				
			||||||
  version "2.2.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04"
 | 
					 | 
				
			||||||
  integrity sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
killable@^1.0.1:
 | 
					killable@^1.0.1:
 | 
				
			||||||
  version "1.0.1"
 | 
					  version "1.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
 | 
					  resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
 | 
				
			||||||
| 
						 | 
					@ -5619,15 +5533,6 @@ lru-cache@^6.0.0:
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    yallist "^4.0.0"
 | 
					    yallist "^4.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
m3u8-parser@4.5.0:
 | 
					 | 
				
			||||||
  version "4.5.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/m3u8-parser/-/m3u8-parser-4.5.0.tgz#9c30b32c9b69cc3f81b5e6789717fa84b9fdb9aa"
 | 
					 | 
				
			||||||
  integrity sha512-RGm/1WVCX3o1bSWbJGmJUu4zTbtJy8lImtgHM4CESFvJRXYztr1j6SW/q9/ghYOrUjgH7radsIar+z1Leln0sA==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    "@babel/runtime" "^7.5.5"
 | 
					 | 
				
			||||||
    "@videojs/vhs-utils" "^2.2.1"
 | 
					 | 
				
			||||||
    global "^4.3.2"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
magic-string@^0.25.7:
 | 
					magic-string@^0.25.7:
 | 
				
			||||||
  version "0.25.7"
 | 
					  version "0.25.7"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051"
 | 
					  resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051"
 | 
				
			||||||
| 
						 | 
					@ -5793,13 +5698,6 @@ mimic-fn@^2.1.0:
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
 | 
					  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
 | 
				
			||||||
  integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
 | 
					  integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
min-document@^2.19.0:
 | 
					 | 
				
			||||||
  version "2.19.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
 | 
					 | 
				
			||||||
  integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    dom-walk "^0.1.0"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
mini-css-extract-plugin@^0.9.0:
 | 
					mini-css-extract-plugin@^0.9.0:
 | 
				
			||||||
  version "0.9.0"
 | 
					  version "0.9.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e"
 | 
					  resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e"
 | 
				
			||||||
| 
						 | 
					@ -5903,16 +5801,6 @@ move-concurrently@^1.0.1:
 | 
				
			||||||
    rimraf "^2.5.4"
 | 
					    rimraf "^2.5.4"
 | 
				
			||||||
    run-queue "^1.0.3"
 | 
					    run-queue "^1.0.3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
mpd-parser@0.15.0:
 | 
					 | 
				
			||||||
  version "0.15.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/mpd-parser/-/mpd-parser-0.15.0.tgz#2b4836e6bdbd92229110e31b189ed029535aea83"
 | 
					 | 
				
			||||||
  integrity sha512-GfspJVaEnVbWKZQASvh9nsJkvxWh3M/c5Kb2RPnN5ZXPZ7jWWfarWkNKTEuqvoaAKIT8IB/r6PFTWA1GY4fzGg==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    "@babel/runtime" "^7.5.5"
 | 
					 | 
				
			||||||
    "@videojs/vhs-utils" "^2.2.1"
 | 
					 | 
				
			||||||
    global "^4.3.2"
 | 
					 | 
				
			||||||
    xmldom "^0.1.27"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ms@2.0.0:
 | 
					ms@2.0.0:
 | 
				
			||||||
  version "2.0.0"
 | 
					  version "2.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
 | 
					  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
 | 
				
			||||||
| 
						 | 
					@ -5951,11 +5839,6 @@ mute-stream@0.0.8:
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
 | 
					  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
 | 
				
			||||||
  integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
 | 
					  integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
mux.js@5.8.0:
 | 
					 | 
				
			||||||
  version "5.8.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/mux.js/-/mux.js-5.8.0.tgz#1e1ca927b498de5ae48f1284ccada4d88e47e187"
 | 
					 | 
				
			||||||
  integrity sha512-v56I2YPyCq1bVbXW7vcuvQs8iHrDy7AeXsZyG1kxCxBUqUjZD0Xq/cU1wrd5dy9YTxRpvw37aTQ4ILwi40GXiw==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
mz@^2.4.0:
 | 
					mz@^2.4.0:
 | 
				
			||||||
  version "2.7.0"
 | 
					  version "2.7.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
 | 
					  resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
 | 
				
			||||||
| 
						 | 
					@ -6579,13 +6462,6 @@ pinkie@^2.0.0:
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
 | 
					  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
 | 
				
			||||||
  integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
 | 
					  integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pkcs7@^1.0.4:
 | 
					 | 
				
			||||||
  version "1.0.4"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/pkcs7/-/pkcs7-1.0.4.tgz#6090b9e71160dabf69209d719cbafa538b00a1cb"
 | 
					 | 
				
			||||||
  integrity sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    "@babel/runtime" "^7.5.5"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pkg-dir@^1.0.0:
 | 
					pkg-dir@^1.0.0:
 | 
				
			||||||
  version "1.0.0"
 | 
					  version "1.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4"
 | 
					  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4"
 | 
				
			||||||
| 
						 | 
					@ -7054,11 +6930,6 @@ process@^0.11.10:
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
 | 
					  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
 | 
				
			||||||
  integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
 | 
					  integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
process@~0.5.1:
 | 
					 | 
				
			||||||
  version "0.5.2"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
 | 
					 | 
				
			||||||
  integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
progress@^2.0.0:
 | 
					progress@^2.0.0:
 | 
				
			||||||
  version "2.0.3"
 | 
					  version "2.0.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
 | 
					  resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
 | 
				
			||||||
| 
						 | 
					@ -7511,13 +7382,6 @@ run-queue@^1.0.0, run-queue@^1.0.3:
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    aproba "^1.1.1"
 | 
					    aproba "^1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
rust-result@^1.0.0:
 | 
					 | 
				
			||||||
  version "1.0.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/rust-result/-/rust-result-1.0.0.tgz#34c75b2e6dc39fe5875e5bdec85b5e0f91536f72"
 | 
					 | 
				
			||||||
  integrity sha1-NMdbLm3Dn+WHXlveyFteD5FTb3I=
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    individual "^2.0.0"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
rxjs@^6.6.0:
 | 
					rxjs@^6.6.0:
 | 
				
			||||||
  version "6.6.3"
 | 
					  version "6.6.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552"
 | 
					  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552"
 | 
				
			||||||
| 
						 | 
					@ -7535,13 +7399,6 @@ safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1,
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
 | 
					  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
 | 
				
			||||||
  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
 | 
					  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
safe-json-parse@4.0.0:
 | 
					 | 
				
			||||||
  version "4.0.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-4.0.0.tgz#7c0f578cfccd12d33a71c0e05413e2eca171eaac"
 | 
					 | 
				
			||||||
  integrity sha1-fA9XjPzNEtM6ccDgVBPi7KFx6qw=
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    rust-result "^1.0.0"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
safe-regex@^1.1.0:
 | 
					safe-regex@^1.1.0:
 | 
				
			||||||
  version "1.1.0"
 | 
					  version "1.1.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
 | 
					  resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
 | 
				
			||||||
| 
						 | 
					@ -7554,7 +7411,7 @@ safe-regex@^1.1.0:
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
 | 
					  resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
 | 
				
			||||||
  integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
 | 
					  integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sax@~1.2.4:
 | 
					sax@^1.2.4, sax@~1.2.4:
 | 
				
			||||||
  version "1.2.4"
 | 
					  version "1.2.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
 | 
					  resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
 | 
				
			||||||
  integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
 | 
					  integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
 | 
				
			||||||
| 
						 | 
					@ -7707,6 +7564,13 @@ sha.js@^2.4.0, sha.js@^2.4.8:
 | 
				
			||||||
    inherits "^2.0.1"
 | 
					    inherits "^2.0.1"
 | 
				
			||||||
    safe-buffer "^5.0.1"
 | 
					    safe-buffer "^5.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					shaka-player@3.0.8:
 | 
				
			||||||
 | 
					  version "3.0.8"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/shaka-player/-/shaka-player-3.0.8.tgz#32e4c321b80012bca9db9a20b7ec63eefd7df512"
 | 
				
			||||||
 | 
					  integrity sha512-4nROuGUhmtOTERWVO31pp/hvtdCy/kW/Ys6KQwqRhFeCsZsU1/8768dJUyXKqNnbYybKIvuv6LqO8egkXy6TjA==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    eme-encryption-scheme-polyfill "^2.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
shebang-command@^1.2.0:
 | 
					shebang-command@^1.2.0:
 | 
				
			||||||
  version "1.2.0"
 | 
					  version "1.2.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
 | 
					  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
 | 
				
			||||||
| 
						 | 
					@ -8464,11 +8328,6 @@ uikit@3.6.16:
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/uikit/-/uikit-3.6.16.tgz#7884733236ba3e31257cfa0a01b4b26775665d90"
 | 
					  resolved "https://registry.yarnpkg.com/uikit/-/uikit-3.6.16.tgz#7884733236ba3e31257cfa0a01b4b26775665d90"
 | 
				
			||||||
  integrity sha512-L/5BpfcMTRNcuPtwMcQSffPpq+mapMOpHfmL2CbijBDKq/D24blcN/2QRMhQkTeFpM5p6nBgcKDGbWOhr/nilg==
 | 
					  integrity sha512-L/5BpfcMTRNcuPtwMcQSffPpq+mapMOpHfmL2CbijBDKq/D24blcN/2QRMhQkTeFpM5p6nBgcKDGbWOhr/nilg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
underscore@1.9.1:
 | 
					 | 
				
			||||||
  version "1.9.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
 | 
					 | 
				
			||||||
  integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
unicode-canonical-property-names-ecmascript@^1.0.4:
 | 
					unicode-canonical-property-names-ecmascript@^1.0.4:
 | 
				
			||||||
  version "1.0.4"
 | 
					  version "1.0.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
 | 
					  resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
 | 
				
			||||||
| 
						 | 
					@ -8588,11 +8447,6 @@ url-parse@^1.4.3:
 | 
				
			||||||
    querystringify "^2.1.1"
 | 
					    querystringify "^2.1.1"
 | 
				
			||||||
    requires-port "^1.0.0"
 | 
					    requires-port "^1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
url-toolkit@^2.1.6:
 | 
					 | 
				
			||||||
  version "2.2.1"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/url-toolkit/-/url-toolkit-2.2.1.tgz#89009ed3d62a3574de079532a7266c14d2cc1c4f"
 | 
					 | 
				
			||||||
  integrity sha512-8+DzgrtDZYZGhHaAop5WGVghMdCfOLGbhcArsJD0qDll71FXa7EeKxi2hilPIscn2nwMz4PRjML32Sz4JTN0Xw==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
url@^0.11.0:
 | 
					url@^0.11.0:
 | 
				
			||||||
  version "0.11.0"
 | 
					  version "0.11.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
 | 
					  resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
 | 
				
			||||||
| 
						 | 
					@ -8690,45 +8544,6 @@ verror@1.10.0:
 | 
				
			||||||
    core-util-is "1.0.2"
 | 
					    core-util-is "1.0.2"
 | 
				
			||||||
    extsprintf "^1.2.0"
 | 
					    extsprintf "^1.2.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"video.js@^6 || ^7", video.js@^7.11.4:
 | 
					 | 
				
			||||||
  version "7.11.4"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/video.js/-/video.js-7.11.4.tgz#64300cb6def9f17ecba4808ae76ec7c10c952378"
 | 
					 | 
				
			||||||
  integrity sha512-eT9n7YCugHyWNHI2gyK28XoozNmLiW4F9dRYEP6ET/JVmm7oXPhLeVfs5kqcRviquISqWsvsNmhK1b9vvZzyVA==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    "@babel/runtime" "^7.9.2"
 | 
					 | 
				
			||||||
    "@videojs/http-streaming" "2.4.2"
 | 
					 | 
				
			||||||
    "@videojs/xhr" "2.5.1"
 | 
					 | 
				
			||||||
    global "4.3.2"
 | 
					 | 
				
			||||||
    keycode "^2.2.0"
 | 
					 | 
				
			||||||
    safe-json-parse "4.0.0"
 | 
					 | 
				
			||||||
    videojs-font "3.2.0"
 | 
					 | 
				
			||||||
    videojs-vtt.js "^0.15.2"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
videojs-contrib-quality-levels@^2.0.9:
 | 
					 | 
				
			||||||
  version "2.0.9"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-2.0.9.tgz#b5d533d5092a6fc7d29eae1b43e4597d89bd527b"
 | 
					 | 
				
			||||||
  integrity sha512-HJeaJJQdSufi9Y5T7jlyyhkeq+mWPCog86q6ypoTi66boBMMJTo2abiOSHS9KaOGAJjH72gfvrjVY5FRdjlxYA==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    global "^4.3.2"
 | 
					 | 
				
			||||||
    video.js "^6 || ^7"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
videojs-font@3.2.0:
 | 
					 | 
				
			||||||
  version "3.2.0"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/videojs-font/-/videojs-font-3.2.0.tgz#212c9d3f4e4ec3fa7345167d64316add35e92232"
 | 
					 | 
				
			||||||
  integrity sha512-g8vHMKK2/JGorSfqAZQUmYYNnXmfec4MLhwtEFS+mMs2IDY398GLysy6BH6K+aS1KMNu/xWZ8Sue/X/mdQPliA==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
videojs-hotkeys@^0.2.27:
 | 
					 | 
				
			||||||
  version "0.2.27"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/videojs-hotkeys/-/videojs-hotkeys-0.2.27.tgz#0df97952b9dff0e6cc1cf8a439fed7eac9c73f01"
 | 
					 | 
				
			||||||
  integrity sha512-pwtm1QocRmzJy1PWQsmFVHyeldYHHpLdeATK3FsFHVMmNpz6CROkAn8TFy2UILr8Ghgq134K8jEKNue8HWpudQ==
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
videojs-vtt.js@^0.15.2:
 | 
					 | 
				
			||||||
  version "0.15.2"
 | 
					 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/videojs-vtt.js/-/videojs-vtt.js-0.15.2.tgz#a828c4ea0aac6303fa471fd69bc7586a5ba1a273"
 | 
					 | 
				
			||||||
  integrity sha512-kEo4hNMvu+6KhPvVYPKwESruwhHC3oFis133LwhXHO9U7nRnx0RiJYMiqbgwjgazDEXHR6t8oGJiHM6wq5XlAw==
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    global "^4.3.1"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
vm-browserify@^1.0.1:
 | 
					vm-browserify@^1.0.1:
 | 
				
			||||||
  version "1.1.2"
 | 
					  version "1.1.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
 | 
					  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
 | 
				
			||||||
| 
						 | 
					@ -9176,10 +8991,12 @@ ws@^6.0.0, ws@^6.2.1:
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    async-limiter "~1.0.0"
 | 
					    async-limiter "~1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
xmldom@^0.1.27:
 | 
					xml-js@^1.6.11:
 | 
				
			||||||
  version "0.1.31"
 | 
					  version "1.6.11"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff"
 | 
					  resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9"
 | 
				
			||||||
  integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==
 | 
					  integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    sax "^1.2.4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
xtend@^4.0.0, xtend@~4.0.1:
 | 
					xtend@^4.0.0, xtend@~4.0.1:
 | 
				
			||||||
  version "4.0.2"
 | 
					  version "4.0.2"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue