mirror of
https://github.com/TeamPiped/Piped.git
synced 2024-08-14 23:57:27 +00:00
conflicts resolved
This commit is contained in:
commit
5e5875316b
32 changed files with 757 additions and 313 deletions
169
src/App.vue
169
src/App.vue
|
@ -1,21 +1,14 @@
|
|||
<template>
|
||||
<div class="w-full min-h-screen px-1vw reset" :class="[theme]">
|
||||
<NavBar />
|
||||
|
||||
<router-view v-slot="{ Component }">
|
||||
<keep-alive :max="5">
|
||||
<component :is="Component" :key="$route.fullPath" />
|
||||
</keep-alive>
|
||||
</router-view>
|
||||
|
||||
<footer class="text-center">
|
||||
<a aria-label="GitHub" href="https://github.com/TeamPiped/Piped">
|
||||
<font-awesome-icon :icon="['fab', 'github']" />
|
||||
</a>
|
||||
<a class="ml-2" href="https://github.com/TeamPiped/Piped#donations">
|
||||
<font-awesome-icon :icon="['fab', 'bitcoin']" />
|
||||
<span class="ml-1" v-t="'actions.donations'" />
|
||||
</a>
|
||||
</footer>
|
||||
<FooterComponent />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@ -85,9 +78,11 @@ button,
|
|||
|
||||
<script>
|
||||
import NavBar from "./components/NavBar.vue";
|
||||
import FooterComponent from "./components/FooterComponent.vue";
|
||||
export default {
|
||||
components: {
|
||||
NavBar,
|
||||
FooterComponent,
|
||||
},
|
||||
mounted() {
|
||||
if (this.getPreferenceBoolean("watchHistory", false))
|
||||
|
@ -130,3 +125,159 @@ export default {
|
|||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
h1,
|
||||
p,
|
||||
a,
|
||||
b {
|
||||
unicode-bidi: plaintext;
|
||||
text-align: start;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar {
|
||||
background-color: #15191a;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
background-color: #4b4f52;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb:hover {
|
||||
background-color: #5b6469;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb:active {
|
||||
background-color: #485053;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-corner {
|
||||
background-color: #0b0e0f;
|
||||
}
|
||||
|
||||
* {
|
||||
scrollbar-color: #15191a #444a4e;
|
||||
@apply font-sans;
|
||||
}
|
||||
|
||||
.video-grid {
|
||||
@apply grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 col-auto lt-md:gap-x-2.5 md:gap-x-1vw gap-y-1.5;
|
||||
}
|
||||
|
||||
.btn {
|
||||
@apply h-full py-2 lt-md:px-2 md:px-4 rounded cursor-pointer;
|
||||
}
|
||||
|
||||
.reset {
|
||||
@apply text-black bg-white;
|
||||
}
|
||||
|
||||
.auto {
|
||||
@apply dark:(text-white bg-dark-900);
|
||||
}
|
||||
|
||||
.dark {
|
||||
@apply text-white bg-dark-900;
|
||||
}
|
||||
|
||||
.input,
|
||||
.select,
|
||||
.btn {
|
||||
@apply w-auto text-gray-600 bg-gray-300;
|
||||
}
|
||||
|
||||
.input,
|
||||
.select {
|
||||
@apply h-8;
|
||||
}
|
||||
|
||||
.checkbox {
|
||||
@apply h-4 w-4;
|
||||
}
|
||||
|
||||
.dark .input,
|
||||
.dark .select,
|
||||
.dark .btn {
|
||||
@apply text-gray-400 bg-dark-400;
|
||||
}
|
||||
|
||||
.auto .input,
|
||||
.auto .select,
|
||||
.auto .btn {
|
||||
@apply dark:(text-gray-400 bg-dark-400);
|
||||
}
|
||||
|
||||
.input {
|
||||
@apply pl-2.5;
|
||||
}
|
||||
|
||||
.input:focus {
|
||||
@apply border-2 border-red-500 outline-none;
|
||||
box-shadow: 0 0 15px rgba(239, 68, 68, var(--un-border-opacity));
|
||||
}
|
||||
|
||||
hr {
|
||||
@apply !mt-2 !mb-3 border-gray-300;
|
||||
}
|
||||
|
||||
.dark hr {
|
||||
@apply border-dark-100;
|
||||
}
|
||||
|
||||
.auto hr {
|
||||
@apply dark:border-dark-100;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2 {
|
||||
@apply m-0 font-bold;
|
||||
}
|
||||
|
||||
h1 {
|
||||
@apply !text-5xl;
|
||||
}
|
||||
|
||||
h2 {
|
||||
@apply !text-3xl;
|
||||
}
|
||||
|
||||
.table {
|
||||
@apply w-full text-lg text-left font-light border;
|
||||
}
|
||||
|
||||
.link {
|
||||
@apply hover:(text-dark-300 underline underline-dark-300);
|
||||
}
|
||||
|
||||
.link-secondary {
|
||||
@apply hover:(text-dark-400 underline underline-dark-400);
|
||||
}
|
||||
|
||||
.dark .link {
|
||||
@apply hover:(text-gray-300 underline underline-gray-300);
|
||||
}
|
||||
|
||||
.auto .link {
|
||||
@apply dark:hover:(text-gray-300 underline underline-gray-300);
|
||||
}
|
||||
|
||||
.dark .link-secondary {
|
||||
@apply text-gray-300 hover:(text-gray-400 underline underline-gray-400);
|
||||
}
|
||||
|
||||
.auto .link-secondary {
|
||||
@apply dark:(text-gray-300 hover:(text-gray-400 underline underline-gray-400));
|
||||
}
|
||||
|
||||
.line {
|
||||
@apply px-2.5 py-0.25 my-0.45 rounded-xl bg-dark-900;
|
||||
}
|
||||
|
||||
.dark .line {
|
||||
@apply bg-white;
|
||||
}
|
||||
|
||||
.auto .line {
|
||||
@apply dark:(bg-white);
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
<hr />
|
||||
|
||||
<div class="video-grid">
|
||||
<VideoItem v-for="video in videos" :key="video.url" :video="video" />
|
||||
<VideoItem :is-feed="true" v-for="video in videos" :key="video.url" :video="video" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
|
58
src/components/FooterComponent.vue
Normal file
58
src/components/FooterComponent.vue
Normal file
|
@ -0,0 +1,58 @@
|
|||
<template>
|
||||
<footer class="text-center py-4 rounded-xl children:(mx-3) w-full mt-10 mb-5">
|
||||
<a aria-label="GitHub" href="https://github.com/TeamPiped/Piped" target="_blank">
|
||||
<font-awesome-icon :icon="['fab', 'github']" />
|
||||
<span class="ml-2" v-t="'actions.source_code'" />
|
||||
</a>
|
||||
<a href="https://piped-docs.kavin.rocks/" target="_blank">
|
||||
<font-awesome-icon :icon="['fa', 'book']" />
|
||||
<span class="ml-2" v-t="'actions.documentation'" />
|
||||
</a>
|
||||
<a href="https://github.com/TeamPiped/Piped#donations" target="_blank">
|
||||
<font-awesome-icon :icon="['fab', 'bitcoin']" />
|
||||
<span class="ml-2" v-t="'actions.donations'" />
|
||||
</a>
|
||||
<a v-if="statusPageHref" :href="statusPageHref">
|
||||
<font-awesome-icon :icon="['fa', 'server']" />
|
||||
<span class="ml-2" v-t="'actions.status_page'" />
|
||||
</a>
|
||||
<a v-if="donationHref" :href="donationHref">
|
||||
<font-awesome-icon :icon="['fa', 'donate']" />
|
||||
<span class="ml-2" v-t="'actions.instance_donations'" />
|
||||
</a>
|
||||
</footer>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
donationHref: null,
|
||||
statusPageHref: null,
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
this.fetchConfig();
|
||||
},
|
||||
methods: {
|
||||
async fetchConfig() {
|
||||
this.fetchJson(this.apiUrl() + "/config").then(config => {
|
||||
this.donationHref = config?.donationUrl;
|
||||
this.statusPageHref = config?.statusPageUrl;
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
footer {
|
||||
@apply bg-light-900;
|
||||
}
|
||||
.dark footer {
|
||||
@apply bg-dark-800;
|
||||
}
|
||||
.auto footer {
|
||||
@apply dark:(bg-dark-800);
|
||||
}
|
||||
</style>
|
|
@ -79,7 +79,7 @@
|
|||
/>
|
||||
</div>
|
||||
<SearchSuggestions
|
||||
v-show="searchText && suggestionsVisible"
|
||||
v-show="(searchText || showSearchHistory) && suggestionsVisible"
|
||||
ref="searchSuggestions"
|
||||
:search-text="searchText"
|
||||
@searchchange="onSearchTextChange"
|
||||
|
@ -119,6 +119,9 @@ export default {
|
|||
shouldShowTrending(_this) {
|
||||
return _this.getPreferenceString("homepage", "trending") != "trending";
|
||||
},
|
||||
showSearchHistory() {
|
||||
return localStorage.getItem("searchHistory") && localStorage.getItem("search_history");
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
// focus on search bar when Ctrl+k is pressed
|
||||
|
@ -145,6 +148,7 @@ export default {
|
|||
}
|
||||
},
|
||||
onInputFocus() {
|
||||
if (this.showSearchHistory) this.$refs.searchSuggestions.refreshSuggestions();
|
||||
this.suggestionsVisible = true;
|
||||
},
|
||||
onInputBlur() {
|
||||
|
|
|
@ -41,7 +41,6 @@
|
|||
<option v-t="'titles.feed'" value="feed" />
|
||||
</select>
|
||||
</label>
|
||||
|
||||
<label class="pref" for="ddlInstanceSelection">
|
||||
<strong v-text="`${$t('actions.instance_selection')}:`" />
|
||||
<select
|
||||
|
@ -421,6 +420,8 @@ export default {
|
|||
minimizeDescription: false,
|
||||
minimizeRecommendations: false,
|
||||
watchHistory: false,
|
||||
searchHistory: false,
|
||||
hideWatched: false,
|
||||
selectedLanguage: "en",
|
||||
languages: [
|
||||
{ code: "ar", name: "Arabic" },
|
||||
|
@ -555,10 +556,12 @@ export default {
|
|||
this.minimizeDescription = this.getPreferenceBoolean("minimizeDescription", false);
|
||||
this.minimizeRecommendations = this.getPreferenceBoolean("minimizeRecommendations", false);
|
||||
this.watchHistory = this.getPreferenceBoolean("watchHistory", false);
|
||||
this.searchHistory = this.getPreferenceBoolean("searchHistory", false);
|
||||
this.selectedLanguage = this.getPreferenceString("hl", await this.defaultLangage);
|
||||
this.enabledCodecs = this.getPreferenceString("enabledCodecs", "vp9,avc").split(",");
|
||||
this.disableLBRY = this.getPreferenceBoolean("disableLBRY", false);
|
||||
this.proxyLBRY = this.getPreferenceBoolean("proxyLBRY", false);
|
||||
this.hideWatched = this.getPreferenceBoolean("hideWatched", false);
|
||||
if (this.selectedLanguage != "en") {
|
||||
try {
|
||||
this.CountryMap = await import(`../utils/CountryMaps/${this.selectedLanguage}.json`).then(
|
||||
|
@ -612,10 +615,13 @@ export default {
|
|||
localStorage.setItem("minimizeDescription", this.minimizeDescription);
|
||||
localStorage.setItem("minimizeRecommendations", this.minimizeRecommendations);
|
||||
localStorage.setItem("watchHistory", this.watchHistory);
|
||||
localStorage.setItem("searchHistory", this.searchHistory);
|
||||
if (!this.searchHistory) localStorage.removeItem("search_history");
|
||||
localStorage.setItem("hl", this.selectedLanguage);
|
||||
localStorage.setItem("enabledCodecs", this.enabledCodecs.join(","));
|
||||
localStorage.setItem("disableLBRY", this.disableLBRY);
|
||||
localStorage.setItem("proxyLBRY", this.proxyLBRY);
|
||||
localStorage.setItem("hideWatched", this.hideWatched);
|
||||
|
||||
if (shouldReload) window.location.reload();
|
||||
}
|
||||
|
|
|
@ -77,6 +77,7 @@ export default {
|
|||
mounted() {
|
||||
if (this.handleRedirect()) return;
|
||||
this.updateResults();
|
||||
this.saveQueryToHistory();
|
||||
},
|
||||
activated() {
|
||||
this.handleRedirect();
|
||||
|
@ -138,6 +139,19 @@ export default {
|
|||
return true;
|
||||
}
|
||||
},
|
||||
saveQueryToHistory() {
|
||||
if (!this.getPreferenceBoolean("searchHistory", false)) return;
|
||||
const query = this.$route.query.search_query;
|
||||
if (!query) return;
|
||||
const searchHistory = JSON.parse(localStorage.getItem("search_history")) ?? [];
|
||||
if (searchHistory.includes(query)) {
|
||||
const index = searchHistory.indexOf(query);
|
||||
searchHistory.splice(index, 1);
|
||||
}
|
||||
searchHistory.unshift(query);
|
||||
if (searchHistory.length > 10) searchHistory.shift();
|
||||
localStorage.setItem("search_history", JSON.stringify(searchHistory));
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
|
|
@ -47,11 +47,16 @@ export default {
|
|||
}
|
||||
},
|
||||
async refreshSuggestions() {
|
||||
this.searchSuggestions = (
|
||||
await this.fetchJson(this.apiUrl() + "/opensearch/suggestions", {
|
||||
query: this.searchText,
|
||||
})
|
||||
)?.[1];
|
||||
if (!this.searchText) {
|
||||
if (this.getPreferenceBoolean("searchHistory", false))
|
||||
this.searchSuggestions = JSON.parse(localStorage.getItem("search_history")) ?? [];
|
||||
} else {
|
||||
this.searchSuggestions = (
|
||||
await this.fetchJson(this.apiUrl() + "/opensearch/suggestions", {
|
||||
query: this.searchText,
|
||||
})
|
||||
)?.[1];
|
||||
}
|
||||
this.searchSuggestions.unshift(this.searchText);
|
||||
this.setSelected(0);
|
||||
},
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<template>
|
||||
<div>
|
||||
<div v-if="showVideo">
|
||||
<router-link
|
||||
:to="{
|
||||
path: '/watch',
|
||||
|
@ -133,6 +133,10 @@ export default {
|
|||
return {};
|
||||
},
|
||||
},
|
||||
isFeed: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
height: { type: String, default: "118" },
|
||||
width: { type: String, default: "210" },
|
||||
hideChannel: { type: Boolean, default: false },
|
||||
|
@ -143,8 +147,12 @@ export default {
|
|||
data() {
|
||||
return {
|
||||
showModal: false,
|
||||
showVideo: true,
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
this.shouldShowVideo();
|
||||
},
|
||||
methods: {
|
||||
removeVideo() {
|
||||
if (confirm(this.$t("actions.delete_playlist_video_confirm"))) {
|
||||
|
@ -165,6 +173,19 @@ export default {
|
|||
});
|
||||
}
|
||||
},
|
||||
shouldShowVideo() {
|
||||
if (!this.isFeed || !this.getPreferenceBoolean("hideWatched", false)) return;
|
||||
|
||||
const objectStore = window.db.transaction("watch_history", "readonly").objectStore("watch_history");
|
||||
const request = objectStore.get(this.video.url.substr(-11));
|
||||
request.onsuccess = event => {
|
||||
const video = event.target.result;
|
||||
if (video && (video.currentTime ?? 0) > video.duration * 0.9) {
|
||||
this.showVideo = false;
|
||||
return;
|
||||
}
|
||||
};
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
short() {
|
||||
|
|
|
@ -105,7 +105,8 @@
|
|||
"copy_link": "نسخ الرابط",
|
||||
"time_code": "رمز الوقت (بالثواني)",
|
||||
"rename_playlist": "إعادة تسمية قائمة التشغيل",
|
||||
"new_playlist_name": "اسم قائمة تشغيل جديد"
|
||||
"new_playlist_name": "اسم قائمة تشغيل جديد",
|
||||
"show_chapters": "الفصول"
|
||||
},
|
||||
"video": {
|
||||
"sponsor_segments": "المقاطع الإعلانية",
|
||||
|
|
|
@ -100,7 +100,9 @@
|
|||
"share": "Compartir",
|
||||
"time_code": "Moment (en segons)",
|
||||
"copy_link": "Copiar l'enllaç",
|
||||
"follow_link": "Vés a l'enllaç"
|
||||
"follow_link": "Vés a l'enllaç",
|
||||
"rename_playlist": "Canviar el nom de la llista de reproducció",
|
||||
"new_playlist_name": "Nom nou de la llista de reproducció"
|
||||
},
|
||||
"comment": {
|
||||
"pinned_by": "Fixat per",
|
||||
|
|
|
@ -98,11 +98,12 @@
|
|||
"share": "Sdílet",
|
||||
"with_timecode": "Sdílet s časovým kódem",
|
||||
"piped_link": "Odkaz na Piped",
|
||||
"follow_link": "Následovat odkaz",
|
||||
"follow_link": "Otevřít odkaz",
|
||||
"copy_link": "Kopírovat odkaz",
|
||||
"time_code": "Časový kód (v sekundách)",
|
||||
"rename_playlist": "Přejmenovat playlist",
|
||||
"new_playlist_name": "Nový název playlistu"
|
||||
"new_playlist_name": "Nový název playlistu",
|
||||
"show_chapters": "Kapitoly"
|
||||
},
|
||||
"player": {
|
||||
"watch_on": "Sledovat na {0}"
|
||||
|
|
|
@ -89,7 +89,8 @@
|
|||
"reset_preferences": "Einstellungen zurücksetzen",
|
||||
"confirm_reset_preferences": "Bist du sicher, dass du deine Einstellungen zurücksetzen möchtest?",
|
||||
"backup_preferences": "Einstellungen sichern",
|
||||
"restore_preferences": "Einstellungen wiederherstellen"
|
||||
"restore_preferences": "Einstellungen wiederherstellen",
|
||||
"show_chapters": "Kapitel"
|
||||
},
|
||||
"player": {
|
||||
"watch_on": "Auf {0} ansehen"
|
||||
|
|
|
@ -61,7 +61,7 @@
|
|||
"import_from_json": "Import from JSON/CSV",
|
||||
"loop_this_video": "Loop this Video",
|
||||
"auto_play_next_video": "Auto Play next Video",
|
||||
"donations": "Donations",
|
||||
"donations": "Development donations",
|
||||
"minimize_description": "Minimize Description",
|
||||
"show_description": "Description",
|
||||
"minimize_recommendations": "Minimize Recommendations",
|
||||
|
@ -106,7 +106,13 @@
|
|||
"follow_link": "Follow link",
|
||||
"copy_link": "Copy link",
|
||||
"time_code": "Time code (in seconds)",
|
||||
"show_chapters": "Chapters"
|
||||
"show_chapters": "Chapters",
|
||||
"store_search_history": "Store Search history",
|
||||
"hide_watched": "Hide watched videos in the feed",
|
||||
"documentation": "Documentation",
|
||||
"status_page": "Status",
|
||||
"source_code": "Source code",
|
||||
"instance_donations": "Instance donations"
|
||||
},
|
||||
"comment": {
|
||||
"pinned_by": "Pinned by",
|
||||
|
|
|
@ -40,6 +40,10 @@
|
|||
"donations": "Donacoj",
|
||||
"show_more": "Montri pli",
|
||||
"yes": "Jes",
|
||||
"no": "Ne"
|
||||
"no": "Ne",
|
||||
"show_chapters": "Sekcioj"
|
||||
},
|
||||
"video": {
|
||||
"chapters": "Sekcioj"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -114,7 +114,8 @@
|
|||
"confirm_reset_preferences": "¿Estás seguro de que quieres restablecer tus preferencias?",
|
||||
"backup_preferences": "Preferencias de copia de seguridad",
|
||||
"restore_preferences": "Restablecer las preferencias",
|
||||
"back_to_home": "Volver a la página de inicio"
|
||||
"back_to_home": "Volver a la página de inicio",
|
||||
"show_chapters": "Capítulos"
|
||||
},
|
||||
"titles": {
|
||||
"feed": "Feed",
|
||||
|
|
|
@ -102,7 +102,8 @@
|
|||
"follow_link": "Ouvrir le lien",
|
||||
"time_code": "Horodatage (en secondes)",
|
||||
"rename_playlist": "Renommer la liste de lecture",
|
||||
"new_playlist_name": "Nouveau nom de la liste de lecture"
|
||||
"new_playlist_name": "Nouveau nom de la liste de lecture",
|
||||
"show_chapters": "Chapitres"
|
||||
},
|
||||
"player": {
|
||||
"watch_on": "Regarder sur {0}"
|
||||
|
|
|
@ -102,7 +102,11 @@
|
|||
"loop_this_video": "ניגון הסרטון בלולאה",
|
||||
"minimize_recommendations": "מזעור המלצות",
|
||||
"rename_playlist": "שינוי שם רשימת נגינה",
|
||||
"new_playlist_name": "שם לרשימת נגינה חדשה"
|
||||
"new_playlist_name": "שם לרשימת נגינה חדשה",
|
||||
"show_chapters": "פרקים",
|
||||
"skip_intro": "דילוג על הפוגה/הנפשת הקדמה",
|
||||
"skip_outro": "דילוג על כרטיסי סיום/קרדיטים",
|
||||
"skip_filler_tangent": "דילוג על משיקים למילוי"
|
||||
},
|
||||
"comment": {
|
||||
"pinned_by": "ננעץ על ידי",
|
||||
|
|
|
@ -114,7 +114,8 @@
|
|||
"with_timecode": "Dijeli s vremenskim kodom",
|
||||
"rename_playlist": "Preimenuj popis snimaka",
|
||||
"new_playlist_name": "Ime novog popisa snimaka",
|
||||
"share": "Dijeli"
|
||||
"share": "Dijeli",
|
||||
"show_chapters": "Poglavlja"
|
||||
},
|
||||
"player": {
|
||||
"watch_on": "Gledaj na {0}"
|
||||
|
@ -130,7 +131,7 @@
|
|||
"playlists": "Playliste",
|
||||
"account": "Račun",
|
||||
"instance": "Instanca",
|
||||
"player": "Player"
|
||||
"player": "Plejer"
|
||||
},
|
||||
"login": {
|
||||
"password": "Lozinka",
|
||||
|
|
|
@ -105,7 +105,8 @@
|
|||
"follow_link": "Ikuti tautan",
|
||||
"copy_link": "Salin tautan",
|
||||
"time_code": "Kode waktu (dalam detik)",
|
||||
"back_to_home": "Kembali ke beranda"
|
||||
"back_to_home": "Kembali ke beranda",
|
||||
"show_chapters": "Bab"
|
||||
},
|
||||
"comment": {
|
||||
"pinned_by": "Dipasangi pin oleh",
|
||||
|
|
|
@ -89,7 +89,8 @@
|
|||
"follow_link": "Apri il collegamento",
|
||||
"with_timecode": "Condividi con marca temporale",
|
||||
"new_playlist_name": "Nuovo nome dalla playlist",
|
||||
"rename_playlist": "Rinomina la playlist"
|
||||
"rename_playlist": "Rinomina la playlist",
|
||||
"show_chapters": "Capitoli"
|
||||
},
|
||||
"player": {
|
||||
"watch_on": "Guarda su {0}"
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
"enable_sponsorblock": "Sponsorblock 활성화",
|
||||
"skip_outro": "최종 화면/크레딧 스킵",
|
||||
"skip_preview": "미리보기/요약 스킵",
|
||||
"uses_api_from": "의 API를 사용: ",
|
||||
"uses_api_from": "해당 API 사용: ",
|
||||
"skip_non_music": "음악: 음악이 아닌 구간 스킵",
|
||||
"skip_self_promo": "셀프 프로모션 스킵",
|
||||
"buffering_goal": "버퍼링 목표 (초)",
|
||||
|
@ -24,10 +24,10 @@
|
|||
"store_watch_history": "시청 기록 저장",
|
||||
"language_selection": "언어 선택",
|
||||
"no": "아니요",
|
||||
"loop_this_video": "이 영상 반복",
|
||||
"auto_play_next_video": "다음 영상 자동 재생",
|
||||
"loop_this_video": "이 동영상 반복",
|
||||
"auto_play_next_video": "다음 동영상 자동 재생",
|
||||
"minimize_description": "설명 최소화",
|
||||
"show_recommendations": "추천 영상 표시",
|
||||
"show_recommendations": "추천 동영상 표시",
|
||||
"sort_by": "정렬:",
|
||||
"most_recent": "가장 최신",
|
||||
"channel_name_asc": "채널 이름 (A-Z)",
|
||||
|
@ -40,31 +40,64 @@
|
|||
"instance_selection": "인스턴스 선택",
|
||||
"import_from_json": "JSON/CSV에서 가져오기",
|
||||
"light": "라이트",
|
||||
"autoplay_video": "영상 자동 재생",
|
||||
"autoplay_video": "동영상 자동 재생",
|
||||
"default_quality": "기본 화질",
|
||||
"default_homepage": "기본 홈페이지",
|
||||
"instances_list": "인스턴스 리스트",
|
||||
"instances_list": "인스턴스 목록",
|
||||
"show_more": "더 보기",
|
||||
"export_to_json": "JSON으로 내보내기",
|
||||
"donations": "기부",
|
||||
"show_description": "설명 표시",
|
||||
"disable_lbry": "LBRY 스트리밍 비활성화",
|
||||
"enable_lbry_proxy": "LBRY 프록시 활성화",
|
||||
"minimize_recommendations": "추천 영상 최소화",
|
||||
"minimize_recommendations": "추천 동영상 최소화",
|
||||
"loading": "로딩...",
|
||||
"view_ssl_score": "SSL 점수 보기",
|
||||
"skip_intro": "중간 휴식/인트로 애니메이션 스킵",
|
||||
"search": "검색",
|
||||
"clear_history": "기록 지우기",
|
||||
"show_replies": "답글 보기",
|
||||
"skip_highlight": "하이라이트 스킵"
|
||||
"skip_highlight": "하이라이트 스킵",
|
||||
"select_playlist": "재생목록 선택",
|
||||
"please_select_playlist": "재생목록을 선택하세요",
|
||||
"create_playlist": "재생목록 만들기",
|
||||
"delete_playlist": "재생목록 삭제",
|
||||
"delete_playlist_video_confirm": "재생목록에서 동영상을 삭제하시겠습니까?",
|
||||
"add_to_playlist": "재생목록에 추가",
|
||||
"remove_from_playlist": "재생목록에서 제거",
|
||||
"delete_playlist_confirm": "이 재생목록을 삭제하시겠습니까?",
|
||||
"delete_account": "계정 삭제",
|
||||
"logout": "이 기기에서 로그아웃",
|
||||
"show_chapters": "챕터",
|
||||
"download_as_txt": ".txt로 다운로드",
|
||||
"new_playlist_name": "새 재생목록 이름",
|
||||
"rename_playlist": "재생목록 이름 변경",
|
||||
"share": "공유",
|
||||
"copy_link": "링크 복사",
|
||||
"time_code": "시작 시간 (초)",
|
||||
"follow_link": "링크 열기",
|
||||
"piped_link": "Piped 링크",
|
||||
"with_timecode": "시작 시간을 포함하여 공유",
|
||||
"skip_filler_tangent": "잡담/농담 스킵",
|
||||
"show_markers": "플레이어에 마커 표시",
|
||||
"reset_preferences": "설정 초기화",
|
||||
"confirm_reset_preferences": "설정을 초기화 하시겠습니까?",
|
||||
"restore_preferences": "설정 복원",
|
||||
"backup_preferences": "설정 백업",
|
||||
"back_to_home": "홈으로 가기",
|
||||
"minimize_recommendations_default": "기본적으로 추천 동영상 최소화",
|
||||
"invalidate_session": "모든 기기에서 로그아웃",
|
||||
"instance_auth_selection": "인증 인스턴스 선택",
|
||||
"different_auth_instance": "인증에 다른 인스턴스 사용",
|
||||
"clone_playlist": "재생목록 복제",
|
||||
"clone_playlist_success": "성공적으로 복제되었습니다!"
|
||||
},
|
||||
"titles": {
|
||||
"feed": "피드",
|
||||
"preferences": "설정",
|
||||
"history": "시청 기록",
|
||||
"subscriptions": "구독",
|
||||
"trending": "트렌드",
|
||||
"trending": "인기",
|
||||
"login": "로그인",
|
||||
"register": "가입",
|
||||
"playlists": "재생목록",
|
||||
|
@ -76,26 +109,52 @@
|
|||
"watch_on": "에서 보기 {0}"
|
||||
},
|
||||
"comment": {
|
||||
"pinned_by": "에 의해 고정됨"
|
||||
"pinned_by": "에 의해 고정됨",
|
||||
"disabled": "업로더가 댓글을 비활성화했습니다.",
|
||||
"user_disabled": "설정에서 댓글을 비활성화했습니다.",
|
||||
"loading": "댓글 로드 중..."
|
||||
},
|
||||
"preferences": {
|
||||
"has_cdn": "CDN 여부?",
|
||||
"ssl_score": "SSL 점수",
|
||||
"instance_locations": "인스턴스 위치",
|
||||
"instance_name": "인스턴스 이름"
|
||||
"instance_name": "인스턴스 이름",
|
||||
"registered_users": "등록 된 사용자",
|
||||
"version": "버전",
|
||||
"up_to_date": "최신 버전?"
|
||||
},
|
||||
"login": {
|
||||
"username": "유저 이름",
|
||||
"password": "비밀번호"
|
||||
},
|
||||
"video": {
|
||||
"videos": "영상",
|
||||
"videos": "동영상",
|
||||
"views": "{views} 조회수",
|
||||
"watched": "시청함",
|
||||
"sponsor_segments": "스폰서 세그먼트",
|
||||
"ratings_disabled": "등급 비활성화됨"
|
||||
"ratings_disabled": "등급 비활성화됨",
|
||||
"live": "{0} 라이브",
|
||||
"shorts": "Shorts",
|
||||
"chapters": "챕터"
|
||||
},
|
||||
"search": {
|
||||
"did_you_mean": "이것을 찾으셨나요: {0}?"
|
||||
"did_you_mean": "이것을 찾으셨나요: {0}?",
|
||||
"all": "YouTube: 전체",
|
||||
"music_playlists": "YT Music: 재생목록",
|
||||
"videos": "YouTube: 동영상",
|
||||
"music_songs": "YT Music: 음악",
|
||||
"channels": "YouTube: 채널",
|
||||
"playlists": "YouTube: 재생목록",
|
||||
"music_videos": "YT Music: 동영상",
|
||||
"music_albums": "YT Music: 앨범"
|
||||
},
|
||||
"info": {
|
||||
"cannot_copy": "복사할 수 없습니다!",
|
||||
"copied": "복사되었습니다!",
|
||||
"preferences_note": "참고: 설정은 브라우저 로컬 저장소에 저장됩니다. 브라우저 데이터를 삭제하면 초기화됩니다.",
|
||||
"page_not_found": "페이지를 찾을 수 없음"
|
||||
},
|
||||
"subscriptions": {
|
||||
"subscribed_channels_count": "구독: {0}"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -80,7 +80,17 @@
|
|||
"reset_preferences": "Tilbakestill innstillinger",
|
||||
"backup_preferences": "Innstillinger for sikkerhetskopiering",
|
||||
"confirm_reset_preferences": "Tilbakestill alle innstillingene?",
|
||||
"restore_preferences": "Gjenopprett innstillinger"
|
||||
"restore_preferences": "Gjenopprett innstillinger",
|
||||
"show_chapters": "Kapitler",
|
||||
"rename_playlist": "Gi spillelisten ny navn",
|
||||
"new_playlist_name": "Nytt spillelistenavn",
|
||||
"share": "Del",
|
||||
"with_timecode": "Del med tidskode",
|
||||
"piped_link": "Piped-lenke",
|
||||
"follow_link": "Følg lenke",
|
||||
"copy_link": "Kopier lenke",
|
||||
"time_code": "Tidskode (sekunder)",
|
||||
"back_to_home": "Tilbake til startsiden"
|
||||
},
|
||||
"player": {
|
||||
"watch_on": "Vis på {0}"
|
||||
|
@ -143,5 +153,11 @@
|
|||
},
|
||||
"information": {
|
||||
"preferences_note": "Merk: Innstillinger lagres lokalt i din nettleser. Sletting av nettleserdata sletter dem."
|
||||
},
|
||||
"info": {
|
||||
"preferences_note": "Merk: Innstillinger spares i nettleserens lokallager. Sletting av nettleserdata tilbakestiller dem.",
|
||||
"cannot_copy": "Kan ikke kopiere",
|
||||
"page_not_found": "Fant ikke siden",
|
||||
"copied": "Kopiert"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,7 +7,10 @@
|
|||
"trending": "Tendências",
|
||||
"login": "Iniciar Sessão",
|
||||
"register": "Registar",
|
||||
"playlists": "Listas de Reprodução"
|
||||
"playlists": "Listas de Reprodução",
|
||||
"account": "Conta",
|
||||
"instance": "Instância",
|
||||
"player": "Reprodutor"
|
||||
},
|
||||
"actions": {
|
||||
"view_subscriptions": "Ver Subscrições",
|
||||
|
@ -86,7 +89,20 @@
|
|||
"instance_auth_selection": "Selecção da Instância para Autenticação",
|
||||
"invalidate_session": "Terminar sessão em todos os aparelhos",
|
||||
"clone_playlist": "Clonar Lista de Reprodução",
|
||||
"clone_playlist_success": "Clonada com sucesso!"
|
||||
"clone_playlist_success": "Clonada com sucesso!",
|
||||
"rename_playlist": "Renomear",
|
||||
"restore_preferences": "Restaurar configurações",
|
||||
"confirm_reset_preferences": "Tem a certeza que quer redefinir as suas configurações?",
|
||||
"new_playlist_name": "Novo nome da lista de reprodução",
|
||||
"share": "Partilhar",
|
||||
"with_timecode": "Partilhar com código de tempo",
|
||||
"piped_link": "Ligação do Piped",
|
||||
"follow_link": "Seguir ligação",
|
||||
"copy_link": "Copiar ligação",
|
||||
"time_code": "Código de tempo (em segundos)",
|
||||
"reset_preferences": "Redefinir preferências",
|
||||
"backup_preferences": "Exportar configurações",
|
||||
"back_to_home": "Voltar ao início"
|
||||
},
|
||||
"comment": {
|
||||
"pinned_by": "Afixado por",
|
||||
|
@ -133,5 +149,11 @@
|
|||
},
|
||||
"subscriptions": {
|
||||
"subscribed_channels_count": "Subscrito a: {0}"
|
||||
},
|
||||
"info": {
|
||||
"preferences_note": "Nota: as configurações são guardadas no armazenamento local to seu navegador. Eliminar os dados de navegação irá redefini-las.",
|
||||
"page_not_found": "Página não encontrada",
|
||||
"copied": "Copiada!",
|
||||
"cannot_copy": "Não foi possível copiar!"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,7 +7,10 @@
|
|||
"preferences": "Настройки",
|
||||
"history": "История просмотров",
|
||||
"subscriptions": "Ваши подписки",
|
||||
"playlists": "Плейлисты"
|
||||
"playlists": "Плейлисты",
|
||||
"account": "Аккаунт",
|
||||
"player": "Плеер",
|
||||
"instance": "Сервер"
|
||||
},
|
||||
"player": {
|
||||
"watch_on": "Смотреть на {0}"
|
||||
|
@ -89,7 +92,21 @@
|
|||
"different_auth_instance": "Использовать другие средства аутентификации",
|
||||
"instance_auth_selection": "Выбор средств аутентификации",
|
||||
"clone_playlist": "Клонировать плейлист",
|
||||
"clone_playlist_success": "Клонирование прошло успешно!"
|
||||
"clone_playlist_success": "Клонирование прошло успешно!",
|
||||
"show_chapters": "Части",
|
||||
"rename_playlist": "Переименовать плейлист",
|
||||
"new_playlist_name": "Новое название плейлиста",
|
||||
"share": "Поделиться",
|
||||
"with_timecode": "Поделиться с отметкой времени",
|
||||
"piped_link": "Ссылка Piped",
|
||||
"follow_link": "Ссылка подписки",
|
||||
"copy_link": "Скопировать ссылку",
|
||||
"time_code": "Тайм-код (в секундах)",
|
||||
"reset_preferences": "Сбросить настройки",
|
||||
"confirm_reset_preferences": "Вы уверены, что хотите сбросить настройки?",
|
||||
"backup_preferences": "Настройки бэкапов",
|
||||
"restore_preferences": "Восстановить настройки",
|
||||
"back_to_home": "Вернутся на главную"
|
||||
},
|
||||
"comment": {
|
||||
"pinned_by": "Прикреплено пользователем",
|
||||
|
@ -133,5 +150,11 @@
|
|||
},
|
||||
"subscriptions": {
|
||||
"subscribed_channels_count": "Подписан на: {0}"
|
||||
},
|
||||
"info": {
|
||||
"preferences_note": "Примечание: настройки сохранены в локальном хранилище браузера. При удалении данных браузера они будут удалены.",
|
||||
"copied": "Скопировано!",
|
||||
"cannot_copy": "Не получилось скопировать!",
|
||||
"page_not_found": "Страница не найдена"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -78,9 +78,18 @@
|
|||
"delete_playlist_confirm": "Избрисати овај попис снимака?",
|
||||
"please_select_playlist": "Молим вас одаберите попис снимака",
|
||||
"show_markers": "Prikaži obeleživače na plejeru",
|
||||
"delete_account": "Obriši nalog",
|
||||
"delete_account": "Обриши налог",
|
||||
"logout": "Одјава са овог уређаја",
|
||||
"minimize_recommendations_default": "Umanji preporuke kao podrazumevano"
|
||||
"minimize_recommendations_default": "Умањи Препоруке као Подразумевано",
|
||||
"download_as_txt": "Преузмите као .ткт",
|
||||
"reset_preferences": "Ресетирајте преференције",
|
||||
"confirm_reset_preferences": "Да ли сте сигурни да желите да ресетујете подешавања?",
|
||||
"backup_preferences": "Спреми сигурносну копију поставки",
|
||||
"invalidate_session": "Одјавите се са свих уређаја",
|
||||
"different_auth_instance": "Користите другу инстанцу за аутентификацију",
|
||||
"instance_auth_selection": "Избор инстанце аутентикације",
|
||||
"clone_playlist": "Клонирајте листу за репродукцију",
|
||||
"clone_playlist_success": "Успешно клонирано!"
|
||||
},
|
||||
"preferences": {
|
||||
"instance_locations": "Локација инстанце",
|
||||
|
@ -114,7 +123,10 @@
|
|||
"trending": "У тренду",
|
||||
"login": "Пријава",
|
||||
"subscriptions": "Праћења",
|
||||
"playlists": "Пописи Снимака"
|
||||
"playlists": "Пописи Снимака",
|
||||
"account": "Рачун",
|
||||
"instance": "Инстанца",
|
||||
"player": "Плејер"
|
||||
},
|
||||
"comment": {
|
||||
"pinned_by": "Закачено од стране"
|
||||
|
|
|
@ -89,7 +89,8 @@
|
|||
"piped_link": "Piped bağlantısı",
|
||||
"share": "Paylaş",
|
||||
"rename_playlist": "Oynatma listesini yeniden adlandır",
|
||||
"new_playlist_name": "Yeni oynatma listesi adı"
|
||||
"new_playlist_name": "Yeni oynatma listesi adı",
|
||||
"show_chapters": "Bölümler"
|
||||
},
|
||||
"player": {
|
||||
"watch_on": "{0} üzerinde izle"
|
||||
|
|
|
@ -89,7 +89,8 @@
|
|||
"with_timecode": "用时间码分享",
|
||||
"time_code": "时间码(单位:秒)",
|
||||
"rename_playlist": "重命名播放列表",
|
||||
"new_playlist_name": "新播放列表名"
|
||||
"new_playlist_name": "新播放列表名",
|
||||
"show_chapters": "章节"
|
||||
},
|
||||
"video": {
|
||||
"sponsor_segments": "赞助商部分",
|
||||
|
|
|
@ -60,7 +60,17 @@
|
|||
"select_playlist": "選擇播放清單",
|
||||
"add_to_playlist": "加到播放清單",
|
||||
"delete_playlist_video_confirm": "要從播放清單中移除影片嗎?",
|
||||
"delete_account": "刪除帳戶"
|
||||
"delete_account": "刪除帳戶",
|
||||
"show_chapters": "章節",
|
||||
"download_as_txt": "以 .txt 下載",
|
||||
"share": "分享",
|
||||
"new_playlist_name": "播放清單的新名稱",
|
||||
"rename_playlist": "重新命名播放清單",
|
||||
"reset_preferences": "重設偏好設定",
|
||||
"confirm_reset_preferences": "確定要重設偏好設定嗎?",
|
||||
"backup_preferences": "備份偏好設定",
|
||||
"restore_preferences": "復原偏好設定",
|
||||
"back_to_home": "回首頁"
|
||||
},
|
||||
"titles": {
|
||||
"history": "歷史記錄",
|
||||
|
@ -71,7 +81,8 @@
|
|||
"login": "登入",
|
||||
"subscriptions": "訂閱內容",
|
||||
"playlists": "播放清單",
|
||||
"account": "帳戶"
|
||||
"account": "帳戶",
|
||||
"player": "播放器"
|
||||
},
|
||||
"preferences": {
|
||||
"registered_users": "已註冊的使用者",
|
||||
|
@ -104,5 +115,11 @@
|
|||
"pinned_by": "置頂者:",
|
||||
"disabled": "上傳者停用了留言功能。",
|
||||
"loading": "留言載入中……"
|
||||
},
|
||||
"info": {
|
||||
"copied": "已複製!",
|
||||
"cannot_copy": "無法複製!",
|
||||
"page_not_found": "找不到頁面",
|
||||
"preferences_note": "註:偏好設定儲存在本機的瀏覽器的儲存空間內。如果清除瀏覽器的資料,偏好設定就會重設。"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,6 +17,9 @@ import {
|
|||
faXmark,
|
||||
faClone,
|
||||
faShare,
|
||||
faBook,
|
||||
faServer,
|
||||
faDonate,
|
||||
} from "@fortawesome/free-solid-svg-icons";
|
||||
import { faGithub, faBitcoin } from "@fortawesome/free-brands-svg-icons";
|
||||
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
|
||||
|
@ -39,6 +42,9 @@ library.add(
|
|||
faXmark,
|
||||
faClone,
|
||||
faShare,
|
||||
faBook,
|
||||
faServer,
|
||||
faDonate,
|
||||
);
|
||||
|
||||
import router from "@/router/router.js";
|
||||
|
@ -183,7 +189,7 @@ const mixin = {
|
|||
const emailRegex = /([\w-\\.]+@(?:[\w-]+\.)+[\w-]{2,4})/g;
|
||||
return string
|
||||
.replace(urlRegex, url => {
|
||||
if (url.endsWith("</a>")) return url;
|
||||
if (url.endsWith("</a>") || url.endsWith("<a")) return url;
|
||||
return `<a href="${url}" target="_blank">${url}</a>`;
|
||||
})
|
||||
.replace(emailRegex, email => {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue