mirror of
				https://github.com/TeamPiped/Piped.git
				synced 2024-08-14 23:57:27 +00:00 
			
		
		
		
	Merge branch 'TeamPiped:master' into sticky-header
This commit is contained in:
		
						commit
						d1a4e5c919
					
				
					 16 changed files with 99 additions and 83 deletions
				
			
		| 
						 | 
					@ -3,7 +3,7 @@
 | 
				
			||||||
        <!-- eslint-disable-next-line vue/no-v-html -->
 | 
					        <!-- eslint-disable-next-line vue/no-v-html -->
 | 
				
			||||||
        <span v-if="showFullText" class="contentText" v-html="fullText()" />
 | 
					        <span v-if="showFullText" class="contentText" v-html="fullText()" />
 | 
				
			||||||
        <!-- eslint-disable-next-line vue/no-v-html -->
 | 
					        <!-- eslint-disable-next-line vue/no-v-html -->
 | 
				
			||||||
        <span v-else v-html="colapsedText()" />
 | 
					        <span v-else v-html="collapsedText()" />
 | 
				
			||||||
        <span v-if="text.length > visibleLimit && !showFullText">...</span>
 | 
					        <span v-if="text.length > visibleLimit && !showFullText">...</span>
 | 
				
			||||||
        <button
 | 
					        <button
 | 
				
			||||||
            v-if="text.length > visibleLimit"
 | 
					            v-if="text.length > visibleLimit"
 | 
				
			||||||
| 
						 | 
					@ -38,7 +38,7 @@ export default {
 | 
				
			||||||
        fullText() {
 | 
					        fullText() {
 | 
				
			||||||
            return purifyHTML(rewriteDescription(this.text));
 | 
					            return purifyHTML(rewriteDescription(this.text));
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        colapsedText() {
 | 
					        collapsedText() {
 | 
				
			||||||
            return purifyHTML(rewriteDescription(this.text.slice(0, this.visibleLimit)));
 | 
					            return purifyHTML(rewriteDescription(this.text.slice(0, this.visibleLimit)));
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,8 +33,13 @@
 | 
				
			||||||
            <div class="comment-footer my-1 flex items-center gap-3">
 | 
					            <div class="comment-footer my-1 flex items-center gap-3">
 | 
				
			||||||
                <div class="i-fa6-solid:thumbs-up" />
 | 
					                <div class="i-fa6-solid:thumbs-up" />
 | 
				
			||||||
                <span v-text="numberFormat(comment.likeCount)" />
 | 
					                <span v-text="numberFormat(comment.likeCount)" />
 | 
				
			||||||
                <i v-if="comment.hearted" class="i-fa6-solid:heart" />
 | 
					                <i v-if="comment.hearted" class="i-fa6-solid:heart" :title="$t('actions.creator_liked')" />
 | 
				
			||||||
                <img v-if="comment.creatorReplied" :src="uploaderAvatarUrl" class="h-5 w-5 rounded-full" />
 | 
					                <img
 | 
				
			||||||
 | 
					                    v-if="comment.creatorReplied"
 | 
				
			||||||
 | 
					                    :src="uploaderAvatarUrl"
 | 
				
			||||||
 | 
					                    class="h-5 w-5 rounded-full"
 | 
				
			||||||
 | 
					                    :title="$t('actions.creator_replied')"
 | 
				
			||||||
 | 
					                />
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <template v-if="comment.repliesPage && (!loadingReplies || !showingReplies)">
 | 
					            <template v-if="comment.repliesPage && (!loadingReplies || !showingReplies)">
 | 
				
			||||||
                <div class="cursor-pointer" @click="loadReplies">
 | 
					                <div class="cursor-pointer" @click="loadReplies">
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
    <div class="flex justify-center">
 | 
					    <div class="flex justify-center">
 | 
				
			||||||
        <h1 v-t="'titles.login'" class="my-4 text-center font-bold" />
 | 
					        <h1 v-t="'titles.login'" class="my-4 text-center font-bold" />
 | 
				
			||||||
        <TooltipIcon class="mb-6" icon="i-fa6-solid:circle-info" :tooltip="$t('info.login_note')" />
 | 
					        <i class="i-fa6-solid:circle-info ml-2 mt-6 cursor-pointer" :title="$t('info.login_note')" />
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
    <hr />
 | 
					    <hr />
 | 
				
			||||||
    <div class="w-full flex items-center justify-center text-center">
 | 
					    <div class="w-full flex items-center justify-center text-center">
 | 
				
			||||||
| 
						 | 
					@ -36,12 +36,7 @@
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
import TooltipIcon from "./TooltipIcon.vue";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default {
 | 
					export default {
 | 
				
			||||||
    components: {
 | 
					 | 
				
			||||||
        TooltipIcon,
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    data() {
 | 
					    data() {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            username: null,
 | 
					            username: null,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,10 +6,10 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <CollapsableText v-if="playlist?.description" :text="playlist.description" />
 | 
					        <CollapsableText v-if="playlist?.description" :text="playlist.description" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <div class="mt-1 flex <md:flex-col md:items-center justify-between">
 | 
					        <div class="mt-1 flex justify-between <md:flex-col md:items-center">
 | 
				
			||||||
            <div>
 | 
					            <div>
 | 
				
			||||||
                <router-link class="link flex items-center gap-3" :to="playlist.uploaderUrl || '/'">
 | 
					                <router-link class="link flex items-center gap-3" :to="playlist.uploaderUrl || '/'">
 | 
				
			||||||
                    <img loading="lazy" :src="playlist.uploaderAvatar" class="rounded-full h-12" />
 | 
					                    <img loading="lazy" :src="playlist.uploaderAvatar" class="h-12 rounded-full" />
 | 
				
			||||||
                    <strong v-text="playlist.uploader" />
 | 
					                    <strong v-text="playlist.uploader" />
 | 
				
			||||||
                </router-link>
 | 
					                </router-link>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
    <div class="flex justify-center">
 | 
					    <div class="flex justify-center">
 | 
				
			||||||
        <h1 v-t="'titles.register'" class="my-4 text-center font-bold" />
 | 
					        <h1 v-t="'titles.register'" class="my-4 text-center font-bold" />
 | 
				
			||||||
        <TooltipIcon class="mb-6" icon="i-fa6-solid:circle-info" :tooltip="$t('info.register_note')" />
 | 
					        <i class="i-fa6-solid:circle-info ml-2 mt-6 cursor-pointer" :title="$t('info.register_note')" />
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
    <hr />
 | 
					    <hr />
 | 
				
			||||||
    <div class="flex flex-col items-center justify-center text-center">
 | 
					    <div class="flex flex-col items-center justify-center text-center">
 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,7 @@
 | 
				
			||||||
            <div class="flex justify-center">
 | 
					            <div class="flex justify-center">
 | 
				
			||||||
                <input
 | 
					                <input
 | 
				
			||||||
                    v-model="password"
 | 
					                    v-model="password"
 | 
				
			||||||
                    class="input w-full"
 | 
					                    class="input h-auto w-full"
 | 
				
			||||||
                    :type="showPassword ? 'text' : 'password'"
 | 
					                    :type="showPassword ? 'text' : 'password'"
 | 
				
			||||||
                    autocomplete="password"
 | 
					                    autocomplete="password"
 | 
				
			||||||
                    :placeholder="$t('login.password')"
 | 
					                    :placeholder="$t('login.password')"
 | 
				
			||||||
| 
						 | 
					@ -34,7 +34,7 @@
 | 
				
			||||||
            <div class="flex justify-center">
 | 
					            <div class="flex justify-center">
 | 
				
			||||||
                <input
 | 
					                <input
 | 
				
			||||||
                    v-model="passwordConfirm"
 | 
					                    v-model="passwordConfirm"
 | 
				
			||||||
                    class="input w-full"
 | 
					                    class="input h-auto w-full"
 | 
				
			||||||
                    :type="showConfirmPassword ? 'text' : 'password'"
 | 
					                    :type="showConfirmPassword ? 'text' : 'password'"
 | 
				
			||||||
                    autocomplete="password"
 | 
					                    autocomplete="password"
 | 
				
			||||||
                    :placeholder="$t('login.password_confirm')"
 | 
					                    :placeholder="$t('login.password_confirm')"
 | 
				
			||||||
| 
						 | 
					@ -65,10 +65,9 @@
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
import { isEmail } from "../utils/Misc.js";
 | 
					import { isEmail } from "../utils/Misc.js";
 | 
				
			||||||
import ConfirmModal from "./ConfirmModal.vue";
 | 
					import ConfirmModal from "./ConfirmModal.vue";
 | 
				
			||||||
import TooltipIcon from "./TooltipIcon.vue";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default {
 | 
					export default {
 | 
				
			||||||
    components: { ConfirmModal, TooltipIcon },
 | 
					    components: { ConfirmModal },
 | 
				
			||||||
    data() {
 | 
					    data() {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            username: null,
 | 
					            username: null,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,29 +0,0 @@
 | 
				
			||||||
<template>
 | 
					 | 
				
			||||||
    <div id="container" class="m-2 self-center">
 | 
					 | 
				
			||||||
        <div :class="icon" class="cursor-pointer"></div>
 | 
					 | 
				
			||||||
        <p id="tooltip" class="absolute mr-[20vw] mt-2 hidden rounded-l bg-gray-800 px-2 py-1 text-gray-200">
 | 
					 | 
				
			||||||
            {{ tooltip }}
 | 
					 | 
				
			||||||
        </p>
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
</template>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<script>
 | 
					 | 
				
			||||||
export default {
 | 
					 | 
				
			||||||
    props: {
 | 
					 | 
				
			||||||
        icon: {
 | 
					 | 
				
			||||||
            type: String, // the class name of a font awesome icon
 | 
					 | 
				
			||||||
            required: true,
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        tooltip: {
 | 
					 | 
				
			||||||
            type: String,
 | 
					 | 
				
			||||||
            required: true,
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
</script>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<style>
 | 
					 | 
				
			||||||
#container:hover #tooltip {
 | 
					 | 
				
			||||||
    display: block;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
</style>
 | 
					 | 
				
			||||||
| 
						 | 
					@ -31,16 +31,32 @@
 | 
				
			||||||
            class="absolute top-8 rounded bg-black/80 p-2 text-lg backdrop-blur-sm"
 | 
					            class="absolute top-8 rounded bg-black/80 p-2 text-lg backdrop-blur-sm"
 | 
				
			||||||
        />
 | 
					        />
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <ModalComponent v-if="showSpeedModal" @close="showSpeedModal = false">
 | 
				
			||||||
 | 
					        <h2 v-t="'actions.playback_speed'" />
 | 
				
			||||||
 | 
					        <div class="flex flex-col">
 | 
				
			||||||
 | 
					            <input
 | 
				
			||||||
 | 
					                v-model="playbackSpeedInput"
 | 
				
			||||||
 | 
					                class="input my-3"
 | 
				
			||||||
 | 
					                type="text"
 | 
				
			||||||
 | 
					                :placeholder="$t('actions.playback_speed')"
 | 
				
			||||||
 | 
					                @keyup.enter="setSpeedFromInput()"
 | 
				
			||||||
 | 
					            />
 | 
				
			||||||
 | 
					            <button v-t="'actions.okay'" class="btn ml-auto w-min" @click="setSpeedFromInput()" />
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					    </ModalComponent>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
import "shaka-player/dist/controls.css";
 | 
					import "shaka-player/dist/controls.css";
 | 
				
			||||||
import { parseTimeParam } from "@/utils/Misc";
 | 
					import { parseTimeParam } from "@/utils/Misc";
 | 
				
			||||||
 | 
					import ModalComponent from "./ModalComponent.vue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const shaka = import("shaka-player/dist/shaka-player.ui.js");
 | 
					const shaka = import("shaka-player/dist/shaka-player.ui.js");
 | 
				
			||||||
const hotkeys = import("hotkeys-js");
 | 
					const hotkeys = import("hotkeys-js");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default {
 | 
					export default {
 | 
				
			||||||
 | 
					    components: { ModalComponent },
 | 
				
			||||||
    props: {
 | 
					    props: {
 | 
				
			||||||
        video: {
 | 
					        video: {
 | 
				
			||||||
            type: Object,
 | 
					            type: Object,
 | 
				
			||||||
| 
						 | 
					@ -66,6 +82,8 @@ export default {
 | 
				
			||||||
            destroying: false,
 | 
					            destroying: false,
 | 
				
			||||||
            inSegment: false,
 | 
					            inSegment: false,
 | 
				
			||||||
            isHoveringTimebar: false,
 | 
					            isHoveringTimebar: false,
 | 
				
			||||||
 | 
					            showSpeedModal: false,
 | 
				
			||||||
 | 
					            playbackSpeedInput: null,
 | 
				
			||||||
            currentTime: 0,
 | 
					            currentTime: 0,
 | 
				
			||||||
            seekbarPadding: 2,
 | 
					            seekbarPadding: 2,
 | 
				
			||||||
            error: 0,
 | 
					            error: 0,
 | 
				
			||||||
| 
						 | 
					@ -106,7 +124,7 @@ export default {
 | 
				
			||||||
        this.hotkeysPromise.then(() => {
 | 
					        this.hotkeysPromise.then(() => {
 | 
				
			||||||
            var self = this;
 | 
					            var self = this;
 | 
				
			||||||
            this.$hotkeys(
 | 
					            this.$hotkeys(
 | 
				
			||||||
                "f,m,j,k,l,c,space,up,down,left,right,0,1,2,3,4,5,6,7,8,9,shift+n,shift+,,shift+.,alt+p,return,.,,",
 | 
					                "f,m,j,k,l,c,space,up,down,left,right,0,1,2,3,4,5,6,7,8,9,shift+n,shift+s,shift+,,shift+.,alt+p,return,.,,",
 | 
				
			||||||
                function (e, handler) {
 | 
					                function (e, handler) {
 | 
				
			||||||
                    const videoEl = self.$refs.videoEl;
 | 
					                    const videoEl = self.$refs.videoEl;
 | 
				
			||||||
                    switch (handler.key) {
 | 
					                    switch (handler.key) {
 | 
				
			||||||
| 
						 | 
					@ -196,11 +214,14 @@ export default {
 | 
				
			||||||
                            self.$emit("navigateNext");
 | 
					                            self.$emit("navigateNext");
 | 
				
			||||||
                            e.preventDefault();
 | 
					                            e.preventDefault();
 | 
				
			||||||
                            break;
 | 
					                            break;
 | 
				
			||||||
 | 
					                        case "shift+s":
 | 
				
			||||||
 | 
					                            self.showSpeedModal = true;
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
                        case "shift+,":
 | 
					                        case "shift+,":
 | 
				
			||||||
                            self.$player.trickPlay(Math.max(videoEl.playbackRate - 0.25, 0.25));
 | 
					                            self.adjustPlaybackSpeed(videoEl.playbackRate - 0.25);
 | 
				
			||||||
                            break;
 | 
					                            break;
 | 
				
			||||||
                        case "shift+.":
 | 
					                        case "shift+.":
 | 
				
			||||||
                            self.$player.trickPlay(Math.min(videoEl.playbackRate + 0.25, 2));
 | 
					                            self.adjustPlaybackSpeed(videoEl.playbackRate + 0.25);
 | 
				
			||||||
                            break;
 | 
					                            break;
 | 
				
			||||||
                        case "alt+p":
 | 
					                        case "alt+p":
 | 
				
			||||||
                            document.pictureInPictureElement
 | 
					                            document.pictureInPictureElement
 | 
				
			||||||
| 
						 | 
					@ -651,7 +672,19 @@ export default {
 | 
				
			||||||
                this.$refs.videoEl.currentTime = time;
 | 
					                this.$refs.videoEl.currentTime = time;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        adjustPlaybackSpeed(newSpeed) {
 | 
				
			||||||
 | 
					            const normalizedSpeed = Math.min(4, Math.max(0.25, newSpeed));
 | 
				
			||||||
 | 
					            this.$player.trickPlay(normalizedSpeed);
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        setSpeedFromInput() {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                const newSpeed = Number(this.playbackSpeedInput);
 | 
				
			||||||
 | 
					                this.adjustPlaybackSpeed(newSpeed);
 | 
				
			||||||
 | 
					            } catch (err) {
 | 
				
			||||||
 | 
					                alert(this.$t("actions.invalid_input"));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            this.showSpeedModal = false;
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        updateMarkers() {
 | 
					        updateMarkers() {
 | 
				
			||||||
            const markers = this.$refs.container.querySelector(".shaka-ad-markers");
 | 
					            const markers = this.$refs.container.querySelector(".shaka-ad-markers");
 | 
				
			||||||
            const array = ["to right"];
 | 
					            const array = ["to right"];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -546,33 +546,13 @@ export default {
 | 
				
			||||||
                this.fetchSponsors().then(data => (this.sponsors = data));
 | 
					                this.fetchSponsors().then(data => (this.sponsors = data));
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        async getComments() {
 | 
					        async getComments() {
 | 
				
			||||||
            this.fetchComments().then(data => {
 | 
					            this.comments = await this.fetchComments();
 | 
				
			||||||
                this.rewriteComments(data.comments);
 | 
					 | 
				
			||||||
                this.comments = data;
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        async fetchSubscribedStatus() {
 | 
					        async fetchSubscribedStatus() {
 | 
				
			||||||
            if (!this.channelId) return;
 | 
					            if (!this.channelId) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            this.subscribed = await this.fetchSubscriptionStatus(this.channelId);
 | 
					            this.subscribed = await this.fetchSubscriptionStatus(this.channelId);
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        rewriteComments(data) {
 | 
					 | 
				
			||||||
            data.forEach(comment => {
 | 
					 | 
				
			||||||
                const parser = new DOMParser();
 | 
					 | 
				
			||||||
                const xmlDoc = parser.parseFromString(comment.commentText, "text/html");
 | 
					 | 
				
			||||||
                xmlDoc.querySelectorAll("a").forEach(elem => {
 | 
					 | 
				
			||||||
                    if (!elem.innerText.match(/(?:[\d]{1,2}:)?(?:[\d]{1,2}):(?:[\d]{1,2})/))
 | 
					 | 
				
			||||||
                        elem.outerHTML = elem.getAttribute("href");
 | 
					 | 
				
			||||||
                });
 | 
					 | 
				
			||||||
                comment.commentText = xmlDoc
 | 
					 | 
				
			||||||
                    .querySelector("body")
 | 
					 | 
				
			||||||
                    .innerHTML.replaceAll(/(?:http(?:s)?:\/\/)?(?:www\.)?youtube\.com(\/[/a-zA-Z0-9_?=&-]*)/gm, "$1")
 | 
					 | 
				
			||||||
                    .replaceAll(
 | 
					 | 
				
			||||||
                        /(?:http(?:s)?:\/\/)?(?:www\.)?youtu\.be\/(?:watch\?v=)?([/a-zA-Z0-9_?=&-]*)/gm,
 | 
					 | 
				
			||||||
                        "/watch?v=$1",
 | 
					 | 
				
			||||||
                    );
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        subscribeHandler() {
 | 
					        subscribeHandler() {
 | 
				
			||||||
            this.toggleSubscriptionState(this.channelId, this.subscribed).then(success => {
 | 
					            this.toggleSubscriptionState(this.channelId, this.subscribed).then(success => {
 | 
				
			||||||
                if (success) this.subscribed = !this.subscribed;
 | 
					                if (success) this.subscribed = !this.subscribed;
 | 
				
			||||||
| 
						 | 
					@ -616,7 +596,6 @@ export default {
 | 
				
			||||||
                }).then(json => {
 | 
					                }).then(json => {
 | 
				
			||||||
                    this.comments.nextpage = json.nextpage;
 | 
					                    this.comments.nextpage = json.nextpage;
 | 
				
			||||||
                    this.loading = false;
 | 
					                    this.loading = false;
 | 
				
			||||||
                    this.rewriteComments(json.comments);
 | 
					 | 
				
			||||||
                    this.comments.comments = this.comments.comments.concat(json.comments);
 | 
					                    this.comments.comments = this.comments.comments.concat(json.comments);
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -156,7 +156,11 @@
 | 
				
			||||||
        "concurrent_prefetch_limit": "Concurrent Stream Prefetch Limit",
 | 
					        "concurrent_prefetch_limit": "Concurrent Stream Prefetch Limit",
 | 
				
			||||||
        "customize": "Customize",
 | 
					        "customize": "Customize",
 | 
				
			||||||
        "invalid_url": "Invalid URL!",
 | 
					        "invalid_url": "Invalid URL!",
 | 
				
			||||||
        "add": "Add"
 | 
					        "add": "Add",
 | 
				
			||||||
 | 
					        "creator_replied": "Creator replied",
 | 
				
			||||||
 | 
					        "creator_liked": "Creator liked",
 | 
				
			||||||
 | 
					        "playback_speed": "Playback speed",
 | 
				
			||||||
 | 
					        "invalid_input": "Invalid input"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "comment": {
 | 
					    "comment": {
 | 
				
			||||||
        "pinned_by": "Pinned by {author}",
 | 
					        "pinned_by": "Pinned by {author}",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -156,7 +156,9 @@
 | 
				
			||||||
        "customize": "Kohanda",
 | 
					        "customize": "Kohanda",
 | 
				
			||||||
        "invalid_url": "Vigane URL!",
 | 
					        "invalid_url": "Vigane URL!",
 | 
				
			||||||
        "add": "Lisa",
 | 
					        "add": "Lisa",
 | 
				
			||||||
        "delete_group_confirm": "Kas kustutame selle grupi?"
 | 
					        "delete_group_confirm": "Kas kustutame selle grupi?",
 | 
				
			||||||
 | 
					        "creator_replied": "Autor vastas",
 | 
				
			||||||
 | 
					        "creator_liked": "Autorile meeldis see"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "preferences": {
 | 
					    "preferences": {
 | 
				
			||||||
        "has_cdn": "CDN'i olek?",
 | 
					        "has_cdn": "CDN'i olek?",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -151,7 +151,12 @@
 | 
				
			||||||
        "download_frame": "Keret letöltése",
 | 
					        "download_frame": "Keret letöltése",
 | 
				
			||||||
        "customize": "Testreszab",
 | 
					        "customize": "Testreszab",
 | 
				
			||||||
        "invalid_url": "Érvénytelen URL!",
 | 
					        "invalid_url": "Érvénytelen URL!",
 | 
				
			||||||
        "add": "Hozzáadás"
 | 
					        "add": "Hozzáadás",
 | 
				
			||||||
 | 
					        "delete_group_confirm": "Törli ezt a csoportot?",
 | 
				
			||||||
 | 
					        "creator_replied": "A készítő válaszolt",
 | 
				
			||||||
 | 
					        "creator_liked": "A készítő kedvelte",
 | 
				
			||||||
 | 
					        "playback_speed": "Visszajátszási sebesség",
 | 
				
			||||||
 | 
					        "invalid_input": "Érvénytelen bevitel"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "video": {
 | 
					    "video": {
 | 
				
			||||||
        "ratings_disabled": "Értékelések Letiltva",
 | 
					        "ratings_disabled": "Értékelések Letiltva",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -155,7 +155,8 @@
 | 
				
			||||||
        "concurrent_prefetch_limit": "同時に先読みするストリーム数上限",
 | 
					        "concurrent_prefetch_limit": "同時に先読みするストリーム数上限",
 | 
				
			||||||
        "add": "追加",
 | 
					        "add": "追加",
 | 
				
			||||||
        "invalid_url": "無効なURLです!",
 | 
					        "invalid_url": "無効なURLです!",
 | 
				
			||||||
        "customize": "追加"
 | 
					        "customize": "追加",
 | 
				
			||||||
 | 
					        "delete_group_confirm": "このグループを削除しますか?"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "comment": {
 | 
					    "comment": {
 | 
				
			||||||
        "pinned_by": "{author} によって固定",
 | 
					        "pinned_by": "{author} によって固定",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -127,7 +127,12 @@
 | 
				
			||||||
        "clone_playlist": "Klonēt Atskaņošanas Saturu",
 | 
					        "clone_playlist": "Klonēt Atskaņošanas Saturu",
 | 
				
			||||||
        "uses_api_from": "Izmanto API no ",
 | 
					        "uses_api_from": "Izmanto API no ",
 | 
				
			||||||
        "add_to_playlist": "Pievienot Atskaņošanas Sarakstam",
 | 
					        "add_to_playlist": "Pievienot Atskaņošanas Sarakstam",
 | 
				
			||||||
        "instances_not_shown": "Publiskās instances, kas šeit nav redzamas, pašlaik nav pieejamas."
 | 
					        "instances_not_shown": "Publiskās instances, kas šeit nav redzamas, pašlaik nav pieejamas.",
 | 
				
			||||||
 | 
					        "delete_group_confirm": "Vai vēlaties dzēst šo grupu?",
 | 
				
			||||||
 | 
					        "concurrent_prefetch_limit": "Vienlaicīgu Straumju Ielādes Limits",
 | 
				
			||||||
 | 
					        "customize": "Pielāgot",
 | 
				
			||||||
 | 
					        "invalid_url": "Nederīgs URL!",
 | 
				
			||||||
 | 
					        "add": "Pievienot"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "search": {
 | 
					    "search": {
 | 
				
			||||||
        "all": "YouTube: Visi",
 | 
					        "all": "YouTube: Visi",
 | 
				
			||||||
| 
						 | 
					@ -161,7 +166,9 @@
 | 
				
			||||||
        "playlists": "Atskaņošanas saraksts",
 | 
					        "playlists": "Atskaņošanas saraksts",
 | 
				
			||||||
        "register": "Reģistrēties",
 | 
					        "register": "Reģistrēties",
 | 
				
			||||||
        "player": "Atskaņotājs",
 | 
					        "player": "Atskaņotājs",
 | 
				
			||||||
        "dearrow": "DeArrow"
 | 
					        "dearrow": "DeArrow",
 | 
				
			||||||
 | 
					        "albums": "Albumi",
 | 
				
			||||||
 | 
					        "custom_instances": "Pielāgotas instances"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "video": {
 | 
					    "video": {
 | 
				
			||||||
        "all": "Visi",
 | 
					        "all": "Visi",
 | 
				
			||||||
| 
						 | 
					@ -207,7 +214,9 @@
 | 
				
			||||||
        "has_cdn": "Vai ir satura piegādes tīkls?",
 | 
					        "has_cdn": "Vai ir satura piegādes tīkls?",
 | 
				
			||||||
        "instance_name": "Instances Nosaukums",
 | 
					        "instance_name": "Instances Nosaukums",
 | 
				
			||||||
        "registered_users": "Reģistrētie Lietotāji",
 | 
					        "registered_users": "Reģistrētie Lietotāji",
 | 
				
			||||||
        "instance_locations": "Instances Atrašanās Vietas"
 | 
					        "instance_locations": "Instances Atrašanās Vietas",
 | 
				
			||||||
 | 
					        "uptime_30d": "Darbspējas laiks (30d)",
 | 
				
			||||||
 | 
					        "api_url": "Api URL"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "login": {
 | 
					    "login": {
 | 
				
			||||||
        "username": "Lietotājvārds",
 | 
					        "username": "Lietotājvārds",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -156,7 +156,11 @@
 | 
				
			||||||
        "customize": "Dostosuj",
 | 
					        "customize": "Dostosuj",
 | 
				
			||||||
        "invalid_url": "Nieprawidłowy adres URL!",
 | 
					        "invalid_url": "Nieprawidłowy adres URL!",
 | 
				
			||||||
        "add": "Dodaj",
 | 
					        "add": "Dodaj",
 | 
				
			||||||
        "delete_group_confirm": "Usunąć tę grupę?"
 | 
					        "delete_group_confirm": "Usunąć tę grupę?",
 | 
				
			||||||
 | 
					        "creator_replied": "Twórca odpowiedział",
 | 
				
			||||||
 | 
					        "creator_liked": "Twórca polubił",
 | 
				
			||||||
 | 
					        "invalid_input": "Nieprawidłowe dane wejściowe",
 | 
				
			||||||
 | 
					        "playback_speed": "Szybkość odtwarzania"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "comment": {
 | 
					    "comment": {
 | 
				
			||||||
        "pinned_by": "Przypięty przez {author}",
 | 
					        "pinned_by": "Przypięty przez {author}",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -155,7 +155,12 @@
 | 
				
			||||||
        "concurrent_prefetch_limit": "Предел одновременной предзагрузки трансляций",
 | 
					        "concurrent_prefetch_limit": "Предел одновременной предзагрузки трансляций",
 | 
				
			||||||
        "customize": "Персонализация",
 | 
					        "customize": "Персонализация",
 | 
				
			||||||
        "invalid_url": "Неправильная ссылка!",
 | 
					        "invalid_url": "Неправильная ссылка!",
 | 
				
			||||||
        "add": "Добавить"
 | 
					        "add": "Добавить",
 | 
				
			||||||
 | 
					        "creator_replied": "Ответ автора",
 | 
				
			||||||
 | 
					        "creator_liked": "Автор оценил",
 | 
				
			||||||
 | 
					        "playback_speed": "Скорость воспроизведения",
 | 
				
			||||||
 | 
					        "invalid_input": "Некорректный ввод",
 | 
				
			||||||
 | 
					        "delete_group_confirm": "Удалить группу?"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "comment": {
 | 
					    "comment": {
 | 
				
			||||||
        "pinned_by": "Закреплено пользователем {author}",
 | 
					        "pinned_by": "Закреплено пользователем {author}",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -132,7 +132,11 @@
 | 
				
			||||||
        "invalid_url": "Geçersiz URL!",
 | 
					        "invalid_url": "Geçersiz URL!",
 | 
				
			||||||
        "customize": "Özelleştir",
 | 
					        "customize": "Özelleştir",
 | 
				
			||||||
        "add": "Ekle",
 | 
					        "add": "Ekle",
 | 
				
			||||||
        "delete_group_confirm": "Bu grup silinsin mi?"
 | 
					        "delete_group_confirm": "Bu grup silinsin mi?",
 | 
				
			||||||
 | 
					        "creator_replied": "Oluşturan yanıtladı",
 | 
				
			||||||
 | 
					        "creator_liked": "Oluşturan beğendi",
 | 
				
			||||||
 | 
					        "playback_speed": "Oynatma hızı",
 | 
				
			||||||
 | 
					        "invalid_input": "Geçersiz giriş"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "player": {
 | 
					    "player": {
 | 
				
			||||||
        "watch_on": "{0} üzerinde görüntüle",
 | 
					        "watch_on": "{0} üzerinde görüntüle",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue