[codex] Add scoped EPG security trust controls (#1054)

* Add scoped EPG security trust controls

* fix: address scoped trust review feedback

---------

Co-authored-by: 4gray <fourgray@proton.me>
This commit is contained in:
4grayand4gray authored and GitHub committed 2026-06-12 20:46:24 +02:00
1 parent 9043116ebd
commit e8aa7c3a34
56 files changed
+1683 -243

No files matched your search

@@ -2,7 +2,14 @@ import { TestBed } from '@angular/core/testing';
import { MatSnackBar } from '@angular/material/snack-bar';
import { Store } from '@ngrx/store';
import { TranslateService } from '@ngx-translate/core';
import { PLAYLIST_PARSE_BY_URL } from '@iptvnator/shared/interfaces';
import { of } from 'rxjs';
import { DialogService } from '@iptvnator/ui/components';
import { SettingsStore } from '@iptvnator/services';
import {
ELECTRON_BRIDGE_SECURITY_ERROR_CODES,
PLAYLIST_PARSE_BY_URL,
SECURITY_ERROR_PREFIX,
} from '@iptvnator/shared/interfaces';
import { ElectronService } from './electron.service';
describe('ElectronService', () => {
@@ -12,6 +19,7 @@ describe('ElectronService', () => {
openInMpv: jest.Mock;
openInVlc: jest.Mock;
};
let snackBar: { open: jest.Mock };
let service: ElectronService;
beforeEach(() => {
@@ -22,6 +30,11 @@ describe('ElectronService', () => {
openInMpv: jest.fn().mockResolvedValue(session),
openInVlc: jest.fn().mockResolvedValue(session),
};
snackBar = {
open: jest.fn(() => ({
onAction: () => of(undefined),
})),
};
Object.defineProperty(window, 'electron', {
configurable: true,
@@ -33,8 +46,25 @@ describe('ElectronService', () => {
ElectronService,
{
provide: MatSnackBar,
useValue: snackBar,
},
{
provide: DialogService,
useValue: {
open: jest.fn(),
openConfirmDialog: jest.fn(),
},
},
{
provide: SettingsStore,
useValue: {
getTrustOptions: jest.fn(() => ({
trustedPrivateNetworkEpgUrls: [],
trustedInsecureTlsHosts: [],
})),
getSettings: jest.fn(() => ({
trustedInsecureTlsHosts: [],
})),
updateSettings: jest.fn().mockResolvedValue(undefined),
},
},
{
@@ -69,6 +99,32 @@ describe('ElectronService', () => {
expect(electronBridge.fetchPlaylistByUrl).not.toHaveBeenCalled();
});
it('shows the trust-host action for Electron-wrapped security errors', async () => {
const securityPayload = {
code: ELECTRON_BRIDGE_SECURITY_ERROR_CODES.InvalidTlsCertificate,
host: 'playlist.local',
message: 'Certificate for this playlist host is invalid.',
};
electronBridge.fetchPlaylistByUrl.mockRejectedValue(
new Error(
`Error invoking remote method 'FETCH_PLAYLIST_BY_URL': Error: ${SECURITY_ERROR_PREFIX}${JSON.stringify(
securityPayload
)}`
)
);
await service.sendIpcEvent(PLAYLIST_PARSE_BY_URL, {
url: 'https://playlist.local/list.m3u',
});
await Promise.resolve();
expect(snackBar.open).toHaveBeenCalledWith(
'Certificate for this playlist host is invalid.',
'Trust host',
{ duration: 10000 }
);
});
it('preserves an absent MPV user-agent so backend fallback headers can apply', async () => {
await service.sendIpcEvent('OPEN_MPV_PLAYER', {
url: 'https://example.test/live.m3u8',
+114 -4
View File
@@ -3,11 +3,15 @@ import { MatSnackBar } from '@angular/material/snack-bar';
import { Store } from '@ngrx/store';
import { TranslateService } from '@ngx-translate/core';
import { PlaylistActions } from '@iptvnator/m3u-state';
import { DataService } from '@iptvnator/services';
import { DialogService } from '@iptvnator/ui/components';
import { DataService, SettingsStore } from '@iptvnator/services';
import {
AUTO_UPDATE_PLAYLISTS,
createDevLogger,
ELECTRON_BRIDGE_SECURITY_ERROR_CODES,
ERROR,
normalizeHost,
parseSecurityPolicyError,
PlayerContentInfo,
Playlist,
PLAYLIST_PARSE_BY_URL,
@@ -46,7 +50,9 @@ export class ElectronService extends DataService {
private eventListeners: { [key: string]: () => void } = {};
private messageListeners = new Map<string, EventListener>();
private readonly snackBar = inject(MatSnackBar);
private readonly dialogService = inject(DialogService);
private readonly store = inject(Store);
private readonly settingsStore = inject(SettingsStore);
private readonly translateService = inject(TranslateService);
private readonly debugLog = createDevLogger('ElectronService');
private readonly silentXtreamActions = new Set<string>([
@@ -212,7 +218,10 @@ export class ElectronService extends DataService {
if (type === AUTO_UPDATE_PLAYLISTS) {
const data = payload as Playlist[];
const playlists = await window.electron.autoUpdatePlaylists(data);
const playlists = await window.electron.autoUpdatePlaylists(
data,
this.settingsStore.getTrustOptions()
);
this.store.dispatch(
PlaylistActions.updateManyPlaylists({
playlists,
@@ -276,7 +285,11 @@ export class ElectronService extends DataService {
const title = payload.title?.trim() || undefined;
window.electron
.fetchPlaylistByUrl(payload.url, title)
.fetchPlaylistByUrl(
payload.url,
title,
this.settingsStore.getTrustOptions()
)
.then((result) => {
this.store.dispatch(
PlaylistActions.handleAddingPlaylistByUrl({
@@ -286,6 +299,14 @@ export class ElectronService extends DataService {
);
})
.catch((error: unknown) => {
if (
this.handlePlaylistSecurityError(error, () =>
this.fetchM3uPlaylistFromUrl(payload)
)
) {
return;
}
const statusCode = this.extractHttpStatusCode(error);
let messageKey = 'HOME.URL_UPLOAD.ERROR_FETCH_FAILED';
if (statusCode === 403) {
@@ -331,7 +352,8 @@ export class ElectronService extends DataService {
if (data.url && !data.filePath) {
playlistObject = await window.electron.fetchPlaylistByUrl(
data.url,
data.title
data.title,
this.settingsStore.getTrustOptions()
);
} else if (data.filePath && !data.url) {
playlistObject =
@@ -365,6 +387,14 @@ export class ElectronService extends DataService {
);
} catch (error: unknown) {
console.error('Playlist refresh error:', error);
if (
data.url &&
this.handlePlaylistSecurityError(error, () => {
void this.updateM3uPlaylistFromFile(data);
})
) {
return;
}
this.snackBar.open(
this.getPlaylistRefreshErrorMessage(error, data),
this.translateService.instant('CLOSE'),
@@ -425,6 +455,86 @@ export class ElectronService extends DataService {
return translated === key ? fallback : translated;
}
private handlePlaylistSecurityError(
error: unknown,
retry: () => void
): boolean {
const securityError = parseSecurityPolicyError(error);
if (
securityError?.code !==
ELECTRON_BRIDGE_SECURITY_ERROR_CODES.InvalidTlsCertificate
) {
return false;
}
const ref = this.snackBar.open(
this.translateWithFallback(
'HOME.URL_UPLOAD.ERROR_INVALID_TLS',
'Certificate for this playlist host is invalid.'
),
this.translateWithFallback(
'HOME.URL_UPLOAD.TRUST_TLS_HOST',
'Trust host'
),
{ duration: 10000 }
);
ref.onAction().subscribe(() => {
this.confirmTrustPlaylistHost(securityError.host, retry);
});
return true;
}
private confirmTrustPlaylistHost(
host: string | undefined,
retry: () => void
): void {
if (!host) {
this.snackBar.open(
this.translateWithFallback(
'HOME.URL_UPLOAD.ERROR_TLS_HOST_UNKNOWN',
'Could not determine the playlist host. Please retry manually.'
),
this.translateService.instant('CLOSE'),
{ duration: 5000 }
);
return;
}
this.dialogService.openConfirmDialog({
title: this.translateWithFallback(
'HOME.URL_UPLOAD.TRUST_TLS_HOST_TITLE',
'Trust invalid certificate?'
),
message: this.translateWithFallback(
'HOME.URL_UPLOAD.TRUST_TLS_HOST_WARNING',
'Only continue if you trust this playlist host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates.'
),
confirmLabel: this.translateWithFallback(
'HOME.URL_UPLOAD.TRUST_TLS_HOST',
'Trust host'
),
width: '420px',
onConfirm: () => {
void this.trustPlaylistHost(host).then(retry);
},
});
}
private async trustPlaylistHost(host: string): Promise<void> {
const settings = this.settingsStore.getSettings();
const trustedHosts = new Set(
(settings.trustedInsecureTlsHosts ?? []).map((item) =>
normalizeHost(item)
)
);
trustedHosts.add(normalizeHost(host));
await this.settingsStore.updateSettings({
trustedInsecureTlsHosts: Array.from(trustedHosts),
});
}
/* private getErrorMessageByStatusCode(status: number) {
let message = 'Something went wrong';
switch (status) {
@@ -18,7 +18,10 @@ import { MatTooltipModule } from '@angular/material/tooltip';
import { By } from '@angular/platform-browser';
import { Router } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing';
import { EpgRuntimeBridgeService, EpgService } from '@iptvnator/epg/data-access';
import {
EpgRuntimeBridgeService,
EpgService,
} from '@iptvnator/epg/data-access';
import { Store } from '@ngrx/store';
import { MockStore, provideMockStore } from '@ngrx/store/testing';
import { TranslateModule, TranslateService } from '@ngx-translate/core';
@@ -94,6 +97,21 @@ class MockSettingsStore {
getSettings = () => this._settings();
getTrustOptions = () => ({
trustedPrivateNetworkEpgUrls:
(
this._settings() as typeof DEFAULT_SETTINGS & {
trustedPrivateNetworkEpgUrls?: string[];
}
).trustedPrivateNetworkEpgUrls ?? [],
trustedInsecureTlsHosts:
(
this._settings() as typeof DEFAULT_SETTINGS & {
trustedInsecureTlsHosts?: string[];
}
).trustedInsecureTlsHosts ?? [],
});
loadSettings = jest.fn().mockResolvedValue(undefined);
updateSettings = jest.fn().mockResolvedValue(undefined);
@@ -488,9 +506,7 @@ describe('SettingsComponent', () => {
expect(
component
.players()
.some(
(player) => player.id === VideoPlayer.EmbeddedMpv
)
.some((player) => player.id === VideoPlayer.EmbeddedMpv)
).toBe(true);
}
);
@@ -515,9 +531,9 @@ describe('SettingsComponent', () => {
partialBridgeFixture.detectChanges();
expect(partialBridgeComponent.isDesktop).toBe(true);
expect(
partialBridgeComponent.supportsManagedExternalPlayers
).toBe(false);
expect(partialBridgeComponent.supportsManagedExternalPlayers).toBe(
false
);
expect(
partialBridgeComponent.supportsExternalPlayerPathSettings
).toBe(false);
@@ -611,9 +627,7 @@ describe('SettingsComponent', () => {
).toBe(false);
if (!resolveSupport) {
throw new Error(
'Expected embedded MPV support probe to start'
);
throw new Error('Expected embedded MPV support probe to start');
}
resolveSupport({
@@ -882,7 +896,10 @@ describe('SettingsComponent', () => {
it('should force-fetch EPG for a single URL (bypassing freshness cache)', () => {
const url = 'http://epg-url-here/data.xml';
component.refreshEpg(url);
expect(epgBridge.forceFetchEpg).toHaveBeenCalledWith(url);
expect(epgBridge.forceFetchEpg).toHaveBeenCalledWith(url, {
trustedPrivateNetworkEpgUrls: [],
trustedInsecureTlsHosts: [],
});
});
it('clears EPG data with a busy state and refreshes all sources on success', async () => {
@@ -1112,12 +1129,16 @@ describe('SettingsComponent', () => {
component.onSubmit();
await fixture.whenStable();
expect(mockStore.updateSettings).toHaveBeenCalledWith(
component.settingsForm.value
);
expect(updateSettings).toHaveBeenCalledWith(
component.settingsForm.value
);
expect(mockStore.updateSettings).toHaveBeenCalledWith({
...component.settingsForm.value,
trustedPrivateNetworkEpgUrls: [],
trustedInsecureTlsHosts: [],
});
expect(updateSettings).toHaveBeenCalledWith({
...component.settingsForm.value,
trustedPrivateNetworkEpgUrls: [],
trustedInsecureTlsHosts: [],
});
});
it('clears external player paths in Electron when saved as empty', async () => {
+19 -12
View File
@@ -25,7 +25,10 @@ import {
import { MatIconModule } from '@angular/material/icon';
import { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar';
import { Router } from '@angular/router';
import { EpgRuntimeBridgeService, EpgService } from '@iptvnator/epg/data-access';
import {
EpgRuntimeBridgeService,
EpgService,
} from '@iptvnator/epg/data-access';
import { SettingsContextService } from '@iptvnator/workspace/shell/util';
import { Store } from '@ngrx/store';
import { TranslateModule, TranslateService } from '@ngx-translate/core';
@@ -222,9 +225,7 @@ export class SettingsComponent implements OnInit, OnDestroy {
],
recordingFolder: '',
coverSize: 'medium' as CoverSize,
...(this.supportsEpg
? { preferUploadedEpgOverXtream: false }
: {}),
...(this.supportsEpg ? { preferUploadedEpgOverXtream: false } : {}),
});
/** Form array with epg sources */
@@ -241,12 +242,10 @@ export class SettingsComponent implements OnInit, OnDestroy {
readonly removeAllProgress = signal<DbOperationEvent | null>(null);
private settingsStore = inject(SettingsStore);
readonly sectionNavItems: SettingsSection[] = buildSettingsSectionNavItems(
{
supportsEpg: this.supportsEpg,
supportsRemoteControl: this.supportsRemoteControl,
}
);
readonly sectionNavItems: SettingsSection[] = buildSettingsSectionNavItems({
supportsEpg: this.supportsEpg,
supportsRemoteControl: this.supportsRemoteControl,
});
readonly playlistDeleteSummary = computed<SettingsPlaylistDeleteSummary>(
() => {
@@ -560,6 +559,10 @@ export class SettingsComponent implements OnInit, OnDestroy {
value.preferUploadedEpgOverXtream ??
currentSettings.preferUploadedEpgOverXtream ??
false,
trustedPrivateNetworkEpgUrls:
currentSettings.trustedPrivateNetworkEpgUrls ?? [],
trustedInsecureTlsHosts:
currentSettings.trustedInsecureTlsHosts ?? [],
};
}
@@ -616,7 +619,10 @@ export class SettingsComponent implements OnInit, OnDestroy {
if (!this.epgBridge.supportsDataManagement || !url) {
return;
}
void this.epgBridge.forceFetchEpg(url);
void this.epgBridge.forceFetchEpg(
url,
this.settingsStore.getTrustOptions()
);
}
/**
@@ -629,7 +635,8 @@ export class SettingsComponent implements OnInit, OnDestroy {
const urls = (this.epgUrl.value as string[])
.map((url) => url?.trim())
.filter((url): url is string => Boolean(url));
urls.forEach((url) => void this.epgBridge.forceFetchEpg(url));
const options = this.settingsStore.getTrustOptions();
urls.forEach((url) => void this.epgBridge.forceFetchEpg(url, options));
}
/**
+12 -1
View File
@@ -155,7 +155,12 @@
"ERROR_FETCH_FAILED": "فشل جلب قائمة التشغيل. يرجى التحقق من الرابط والمحاولة مرة أخرى.",
"ERROR_403": "تم رفض الوصول (403): رفض الخادم الطلب. قد يتطلب الرابط مصادقة أو أن قائمة التشغيل مقيدة.",
"ERROR_404": "قائمة التشغيل غير موجودة (404): الرابط لا يشير إلى قائمة تشغيل صالحة. يرجى التحقق من الرابط.",
"ERROR_401": "غير مصرح (401): المصادقة مطلوبة للوصول إلى قائمة التشغيل هذه."
"ERROR_401": "غير مصرح (401): المصادقة مطلوبة للوصول إلى قائمة التشغيل هذه.",
"ERROR_INVALID_TLS": "Certificate for this playlist host is invalid.",
"ERROR_TLS_HOST_UNKNOWN": "Could not determine the playlist host. Please retry manually.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this playlist host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates."
},
"TEXT_IMPORT": {
"LABEL": "إدراج قائمة تشغيل M3U(8) كنص",
@@ -569,6 +574,12 @@
"TOTAL_PROGRAMS": "إجمالي البرامج",
"UP_TO_DATE": "EPG محدث، لا حاجة للمزامنة",
"RETRY": "إعادة المحاولة",
"ALLOW_PRIVATE_SOURCE": "Allow source",
"ALLOW_PRIVATE_SOURCE_TITLE": "Allow private-network EPG source?",
"ALLOW_PRIVATE_SOURCE_WARNING": "Only allow this if you trust the EPG source. IPTVnator will let this exact EPG URL connect to private or local network addresses.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates.",
"CURRENT_PROGRAM": "Current program",
"COLLAPSE_PANEL": "Collapse EPG panel",
"EXPAND_PANEL": "Expand EPG panel"
+12 -1
View File
@@ -155,7 +155,12 @@
"ERROR_FETCH_FAILED": "فشل جلب قائمة التشغيل. عفاك تحقق من الرابط وحاول مرة أخرى.",
"ERROR_403": "الوصول مرفوض (403): السيرفر رفض الطلب. يمكن الرابط محتاج مصادقة ولا قائمة التشغيل مقيدة.",
"ERROR_404": "قائمة التشغيل ما تلقاتش (404): الرابط ما كيوجهش لقائمة تشغيل صحيحة. عفاك تحقق من الرابط.",
"ERROR_401": "غير مصرح (401): المصادقة مطلوبة باش تدخل لهاد قائمة التشغيل."
"ERROR_401": "غير مصرح (401): المصادقة مطلوبة باش تدخل لهاد قائمة التشغيل.",
"ERROR_INVALID_TLS": "Certificate for this playlist host is invalid.",
"ERROR_TLS_HOST_UNKNOWN": "Could not determine the playlist host. Please retry manually.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this playlist host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates."
},
"TEXT_IMPORT": {
"LABEL": "دخل قائمة تشغيل m3u(8) على شكل نص",
@@ -569,6 +574,12 @@
"TOTAL_PROGRAMS": "مجموع البرامج",
"UP_TO_DATE": "EPG محدث، ما خاصش مزامنة",
"RETRY": "حاول مرة أخرى",
"ALLOW_PRIVATE_SOURCE": "Allow source",
"ALLOW_PRIVATE_SOURCE_TITLE": "Allow private-network EPG source?",
"ALLOW_PRIVATE_SOURCE_WARNING": "Only allow this if you trust the EPG source. IPTVnator will let this exact EPG URL connect to private or local network addresses.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates.",
"CURRENT_PROGRAM": "Current program",
"COLLAPSE_PANEL": "Collapse EPG panel",
"EXPAND_PANEL": "Expand EPG panel"
+12 -1
View File
@@ -155,7 +155,12 @@
"ERROR_FETCH_FAILED": "Не ўдалося атрымаць плэйліст. Калі ласка, праверце URL і паспрабуйце яшчэ раз.",
"ERROR_403": "Доступ забаронены (403): сервер адхіліў запыт. URL можа патрабаваць аўтэнтыфікацыі або плэйліст абмежаваны.",
"ERROR_404": "Плэйліст не знойдзены (404): URL не паказвае на сапраўдны плэйліст. Калі ласка, праверце URL.",
"ERROR_401": "Несанкцыянавана (401): для доступу да гэтага плэйліста патрабуецца аўтэнтыфікацыя."
"ERROR_401": "Несанкцыянавана (401): для доступу да гэтага плэйліста патрабуецца аўтэнтыфікацыя.",
"ERROR_INVALID_TLS": "Certificate for this playlist host is invalid.",
"ERROR_TLS_HOST_UNKNOWN": "Could not determine the playlist host. Please retry manually.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this playlist host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates."
},
"TEXT_IMPORT": {
"LABEL": "Устаўце плэйліст фармату m3u(8) у гэта поле",
@@ -569,6 +574,12 @@
"TOTAL_PROGRAMS": "Усяго перадач",
"UP_TO_DATE": "EPG актуальны, сінхранізацыя не патрэбна",
"RETRY": "Паўтарыць",
"ALLOW_PRIVATE_SOURCE": "Allow source",
"ALLOW_PRIVATE_SOURCE_TITLE": "Allow private-network EPG source?",
"ALLOW_PRIVATE_SOURCE_WARNING": "Only allow this if you trust the EPG source. IPTVnator will let this exact EPG URL connect to private or local network addresses.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates.",
"CURRENT_PROGRAM": "Current program",
"COLLAPSE_PANEL": "Collapse EPG panel",
"EXPAND_PANEL": "Expand EPG panel"
+12 -1
View File
@@ -155,7 +155,12 @@
"ERROR_FETCH_FAILED": "Playlist konnte nicht abgerufen werden. Bitte überprüfen Sie die URL und versuchen Sie es erneut.",
"ERROR_403": "Zugriff verweigert (403): Der Server hat die Anfrage abgelehnt. Die URL erfordert möglicherweise eine Authentifizierung oder die Playlist ist eingeschränkt.",
"ERROR_404": "Playlist nicht gefunden (404): Die URL verweist nicht auf eine gültige Playlist. Bitte überprüfen Sie die URL.",
"ERROR_401": "Nicht autorisiert (401): Für den Zugriff auf diese Playlist ist eine Authentifizierung erforderlich."
"ERROR_401": "Nicht autorisiert (401): Für den Zugriff auf diese Playlist ist eine Authentifizierung erforderlich.",
"ERROR_INVALID_TLS": "Certificate for this playlist host is invalid.",
"ERROR_TLS_HOST_UNKNOWN": "Could not determine the playlist host. Please retry manually.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this playlist host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates."
},
"TEXT_IMPORT": {
"LABEL": "Füge m3u(8)-Wiedergabeliste hier als Text ein",
@@ -569,6 +574,12 @@
"TOTAL_PROGRAMS": "Programme insgesamt",
"UP_TO_DATE": "EPG ist aktuell, keine Synchronisation nötig",
"RETRY": "Erneut versuchen",
"ALLOW_PRIVATE_SOURCE": "Allow source",
"ALLOW_PRIVATE_SOURCE_TITLE": "Allow private-network EPG source?",
"ALLOW_PRIVATE_SOURCE_WARNING": "Only allow this if you trust the EPG source. IPTVnator will let this exact EPG URL connect to private or local network addresses.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates.",
"CURRENT_PROGRAM": "Current program",
"COLLAPSE_PANEL": "Collapse EPG panel",
"EXPAND_PANEL": "Expand EPG panel"
+12 -1
View File
@@ -155,7 +155,12 @@
"ERROR_FETCH_FAILED": "Αποτυχία λήψης της λίστας αναπαραγωγής. Ελέγξτε τη διεύθυνση URL και δοκιμάστε ξανά.",
"ERROR_403": "Άρνηση πρόσβασης (403): Ο διακομιστής απέρριψε το αίτημα. Η διεύθυνση URL μπορεί να απαιτεί έλεγχο ταυτότητας ή η λίστα αναπαραγωγής είναι περιορισμένη.",
"ERROR_404": "Η λίστα αναπαραγωγής δεν βρέθηκε (404): Η διεύθυνση URL δεν δείχνει σε έγκυρη λίστα αναπαραγωγής. Ελέγξτε τη διεύθυνση URL.",
"ERROR_401": "Μη εξουσιοδοτημένος (401): Απαιτείται έλεγχος ταυτότητας για πρόσβαση σε αυτή τη λίστα αναπαραγωγής."
"ERROR_401": "Μη εξουσιοδοτημένος (401): Απαιτείται έλεγχος ταυτότητας για πρόσβαση σε αυτή τη λίστα αναπαραγωγής.",
"ERROR_INVALID_TLS": "Certificate for this playlist host is invalid.",
"ERROR_TLS_HOST_UNKNOWN": "Could not determine the playlist host. Please retry manually.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this playlist host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates."
},
"TEXT_IMPORT": {
"LABEL": "Προσθήκη m3u(8) λίστας αναπαραγωγής ως κείμενο",
@@ -569,6 +574,12 @@
"TOTAL_PROGRAMS": "Σύνολο προγραμμάτων",
"UP_TO_DATE": "Το EPG είναι ενημερωμένο, δεν απαιτείται συγχρονισμός",
"RETRY": "Επανάληψη",
"ALLOW_PRIVATE_SOURCE": "Allow source",
"ALLOW_PRIVATE_SOURCE_TITLE": "Allow private-network EPG source?",
"ALLOW_PRIVATE_SOURCE_WARNING": "Only allow this if you trust the EPG source. IPTVnator will let this exact EPG URL connect to private or local network addresses.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates.",
"CURRENT_PROGRAM": "Current program",
"COLLAPSE_PANEL": "Collapse EPG panel",
"EXPAND_PANEL": "Expand EPG panel"
+12 -1
View File
@@ -155,7 +155,12 @@
"ERROR_FETCH_FAILED": "Failed to fetch the playlist. Please check the URL and try again.",
"ERROR_403": "Access denied (403): The server refused the request. The URL may require authentication or the playlist is restricted.",
"ERROR_404": "Playlist not found (404): The URL does not point to a valid playlist. Please check the URL.",
"ERROR_401": "Unauthorized (401): Authentication is required to access this playlist."
"ERROR_401": "Unauthorized (401): Authentication is required to access this playlist.",
"ERROR_INVALID_TLS": "Certificate for this playlist host is invalid.",
"ERROR_TLS_HOST_UNKNOWN": "Could not determine the playlist host. Please retry manually.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this playlist host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates."
},
"TEXT_IMPORT": {
"LABEL": "Insert m3u(8) playlist as text",
@@ -569,6 +574,12 @@
"TOTAL_PROGRAMS": "Total programs",
"UP_TO_DATE": "EPG is up-to-date, no sync needed",
"RETRY": "Retry",
"ALLOW_PRIVATE_SOURCE": "Allow source",
"ALLOW_PRIVATE_SOURCE_TITLE": "Allow private-network EPG source?",
"ALLOW_PRIVATE_SOURCE_WARNING": "Only allow this if you trust the EPG source. IPTVnator will let this exact EPG URL connect to private or local network addresses.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates.",
"CURRENT_PROGRAM": "Current program",
"COLLAPSE_PANEL": "Collapse EPG panel",
"EXPAND_PANEL": "Expand EPG panel"
+12 -1
View File
@@ -155,7 +155,12 @@
"ERROR_FETCH_FAILED": "No se pudo obtener la lista de reproducción. Verifica la URL e inténtalo de nuevo.",
"ERROR_403": "Acceso denegado (403): el servidor rechazó la solicitud. La URL puede requerir autenticación o la lista de reproducción está restringida.",
"ERROR_404": "Lista de reproducción no encontrada (404): la URL no apunta a una lista válida. Verifica la URL.",
"ERROR_401": "No autorizado (401): se requiere autenticación para acceder a esta lista de reproducción."
"ERROR_401": "No autorizado (401): se requiere autenticación para acceder a esta lista de reproducción.",
"ERROR_INVALID_TLS": "Certificate for this playlist host is invalid.",
"ERROR_TLS_HOST_UNKNOWN": "Could not determine the playlist host. Please retry manually.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this playlist host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates."
},
"TEXT_IMPORT": {
"LABEL": "Inserte la playlist m3u(8) como texto",
@@ -569,6 +574,12 @@
"TOTAL_PROGRAMS": "Total de programas",
"UP_TO_DATE": "EPG actualizada, no se necesita sincronización",
"RETRY": "Reintentar",
"ALLOW_PRIVATE_SOURCE": "Allow source",
"ALLOW_PRIVATE_SOURCE_TITLE": "Allow private-network EPG source?",
"ALLOW_PRIVATE_SOURCE_WARNING": "Only allow this if you trust the EPG source. IPTVnator will let this exact EPG URL connect to private or local network addresses.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates.",
"CURRENT_PROGRAM": "Current program",
"COLLAPSE_PANEL": "Collapse EPG panel",
"EXPAND_PANEL": "Expand EPG panel"
+12 -1
View File
@@ -155,7 +155,12 @@
"ERROR_FETCH_FAILED": "Échec de la récupération de la liste de lecture. Veuillez vérifier l'URL et réessayer.",
"ERROR_403": "Accès refusé (403) : le serveur a refusé la requête. L'URL peut nécessiter une authentification ou la liste de lecture est restreinte.",
"ERROR_404": "Liste de lecture introuvable (404) : l'URL ne pointe pas vers une liste de lecture valide. Veuillez vérifier l'URL.",
"ERROR_401": "Non autorisé (401) : une authentification est requise pour accéder à cette liste de lecture."
"ERROR_401": "Non autorisé (401) : une authentification est requise pour accéder à cette liste de lecture.",
"ERROR_INVALID_TLS": "Certificate for this playlist host is invalid.",
"ERROR_TLS_HOST_UNKNOWN": "Could not determine the playlist host. Please retry manually.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this playlist host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates."
},
"TEXT_IMPORT": {
"LABEL": "Insérer la liste m3u(8) sous forme de texte",
@@ -569,6 +574,12 @@
"TOTAL_PROGRAMS": "Total des programmes",
"UP_TO_DATE": "L'EPG est à jour, aucune synchronisation nécessaire",
"RETRY": "Réessayer",
"ALLOW_PRIVATE_SOURCE": "Allow source",
"ALLOW_PRIVATE_SOURCE_TITLE": "Allow private-network EPG source?",
"ALLOW_PRIVATE_SOURCE_WARNING": "Only allow this if you trust the EPG source. IPTVnator will let this exact EPG URL connect to private or local network addresses.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates.",
"CURRENT_PROGRAM": "Current program",
"COLLAPSE_PANEL": "Collapse EPG panel",
"EXPAND_PANEL": "Expand EPG panel"
+12 -1
View File
@@ -155,7 +155,12 @@
"ERROR_FETCH_FAILED": "Impossibile recuperare la playlist. Controlla l'URL e riprova.",
"ERROR_403": "Accesso negato (403): il server ha rifiutato la richiesta. L'URL potrebbe richiedere autenticazione o la playlist è soggetta a restrizioni.",
"ERROR_404": "Playlist non trovata (404): l'URL non punta a una playlist valida. Controlla l'URL.",
"ERROR_401": "Non autorizzato (401): è richiesta l'autenticazione per accedere a questa playlist."
"ERROR_401": "Non autorizzato (401): è richiesta l'autenticazione per accedere a questa playlist.",
"ERROR_INVALID_TLS": "Certificate for this playlist host is invalid.",
"ERROR_TLS_HOST_UNKNOWN": "Could not determine the playlist host. Please retry manually.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this playlist host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates."
},
"TEXT_IMPORT": {
"LABEL": "Inserisci playlist m3u(8) come testo",
@@ -569,6 +574,12 @@
"TOTAL_PROGRAMS": "Totale programmi",
"UP_TO_DATE": "L'EPG è aggiornato, nessuna sincronizzazione necessaria",
"RETRY": "Riprova",
"ALLOW_PRIVATE_SOURCE": "Allow source",
"ALLOW_PRIVATE_SOURCE_TITLE": "Allow private-network EPG source?",
"ALLOW_PRIVATE_SOURCE_WARNING": "Only allow this if you trust the EPG source. IPTVnator will let this exact EPG URL connect to private or local network addresses.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates.",
"CURRENT_PROGRAM": "Current program",
"COLLAPSE_PANEL": "Collapse EPG panel",
"EXPAND_PANEL": "Expand EPG panel"
+12 -1
View File
@@ -155,7 +155,12 @@
"ERROR_FETCH_FAILED": "プレイリストを取得できませんでした。URLを確認してもう一度お試しください。",
"ERROR_403": "アクセスが拒否されました(403):サーバーがリクエストを拒否しました。URLに認証が必要か、プレイリストが制限されている可能性があります。",
"ERROR_404": "プレイリストが見つかりません(404):URLは有効なプレイリストを指していません。URLを確認してください。",
"ERROR_401": "未認証(401):このプレイリストにアクセスするには認証が必要です。"
"ERROR_401": "未認証(401):このプレイリストにアクセスするには認証が必要です。",
"ERROR_INVALID_TLS": "Certificate for this playlist host is invalid.",
"ERROR_TLS_HOST_UNKNOWN": "Could not determine the playlist host. Please retry manually.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this playlist host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates."
},
"TEXT_IMPORT": {
"LABEL": "m3u(8)プレイリストをテキストとして挿入",
@@ -569,6 +574,12 @@
"TOTAL_PROGRAMS": "総番組数",
"UP_TO_DATE": "EPGは最新です。同期は不要です",
"RETRY": "再試行",
"ALLOW_PRIVATE_SOURCE": "Allow source",
"ALLOW_PRIVATE_SOURCE_TITLE": "Allow private-network EPG source?",
"ALLOW_PRIVATE_SOURCE_WARNING": "Only allow this if you trust the EPG source. IPTVnator will let this exact EPG URL connect to private or local network addresses.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates.",
"CURRENT_PROGRAM": "Current program",
"COLLAPSE_PANEL": "Collapse EPG panel",
"EXPAND_PANEL": "Expand EPG panel"
+12 -1
View File
@@ -155,7 +155,12 @@
"ERROR_FETCH_FAILED": "재생목록을 가져오지 못했습니다. URL을 확인하고 다시 시도해 주세요.",
"ERROR_403": "접근 거부됨 (403): 서버가 요청을 거부했습니다. URL에 인증이 필요하거나 재생목록이 제한되어 있을 수 있습니다.",
"ERROR_404": "재생목록을 찾을 수 없습니다 (404): URL이 유효한 재생목록을 가리키지 않습니다. URL을 확인해 주세요.",
"ERROR_401": "권한 없음 (401): 이 재생목록에 접근하려면 인증이 필요합니다."
"ERROR_401": "권한 없음 (401): 이 재생목록에 접근하려면 인증이 필요합니다.",
"ERROR_INVALID_TLS": "Certificate for this playlist host is invalid.",
"ERROR_TLS_HOST_UNKNOWN": "Could not determine the playlist host. Please retry manually.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this playlist host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates."
},
"TEXT_IMPORT": {
"LABEL": "Insert m3u(8) playlist as text",
@@ -569,6 +574,12 @@
"TOTAL_PROGRAMS": "전체 프로그램",
"UP_TO_DATE": "EPG가 최신 상태이며 동기화가 필요하지 않습니다",
"RETRY": "다시 시도",
"ALLOW_PRIVATE_SOURCE": "Allow source",
"ALLOW_PRIVATE_SOURCE_TITLE": "Allow private-network EPG source?",
"ALLOW_PRIVATE_SOURCE_WARNING": "Only allow this if you trust the EPG source. IPTVnator will let this exact EPG URL connect to private or local network addresses.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates.",
"CURRENT_PROGRAM": "Current program",
"COLLAPSE_PANEL": "Collapse EPG panel",
"EXPAND_PANEL": "Expand EPG panel"
+12 -1
View File
@@ -155,7 +155,12 @@
"ERROR_FETCH_FAILED": "Ophalen van afspeellijst mislukt. Controleer de URL en probeer het opnieuw.",
"ERROR_403": "Toegang geweigerd (403): de server heeft het verzoek geweigerd. De URL vereist mogelijk authenticatie of de afspeellijst is beperkt.",
"ERROR_404": "Afspeellijst niet gevonden (404): de URL verwijst niet naar een geldige afspeellijst. Controleer de URL.",
"ERROR_401": "Niet geautoriseerd (401): authenticatie is vereist om deze afspeellijst te openen."
"ERROR_401": "Niet geautoriseerd (401): authenticatie is vereist om deze afspeellijst te openen.",
"ERROR_INVALID_TLS": "Certificate for this playlist host is invalid.",
"ERROR_TLS_HOST_UNKNOWN": "Could not determine the playlist host. Please retry manually.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this playlist host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates."
},
"TEXT_IMPORT": {
"LABEL": "Voer een m3u(8)-afspeellijst in als tekst",
@@ -569,6 +574,12 @@
"TOTAL_PROGRAMS": "Totaal aantal programma's",
"UP_TO_DATE": "EPG is up-to-date, synchronisatie niet nodig",
"RETRY": "Opnieuw proberen",
"ALLOW_PRIVATE_SOURCE": "Allow source",
"ALLOW_PRIVATE_SOURCE_TITLE": "Allow private-network EPG source?",
"ALLOW_PRIVATE_SOURCE_WARNING": "Only allow this if you trust the EPG source. IPTVnator will let this exact EPG URL connect to private or local network addresses.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates.",
"CURRENT_PROGRAM": "Current program",
"COLLAPSE_PANEL": "Collapse EPG panel",
"EXPAND_PANEL": "Expand EPG panel"
+12 -1
View File
@@ -155,7 +155,12 @@
"ERROR_FETCH_FAILED": "Nie udało się pobrać listy odtwarzania. Sprawdź URL i spróbuj ponownie.",
"ERROR_403": "Brak dostępu (403): Serwer odrzucił żądanie. URL może wymagać uwierzytelnienia lub lista jest ograniczona.",
"ERROR_404": "Nie znaleziono listy odtwarzania (404): URL nie wskazuje prawidłowej listy. Sprawdź URL.",
"ERROR_401": "Brak autoryzacji (401): Dostęp do tej listy odtwarzania wymaga uwierzytelnienia."
"ERROR_401": "Brak autoryzacji (401): Dostęp do tej listy odtwarzania wymaga uwierzytelnienia.",
"ERROR_INVALID_TLS": "Certificate for this playlist host is invalid.",
"ERROR_TLS_HOST_UNKNOWN": "Could not determine the playlist host. Please retry manually.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this playlist host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates."
},
"TEXT_IMPORT": {
"LABEL": "Wklej listę odtwarzania m3u(8) jako tekst",
@@ -569,6 +574,12 @@
"TOTAL_PROGRAMS": "Wszystkie programy",
"UP_TO_DATE": "EPG jest aktualne, synchronizacja nie jest potrzebna",
"RETRY": "Spróbuj ponownie",
"ALLOW_PRIVATE_SOURCE": "Allow source",
"ALLOW_PRIVATE_SOURCE_TITLE": "Allow private-network EPG source?",
"ALLOW_PRIVATE_SOURCE_WARNING": "Only allow this if you trust the EPG source. IPTVnator will let this exact EPG URL connect to private or local network addresses.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates.",
"CURRENT_PROGRAM": "Current program",
"COLLAPSE_PANEL": "Collapse EPG panel",
"EXPAND_PANEL": "Expand EPG panel"
+12 -1
View File
@@ -155,7 +155,12 @@
"ERROR_FETCH_FAILED": "Falha ao buscar a playlist. Verifique a URL e tente novamente.",
"ERROR_403": "Acesso negado (403): O servidor recusou a solicitação. A URL pode exigir autenticação ou a playlist está restrita.",
"ERROR_404": "Playlist não encontrada (404): A URL não aponta para uma playlist válida. Verifique a URL.",
"ERROR_401": "Não autorizado (401): É necessária autenticação para acessar esta playlist."
"ERROR_401": "Não autorizado (401): É necessária autenticação para acessar esta playlist.",
"ERROR_INVALID_TLS": "Certificate for this playlist host is invalid.",
"ERROR_TLS_HOST_UNKNOWN": "Could not determine the playlist host. Please retry manually.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this playlist host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates."
},
"TEXT_IMPORT": {
"LABEL": "Inserir playlist m3u(8) como texto",
@@ -569,6 +574,12 @@
"TOTAL_PROGRAMS": "Total de programas",
"UP_TO_DATE": "EPG está atualizado, sincronização não é necessária",
"RETRY": "Tentar novamente",
"ALLOW_PRIVATE_SOURCE": "Allow source",
"ALLOW_PRIVATE_SOURCE_TITLE": "Allow private-network EPG source?",
"ALLOW_PRIVATE_SOURCE_WARNING": "Only allow this if you trust the EPG source. IPTVnator will let this exact EPG URL connect to private or local network addresses.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates.",
"CURRENT_PROGRAM": "Current program",
"COLLAPSE_PANEL": "Collapse EPG panel",
"EXPAND_PANEL": "Expand EPG panel"
+12 -1
View File
@@ -155,7 +155,12 @@
"ERROR_FETCH_FAILED": "Не удалось получить плейлист. Проверьте URL и попробуйте снова.",
"ERROR_403": "Доступ запрещён (403): сервер отклонил запрос. Возможно, URL требует аутентификации или плейлист ограничен.",
"ERROR_404": "Плейлист не найден (404): URL не указывает на действительный плейлист. Проверьте URL.",
"ERROR_401": "Не авторизовано (401): для доступа к этому плейлисту требуется аутентификация."
"ERROR_401": "Не авторизовано (401): для доступа к этому плейлисту требуется аутентификация.",
"ERROR_INVALID_TLS": "Certificate for this playlist host is invalid.",
"ERROR_TLS_HOST_UNKNOWN": "Could not determine the playlist host. Please retry manually.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this playlist host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates."
},
"TEXT_IMPORT": {
"LABEL": "Вставьте плейлист формата m3u(8) в данное поле",
@@ -569,6 +574,12 @@
"TOTAL_PROGRAMS": "Всего программ",
"UP_TO_DATE": "EPG актуален, синхронизация не требуется",
"RETRY": "Повторить",
"ALLOW_PRIVATE_SOURCE": "Allow source",
"ALLOW_PRIVATE_SOURCE_TITLE": "Allow private-network EPG source?",
"ALLOW_PRIVATE_SOURCE_WARNING": "Only allow this if you trust the EPG source. IPTVnator will let this exact EPG URL connect to private or local network addresses.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates.",
"CURRENT_PROGRAM": "Current program",
"COLLAPSE_PANEL": "Collapse EPG panel",
"EXPAND_PANEL": "Expand EPG panel"
+12 -1
View File
@@ -155,7 +155,12 @@
"ERROR_FETCH_FAILED": "Oynatma listesi alınamadı. Lütfen URL'yi kontrol edip tekrar deneyin.",
"ERROR_403": "Erişim reddedildi (403): Sunucu isteği reddetti. URL kimlik doğrulama gerektiriyor olabilir veya oynatma listesi kısıtlanmış olabilir.",
"ERROR_404": "Oynatma listesi bulunamadı (404): URL geçerli bir oynatma listesine işaret etmiyor. Lütfen URL'yi kontrol edin.",
"ERROR_401": "Yetkisiz (401): Bu oynatma listesine erişmek için kimlik doğrulama gerekiyor."
"ERROR_401": "Yetkisiz (401): Bu oynatma listesine erişmek için kimlik doğrulama gerekiyor.",
"ERROR_INVALID_TLS": "Certificate for this playlist host is invalid.",
"ERROR_TLS_HOST_UNKNOWN": "Could not determine the playlist host. Please retry manually.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this playlist host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates."
},
"TEXT_IMPORT": {
"LABEL": "m3u(8) oynatma listesini metin olarak girin",
@@ -569,6 +574,12 @@
"TOTAL_PROGRAMS": "Toplam program",
"UP_TO_DATE": "EPG güncel, senkronizasyona gerek yok",
"RETRY": "Tekrar Dene",
"ALLOW_PRIVATE_SOURCE": "Allow source",
"ALLOW_PRIVATE_SOURCE_TITLE": "Allow private-network EPG source?",
"ALLOW_PRIVATE_SOURCE_WARNING": "Only allow this if you trust the EPG source. IPTVnator will let this exact EPG URL connect to private or local network addresses.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates.",
"CURRENT_PROGRAM": "Current program",
"COLLAPSE_PANEL": "Collapse EPG panel",
"EXPAND_PANEL": "Expand EPG panel"
+12 -1
View File
@@ -155,7 +155,12 @@
"ERROR_FETCH_FAILED": "获取播放列表失败。请检查 URL 后重试。",
"ERROR_403": "拒绝访问 (403):服务器拒绝了请求。该 URL 可能需要身份验证,或播放列表受到限制。",
"ERROR_404": "未找到播放列表 (404):该 URL 不指向有效的播放列表。请检查 URL。",
"ERROR_401": "未授权 (401):访问此播放列表需要进行身份验证。"
"ERROR_401": "未授权 (401):访问此播放列表需要进行身份验证。",
"ERROR_INVALID_TLS": "Certificate for this playlist host is invalid.",
"ERROR_TLS_HOST_UNKNOWN": "Could not determine the playlist host. Please retry manually.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this playlist host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates."
},
"TEXT_IMPORT": {
"LABEL": "从文本导入播放列表(m3u, m3u8)",
@@ -569,6 +574,12 @@
"TOTAL_PROGRAMS": "节目总数",
"UP_TO_DATE": "EPG 已为最新,无需同步",
"RETRY": "重试",
"ALLOW_PRIVATE_SOURCE": "Allow source",
"ALLOW_PRIVATE_SOURCE_TITLE": "Allow private-network EPG source?",
"ALLOW_PRIVATE_SOURCE_WARNING": "Only allow this if you trust the EPG source. IPTVnator will let this exact EPG URL connect to private or local network addresses.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates.",
"CURRENT_PROGRAM": "Current program",
"COLLAPSE_PANEL": "Collapse EPG panel",
"EXPAND_PANEL": "Expand EPG panel"
+12 -1
View File
@@ -155,7 +155,12 @@
"ERROR_FETCH_FAILED": "無法擷取播放清單。請檢查網址後重試。",
"ERROR_403": "存取被拒(403):伺服器拒絕了此請求。該網址可能需要驗證,或播放清單存取受限。",
"ERROR_404": "找不到播放清單(404):該網址未指向有效的播放清單。請檢查網址。",
"ERROR_401": "未授權(401):存取此播放清單需要驗證。"
"ERROR_401": "未授權(401):存取此播放清單需要驗證。",
"ERROR_INVALID_TLS": "Certificate for this playlist host is invalid.",
"ERROR_TLS_HOST_UNKNOWN": "Could not determine the playlist host. Please retry manually.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this playlist host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates."
},
"TEXT_IMPORT": {
"LABEL": "將 m3u(8)播放清單以純文字的方式插入",
@@ -569,6 +574,12 @@
"TOTAL_PROGRAMS": "節目總數",
"UP_TO_DATE": "EPG 已是最新,無需同步",
"RETRY": "重試",
"ALLOW_PRIVATE_SOURCE": "Allow source",
"ALLOW_PRIVATE_SOURCE_TITLE": "Allow private-network EPG source?",
"ALLOW_PRIVATE_SOURCE_WARNING": "Only allow this if you trust the EPG source. IPTVnator will let this exact EPG URL connect to private or local network addresses.",
"TRUST_TLS_HOST": "Trust host",
"TRUST_TLS_HOST_TITLE": "Trust invalid certificate?",
"TRUST_TLS_HOST_WARNING": "Only continue if you trust this host. IPTVnator will allow invalid TLS certificates for this host, but other hosts still require valid certificates.",
"CURRENT_PROGRAM": "Current program",
"COLLAPSE_PANEL": "Collapse EPG panel",
"EXPAND_PANEL": "Expand EPG panel"