New upstream version 2.4.5
Balint Reczey
4 years ago
2 | 2 | # |
3 | 3 | # Define the build matrix |
4 | 4 | # |
5 | # Travis defaults to building on Ubuntu Precise when building on | |
6 | # Linux. We need Trusty in order to get up to date versions of | |
5 | # Travis defaults to building on Ubuntu Trusty when building on | |
6 | # Linux. We need Xenial in order to get up to date versions of | |
7 | 7 | # cmake and g++. |
8 | 8 | # |
9 | env: | |
10 | global: | |
11 | - app_id=pvr.wmc | |
12 | ||
9 | 13 | matrix: |
10 | 14 | include: |
11 | 15 | - os: linux |
12 | dist: trusty | |
16 | dist: xenial | |
13 | 17 | sudo: required |
14 | 18 | compiler: gcc |
15 | 19 | - os: linux |
16 | dist: trusty | |
20 | dist: xenial | |
17 | 21 | sudo: required |
18 | 22 | compiler: clang |
19 | 23 | - os: osx |
20 | osx_image: xcode7.3 | |
24 | osx_image: xcode9 | |
21 | 25 | - os: osx |
22 | osx_image: xcode6.1 | |
23 | ||
24 | # | |
25 | # Some of the OS X images don't have cmake, contrary to what people | |
26 | # on the Internet say | |
27 | # | |
28 | before_install: | |
29 | - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then which cmake || brew update ; fi | |
30 | - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then which cmake || brew install cmake ; fi | |
26 | osx_image: xcode9.4 | |
31 | 27 | |
32 | 28 | # |
33 | 29 | # The addon source is automatically checked out in $TRAVIS_BUILD_DIR, |
35 | 31 | # |
36 | 32 | before_script: |
37 | 33 | - cd $TRAVIS_BUILD_DIR/.. |
38 | - git clone --depth=1 https://github.com/xbmc/xbmc.git | |
39 | - cd pvr.wmc && mkdir build && cd build | |
40 | - cmake -DADDONS_TO_BUILD=pvr.wmc -DADDON_SRC_PREFIX=$TRAVIS_BUILD_DIR/.. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=$TRAVIS_BUILD_DIR/../xbmc/addons -DPACKAGE_ZIP=1 $TRAVIS_BUILD_DIR/../xbmc/project/cmake/addons | |
34 | - git clone --branch Leia --depth=1 https://github.com/xbmc/xbmc.git | |
35 | - cd ${app_id} && mkdir build && cd build | |
36 | - mkdir -p definition/${app_id} | |
37 | - echo ${app_id} $TRAVIS_BUILD_DIR $TRAVIS_COMMIT > definition/${app_id}/${app_id}.txt | |
38 | - cmake -DADDONS_TO_BUILD=${app_id} -DADDON_SRC_PREFIX=$TRAVIS_BUILD_DIR/.. -DADDONS_DEFINITION_DIR=$TRAVIS_BUILD_DIR/build/definition -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=$TRAVIS_BUILD_DIR/../xbmc/addons -DPACKAGE_ZIP=1 $TRAVIS_BUILD_DIR/../xbmc/cmake/addons | |
41 | 39 | |
42 | 40 | script: make |
0 | cmake_minimum_required(VERSION 3.5) | |
0 | 1 | project(pvr.wmc) |
1 | ||
2 | cmake_minimum_required(VERSION 2.6) | |
3 | ||
4 | enable_language(CXX) | |
5 | 2 | |
6 | 3 | find_package(Kodi REQUIRED) |
7 | 4 | find_package(kodiplatform REQUIRED) |
9 | 6 | |
10 | 7 | include_directories(${kodiplatform_INCLUDE_DIRS} |
11 | 8 | ${p8-platform_INCLUDE_DIRS} |
12 | ${KODI_INCLUDE_DIR}) | |
9 | ${KODI_INCLUDE_DIR}/..) # Hack way with "/..", need bigger Kodi cmake rework to match right include ways | |
13 | 10 | |
14 | 11 | add_definitions(-DUSE_DEMUX) |
15 | 12 | |
18 | 15 | src/Socket.cpp |
19 | 16 | src/utilities.cpp) |
20 | 17 | |
18 | set(WMC_HEADERS src/client.h | |
19 | src/clientversion.h | |
20 | src/pvr2wmc.h | |
21 | src/Socket.h | |
22 | src/utilities.h) | |
23 | ||
21 | 24 | set(DEPLIBS ${kodiplatform_LIBRARIES} |
22 | 25 | ${p8-platform_LIBRARIES}) |
23 | 26 | |
24 | 27 | if (WIN32) |
25 | 28 | list(APPEND DEPLIBS ws2_32) |
29 | add_compile_options(/wd4996) # Need gethostbyname and inet_addr change to prevent | |
26 | 30 | endif() |
27 | 31 | |
28 | 32 | build_addon(pvr.wmc WMC DEPLIBS) |
0 | buildPlugin(version: "Leia") |
0 | [![Build Status](https://travis-ci.org/kodi-pvr/pvr.wmc.svg?branch=master)](https://travis-ci.org/kodi-pvr/pvr.wmc) | |
0 | [![Build Status](https://travis-ci.org/kodi-pvr/pvr.wmc.svg?branch=Leia)](https://travis-ci.org/kodi-pvr/pvr.wmc/branches) | |
1 | [![Build Status](https://ci.appveyor.com/api/projects/status/github/kodi-pvr/pvr.wmc?branch=Leia&svg=true)](https://ci.appveyor.com/project/kodi-pvr/pvr-wmc?branch=Leia) | |
1 | 2 | [![Coverity Scan Build Status](https://scan.coverity.com/projects/5120/badge.svg)](https://scan.coverity.com/projects/5120) |
2 | 3 | |
3 | 4 | # Windows Media Center PVR |
4 | Windows Media Center PVR client addon for [Kodi] (http://kodi.tv) | |
5 | Windows Media Center PVR client addon for [Kodi] (https://kodi.tv) | |
5 | 6 | |
6 | 7 | ## Build instructions |
7 | 8 | |
8 | 9 | ### Linux |
9 | 10 | |
10 | 1. `git clone https://github.com/xbmc/xbmc.git` | |
11 | 1. `git clone --branch Leia https://github.com/xbmc/xbmc.git` | |
11 | 12 | 2. `git clone https://github.com/kodi-pvr/pvr.wmc.git` |
12 | 13 | 3. `cd pvr.wmc && mkdir build && cd build` |
13 | 4. `cmake -DADDONS_TO_BUILD=pvr.wmc -DADDON_SRC_PREFIX=../.. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../../xbmc/addons -DPACKAGE_ZIP=1 ../../xbmc/project/cmake/addons` | |
14 | 4. `cmake -DADDONS_TO_BUILD=pvr.wmc -DADDON_SRC_PREFIX=../.. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../../xbmc/addons -DPACKAGE_ZIP=1 ../../xbmc/cmake/addons` | |
14 | 15 | 5. `make` |
15 | 16 | |
16 | 17 | ##### Useful links |
17 | 18 | |
18 | * [Kodi's PVR user support] (http://forum.kodi.tv/forumdisplay.php?fid=167) | |
19 | * [Kodi's PVR development support] (http://forum.kodi.tv/forumdisplay.php?fid=136) | |
19 | * [Kodi's PVR user support] (https://forum.kodi.tv/forumdisplay.php?fid=167) | |
20 | * [Kodi's PVR development support] (https://forum.kodi.tv/forumdisplay.php?fid=136) |
0 | version: BuildNr.{build} | |
1 | ||
2 | image: Visual Studio 2017 | |
3 | ||
4 | shallow_clone: true | |
5 | ||
6 | clone_folder: c:\projects\pvr.wmc | |
7 | ||
8 | environment: | |
9 | app_id: pvr.wmc | |
10 | ||
11 | matrix: | |
12 | - GENERATOR: "Visual Studio 15" | |
13 | CONFIG: Release | |
14 | - GENERATOR: "Visual Studio 15 Win64" | |
15 | CONFIG: Release | |
16 | - GENERATOR: "Visual Studio 15 Win64" | |
17 | CONFIG: Release | |
18 | WINSTORE: -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0.16299.0" | |
19 | - GENERATOR: "Visual Studio 15 ARM" | |
20 | CONFIG: Release | |
21 | WINSTORE: -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0.16299.0" | |
22 | ||
23 | build_script: | |
24 | - cd .. | |
25 | - git clone --branch Leia --depth=1 https://github.com/xbmc/xbmc.git | |
26 | - cd %app_id% | |
27 | - mkdir build | |
28 | - cd build | |
29 | - mkdir -p definition\%app_id% | |
30 | - echo %app_id% %APPVEYOR_BUILD_FOLDER% %APPVEYOR_REPO_COMMIT% > definition\%app_id%\%app_id%.txt | |
31 | - cmake -T host=x64 -G "%GENERATOR%" %WINSTORE% -DADDONS_TO_BUILD=%app_id% -DCMAKE_BUILD_TYPE=%CONFIG% -DADDONS_DEFINITION_DIR=%APPVEYOR_BUILD_FOLDER%/build/definition -DADDON_SRC_PREFIX=../.. -DCMAKE_INSTALL_PREFIX=../../xbmc/addons -DPACKAGE_ZIP=1 ../../xbmc/cmake/addons | |
32 | - cmake --build . --config %CONFIG% --target %app_id% |
0 | 0 | Source: kodi-pvr-wmc |
1 | 1 | Priority: extra |
2 | 2 | Maintainer: Nobody <nobody@kodi.tv> |
3 | Build-Depends: debhelper (>= 9.0.0), cmake, kodi-pvr-dev, | |
4 | libkodiplatform-dev (>= 16.0.0), kodi-addon-dev | |
3 | Build-Depends: debhelper (>= 9.0.0), cmake, libkodiplatform-dev (>= 17.1.0), | |
4 | kodi-addon-dev | |
5 | 5 | Standards-Version: 3.9.4 |
6 | 6 | Section: libs |
7 | 7 | |
9 | 9 | Section: libs |
10 | 10 | Architecture: any |
11 | 11 | Depends: ${shlibs:Depends}, ${misc:Depends} |
12 | Conflicts: kodi-pvr-tvheadend-hts | |
13 | Replaces: kodi-pvr-tvheadend-hts | |
14 | 12 | Description: WMC PVR for Kodi |
15 | 13 | WMC PVR for Kodi |
16 | 14 |
0 | usr/lib/*/addons/pvr.wmc/pvr.wmc.so* usr/lib/kodi/addons/pvr.wmc | |
1 | usr/share/kodi/addons/pvr.wmc | |
0 | usr/lib | |
1 | usr/share |
12 | 12 | dh $@ |
13 | 13 | |
14 | 14 | override_dh_auto_configure: |
15 | dh_auto_configure -- -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=1 -DUSE_LTO=1 | |
15 | dh_auto_configure -- -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_SHARED_LIBS=1 -DUSE_LTO=1 | |
16 | 16 | |
17 | 17 | override_dh_strip: |
18 | 18 | dh_strip -pkodi-pvr-wmc --dbg-package=kodi-pvr-wmc-dbg |
0 | <?xml version="1.0" encoding="UTF-8"?> | |
0 | <?xml version="1.0" encoding="UTF-8"?> | |
1 | 1 | <addon |
2 | 2 | id="pvr.wmc" |
3 | version="1.4.4" | |
3 | version="2.4.5" | |
4 | 4 | name="PVR WMC Client" |
5 | 5 | provider-name="KrustyReturns and scarecrow420"> |
6 | <requires> | |
7 | <c-pluff version="0.1"/> | |
8 | <import addon="xbmc.pvr" version="5.2.0"/> | |
9 | </requires> | |
6 | <requires>@ADDON_DEPENDS@</requires> | |
10 | 7 | <extension |
11 | 8 | point="xbmc.pvrclient" |
12 | 9 | library_@PLATFORM@="@LIBRARY_FILENAME@"/> |
13 | 10 | <extension point="xbmc.addon.metadata"> |
14 | 11 | <summary lang="af_ZA">PVR WMC Kliënt</summary> |
15 | 12 | <summary lang="am_ET">የ PVR WMC ደንበኛ</summary> |
16 | <summary lang="bg_BG">WMC ПВР клиент</summary> | |
13 | <summary lang="bg_BG">Клиента за ПВР „WMC“</summary> | |
17 | 14 | <summary lang="ca_ES">Client PVR WMC</summary> |
18 | <summary lang="cs_CZ">PVR WMC klient</summary> | |
19 | <summary lang="cy_GB">Cleient Recordydd WMC</summary> | |
15 | <summary lang="cs_CZ">Klient PVR WMC</summary> | |
16 | <summary lang="cy_GB">Cleiant WMC PVR</summary> | |
20 | 17 | <summary lang="da_DK">PVR WMC klient</summary> |
21 | 18 | <summary lang="de_DE">PVR WMC-Client</summary> |
22 | 19 | <summary lang="el_GR">Πελάτης PVR του WMC</summary> |
27 | 24 | <summary lang="es_AR">Cliente PVR WMC</summary> |
28 | 25 | <summary lang="es_ES">Cliente PVR WMC</summary> |
29 | 26 | <summary lang="es_MX">Cliente PVR WMC</summary> |
30 | <summary lang="fi_FI">PVR WMC asiakas</summary> | |
27 | <summary lang="et_EE">PVR WMC klient</summary> | |
28 | <summary lang="fi_FI">Kodin WMC-asiakasohjelma</summary> | |
31 | 29 | <summary lang="fr_CA">Client de numériscope pour CMW</summary> |
32 | 30 | <summary lang="fr_FR">Client enregistreur vidéo (PVR) WMC</summary> |
33 | 31 | <summary lang="gl_ES">Cliente PVR do WMC</summary> |
35 | 33 | <summary lang="hr_HR">PVR WMC klijent</summary> |
36 | 34 | <summary lang="hu_HU">PVR WMC Kliens</summary> |
37 | 35 | <summary lang="id_ID">Klien PVR WMC</summary> |
38 | <summary lang="is_IS">PVR WMC Biðlari</summary> | |
36 | <summary lang="is_IS">PVR WMC upptökubiðlari</summary> | |
39 | 37 | <summary lang="it_IT">Client PVR WMC</summary> |
40 | 38 | <summary lang="ko_KR">PVR WMC 클라이언트</summary> |
41 | 39 | <summary lang="lt_LT">PVR WMC klientas</summary> |
43 | 41 | <summary lang="mk_MK">PVR WMC клиент</summary> |
44 | 42 | <summary lang="ms_MY">Klien PVR WMC</summary> |
45 | 43 | <summary lang="mt_MT">Klijent tal-PVR WMC</summary> |
46 | <summary lang="nb_NO">PVR WMC klient</summary> | |
44 | <summary lang="nb_NO">PVR WMC-klient</summary> | |
47 | 45 | <summary lang="nl_NL">PVR WMC Cliënt</summary> |
48 | 46 | <summary lang="pl_PL">Klient telewizji dla WMC</summary> |
49 | 47 | <summary lang="pt_BR">Cliente de PVR WMC</summary> |
55 | 53 | <summary lang="sr_RS">PVR WMC Клијент</summary> |
56 | 54 | <summary lang="sr_RS@latin">PVR WMC Klijent</summary> |
57 | 55 | <summary lang="sv_SE">PVR WMC-klient</summary> |
56 | <summary lang="szl">Klijynt telewizyje dlŏ WMC</summary> | |
58 | 57 | <summary lang="te_IN">PVR WMC క్లయింట్</summary> |
59 | 58 | <summary lang="tr_TR">PVR WMC İstemcisi</summary> |
60 | 59 | <summary lang="uk_UA">Клієнт PVR WMC</summary> |
61 | 60 | <summary lang="zh_CN">WMC PVR 客户端</summary> |
61 | <summary lang="zh_TW">PVR WMC用戶端</summary> | |
62 | 62 | <description lang="af_ZA">@OS@ @ARCHITECTURE@ Weergawe. 'n PVR kliënt om met Windows Media Center Recording en EPG dienste te skakel. Dankie vir Tomba73 en Hoopsdavis. Spesiale dankie aan DBurckh.</description> |
63 | <description lang="bg_BG">@OS@ @ARCHITECTURE@ издание. ПВР клиент, който работи с услугите на Windows Media Center за записване и електронния програмен справочник. Благодарение на Tomba73 и Hoopsdavis. Специални благодарности на DBurckh.</description> | |
64 | <description lang="cs_CZ">Edice pro @OS@ @ARCHITECTURE@. PVR klient pro použití nahrávacích a EPG služeb Windows Media Centra. Díky pro Tomba73 a Hoopsdavis. Speciální díky pro DBurckh.</description> | |
63 | <description lang="bg_BG">Издание за @OS@ – @ARCHITECTURE@. Клиент за ПВР, който работи с услугите на „Windows Media Center“ за записване и електронен програмен справочник. Благодарности на Tomba73 и Hoopsdavis. Специални благодарности на DBurckh.</description> | |
64 | <description lang="cs_CZ">Edice pro @OS@ @ARCHITECTURE@. Klient PVR pro rozhraní služeb nahrávání a televezního programu Windows Media Centra. Díky pro Tomba73 a Hoopsdavis. Speciální díky pro DBurckh.</description> | |
65 | 65 | <description lang="da_DK">@OS@ @ARCHITECTURE@ VERSION. En PVR klient der interagere med Windows Media Centers optagelse og EPG services. Tak til Tomba73 og Hoopsdavis. En speciel tak til DBurckh.</description> |
66 | 66 | <description lang="de_DE">@OS@ @ARCHITECTURE@ Edition. Ein PVR-Client zur Verknüpfung mit den Aufnahme- und EPG-Diensten des Windows Media Centers. Dank an Tomba73 und Hoopsdavis. Besonderer Dank an DBurckh.</description> |
67 | 67 | <description lang="el_GR">Έκδοση @OS@ @ARCHITECTURE@. Ένας πελάτης PVR για διασύνδεση με τις υπηρεσίες Εγγραφής και EPG του Windows Media Center. Ευχαριστούμε τους Tomba73 και Hoopsdavis. Ένα ιδιαίτερο ευχαριστώ στον DBurckh.</description> |
71 | 71 | <description lang="en_US">@OS@ @ARCHITECTURE@ Edition. A PVR client to interface with Windows Media Center's Recording and EPG services. Thanks to Tomba73 and Hoopsdavis. Special thanks to DBurckh.</description> |
72 | 72 | <description lang="es_AR">Edición @OS@ @ARCHITECTURE@. Un cliente A PVR para interactuar con los servicios Recording & EPG de Windows Media Center. Gracias a Tomba73 y Hoopsdavis. Agradecimientos especiales a DBurckh.</description> |
73 | 73 | <description lang="es_ES">Edición @OS@ @ARCHITECTURE@. Un cliente PVR que hace de interface con los servicios de grabación y EPG de Windows Media Center. Agradecimientos a Tomba73 y Hoopsdavis. Agradecimientos especiales a DBurckh.</description> |
74 | <description lang="fi_FI">@OS@ @ARCHITECTURE@ -versio. Tämä PVR-lisäosa toimii Windows Media Centerin kanssa. Kiitokset Tomba 73:lle ja Hoopsdavisille. Erityiskiitokset DBurckhille.</description> | |
75 | <description lang="fr_CA">Édition @ARCHITECTURE@ @SE@. Un client de numériscope pour interfacer avec les services d'enregistrement et de GÉP du Centre Multimédia Windows. Merci à Tomba73 et Hoopsdavis. Un grand merci à DBurckh.</description> | |
74 | <description lang="es_MX">@OS@ @ARCHITECTURE@ Edition. Un cliente PVR para interactuar con los servicios de Grabación y EPG de Windows Media Center. Gracias a Tomba73 y Hoopsdavis. Gracias especiales a DBurckh.</description> | |
75 | <description lang="fi_FI">@OS@ @ARCHITECTURE@ -versio. Tämä PVR-asiakasohjelma on tarkoitettu käytettäväksi yhdessä Windows Media Centerin kanssa. Kiitokset Tomba 73:lle ja Hoopsdavisille. Erityiskiitokset DBurckhille.</description> | |
76 | <description lang="fr_CA">Édition @ARCHITECTURE@ @SE@. Un client de numériscope pour interfacer avec les services d’enregistrement et de GÉP du Centre Multimédia Windows. Merci à Tomba73 et Hoopsdavis. Un grand merci à DBurckh.</description> | |
76 | 77 | <description lang="fr_FR">Édition @OS@ @ARCHITECTURE@. Un client enregistreur vidéo (PVR) s'interfaçant avec les services d'enregistrement et de guide électronique des programmes TV de Windows Media Center. Merci à Tomba73 et Hoopsdavis. Un merci spécial à DBurckh.</description> |
77 | 78 | <description lang="gl_ES">Edición @OS@ @ARCHITECTURE@. Un cliente PVR para os servizos de Gravación e Guía do Windows Media Center. Grazas a Tomba73 e Hoopsdavis. Grazas especiais a DBurckh.</description> |
78 | 79 | <description lang="he_IL">גרסת @OS@ @ARCHITECTURE@. לקוח טלוויזיה חיה של Windows Media Center. תומך בהזרמת שידורים חיים והקלטות, הצגת לוח שידורים ותזמון הקלטות.</description> |
79 | 80 | <description lang="hr_HR">@OS@ @ARCHITECTURE@ izdanje. PVR klijent za povezivanje sa snimanjima i EPG uslugom Windows Media Centra.. Zahvaljujemo Tomba73 i Hoopsdavis. Posebna zahvala DBurckh.</description> |
80 | 81 | <description lang="hu_HU">@OS@ @ARCHITECTURE@ Kiadás. Egy PVR kliens a Windows Media Center felvételeihez és EPG szolgáltatáshoz. Köszönet: JeffreyF, Tomba73, Hoopsdavis. Különleges köszönet: DBurckh.</description> |
81 | 82 | <description lang="id_ID">Edisi @OS@ @ARCHITECTURE@. Sebuah klien PVR untuk berhubungan dengan Perekaman Windows Media Center dan layanan EPG. Terimakasih untuk Tomba73 dan Hoopsdavis. Terimakasih khusus untuk DBurckh.</description> |
82 | <description lang="is_IS">@OS@ @ARCHITECTURE@ Útgáfa. PVR Biðlari til að tala við Windows Media Center's Upptöku og rafræna dagskrárþjónustur. Þakkir fá Tomba73 og Hoopsdavis. Sérstakar þakkir fær DBurckh.</description> | |
83 | <description lang="is_IS">@OS@ @ARCHITECTURE@ útgáfa. PVR-biðlari til að tala við Windows Media Center's upptöku og rafræna dagskrárþjónustur. Þakkir fá Tomba73 og Hoopsdavis. Sérstakar þakkir fær DBurckh.</description> | |
83 | 84 | <description lang="it_IT">Edizione @OS@ @ARCHITECTURE@. Un client PVR per interfacciarsi con i servizi di registrazione ed EPG di Windows Media Center. Grazie a Tomba73 e Hoopsdavis. Un ringraziamento speciale a DBurckh.</description> |
84 | 85 | <description lang="ko_KR">@OS@ @ARCHITECTURE@ Edition. Windows Media Center의 녹화 및 EPG 서비스와 연결되는 PVR 클라이언트입니다. Tomba73 과 Hoopsdavis 에게 감사드립니다. DBurckh 에게 특별한 감사의 말을 남깁니다.</description> |
85 | 86 | <description lang="lt_LT">@OS@ @ARCHITECTURE@ leidimas. PVR kliento sąsaja su Windows Media Center's įrašymo ir EPG paslaugomis. Dėkojame Tomba73 ir Hoopsdavis. Ypatingai ačiū DBurckh.</description> |
89 | 90 | <description lang="mt_MT">Edizzjoni @OS@ @ARCHITECTURE@. Klijent tal-PVR biex jikkoordina mas-servizzi ta rekording u EPG tal- Windows Media Centre. Grazzi lil Tomba73 u lil Hoopsdavis. Grazzi b'mod speċjali lil DBurckh.</description> |
90 | 91 | <description lang="nb_NO">@OS@ @ARCHITECTURE@ Versjon. En PVR-klient som gir grensesnitt med Windows Mediasenters opptak og EPG-tjenester. Takk til Tomba73 og Hoopsdavis. Spesiellt takk til DBurckh</description> |
91 | 92 | <description lang="nl_NL">@OS@ @ARCHITECTUUR@ Editie. Een PVR-cliënt om te samen te werken met Windows Mediacenters opname en EPG-diensten, dank aan Tomba73 and Hoopsdavis. Speciale dank gaat uit naar DBurckh.</description> |
92 | <description lang="pl_PL">Edycja dla @OS@ @ARCHITECTURE@. Klient telewizji dla Windows Media Center. Podziękowania dla Tomba73 i Hoopsdavis. Specjalne podziękowania dla DBurckh.</description> | |
93 | <description lang="pl_PL">Edycja dla @OS@ @ARCHITECTURE@. Klient telewizji dla Windows Media Center i usług przewodnika telewizyjnego. Podziękowania dla Tomba73 i Hoopsdavis. Specjalne podziękowania dla DBurckh.</description> | |
93 | 94 | <description lang="pt_BR">Edição @OS@ @ARCHITECTURE@. Um cliente de PVR para fazer a ponte com recurso de gravação e serviços de EPG do Windows Media Center. Obrigado Tomba73 e Hoopsdavis. Agradecimento Especial a DBurckh.</description> |
94 | 95 | <description lang="pt_PT">Edição @OS@ @ARCHITECTURE@. Um cliente de PVR para fazer a interface com a gravação e serviços de EPG do Windows Media Center. Obrigado a Tomba73 e Hoopsdavis. Um agradecimento especial a DBurckh.</description> |
95 | 96 | <description lang="ro_RO">Ediția @OS@ @ARCHITECTURE@. Un client PVR client pentru conectarea cu înregistrările și serviciile EPG ale Windows Media Center. Mulțumiri lui Tomba73 și Hoopsdavis. Mulțumiri speciale lui DBurckh.</description> |
99 | 100 | <description lang="sr_RS">@OS@ARCHITECTURE@ издање. PVR клијент за повезивање са Windows Media Center сервисима снимања и EPG . Хвала Tomba73 и Hoopsdavis. Посебно хвала DBurckh.</description> |
100 | 101 | <description lang="sr_RS@latin">@OS@ @ARCHITECTURE@ izdanje. PVR klijent za povezivanje sa Windows Media Center servisima snimanja i EPG. Hvala Tomba73 i Hoopsdavis. Posebno hvala DBurckh.</description> |
101 | 102 | <description lang="sv_SE">@OS@ @ARCHITECTURE@ Utgåva. En PVR-klient för att hantera Windows Media Centers inspelnings- och EPG-tjänst. Tack till Tomba73 och Hoopsdavis. Speciellt tack till DBurckh.</description> |
103 | <description lang="szl">Edycyjŏ dlŏ @ÔS@ @ARCHITECTURE@. Klijynt telewizyje dlŏ Windows Mydia Center. Podziyńkowania dlŏ Tomba73 i Hoopsdavis. Ekstra podziyńkowania dlŏ DBurckh.</description> | |
102 | 104 | <description lang="te_IN">@ OS @ @ ఆర్కిటెక్చర్ @ ఎడిషన్. PVR క్లయింట్ విండోస్ మీడియా సెంటర్ యొక్క రికార్డింగ్ మరియు EPG సేవలు ఇంటర్ఫేస్. Tomba73 మరియు Hoopsdavis ధన్యవాదాలు. DBurckh ప్రత్యేక ధన్యవాదాలు.</description> |
103 | 105 | <description lang="tr_TR">@OS@ @ARCHITECTURE@ Sürümü. Windows Media Center ve EPG hizmetleri ile arayüz oluşturmak üzere bir PVR istemcisi. Tomba73 ve Hoopsdavis'e teşekkürler. Özel teşekkürlerimiz: DBurckh'a.</description> |
104 | 106 | <description lang="zh_CN">@OS@ @ARCHITECTURE@ 版。针对 Windows 媒体中心录像和电子节目单服务的 PVR 客户端界面。感谢 Tomba73 和 Hoopsdavis,特别感谢 DBurckh。</description> |
107 | <description lang="zh_TW">@OS@ @ARCHITECTURE@ Edition. 為與Windows Media Center的錄影及電子節目表服務界接而開發的用戶端軟體。感謝Tomba73及Hoopsdavis。特別鳴謝DBurckh。</description> | |
105 | 108 | <disclaimer lang="af_ZA">Hierdie is eksperimentele sagteware. Gebruik op jou eie risiko.</disclaimer> |
106 | 109 | <disclaimer lang="bg_BG">Това е експериментален софтуер. Ползвайте го на свой собствен риск.</disclaimer> |
107 | <disclaimer lang="cs_CZ">Toto je experimentální software. Použití je na vlastní riziko.</disclaimer> | |
110 | <disclaimer lang="ca_ES">Aquest és programari experimental. Utilitzeu-lo sota la vostra responsabilitat.</disclaimer> | |
111 | <disclaimer lang="cs_CZ">Toto je experimentální software. Používejte na vlastní riziko.</disclaimer> | |
112 | <disclaimer lang="cy_GB">Meddalwedd arbrofol yw hon. Defnyddiwch gyda synnwyr cyffredin.</disclaimer> | |
108 | 113 | <disclaimer lang="da_DK">Dette er software under udvikling. Brug på eget ansvar.</disclaimer> |
109 | 114 | <disclaimer lang="de_DE">Dies ist eine experimentelle Software. Benutzung auf eigene Gefahr.</disclaimer> |
110 | 115 | <disclaimer lang="el_GR">Δοκιμαστική εφαρμογή. Χρησιμοποιήστε τη υπ' ευθύνη σας.</disclaimer> |
115 | 120 | <disclaimer lang="es_AR">Este software es experimental. Úselo bajo su propio riesgo.</disclaimer> |
116 | 121 | <disclaimer lang="es_ES">Es un programa experimental. Úsalo bajo tu responsabilidad.</disclaimer> |
117 | 122 | <disclaimer lang="es_MX">Este es software experimental. Usalo bajo tu propio riesgo.</disclaimer> |
118 | <disclaimer lang="fi_FI">Tämä on kokeellista ohjelmistoa. Käytä omalla vastuulla.</disclaimer> | |
123 | <disclaimer lang="fi_FI">Tämä on epävakaa ohjelma! Sen tekijät eivät ole millään muotoa vastuussa epäonnistuneista tallennuksista, virheellisistä ajastuksista, haaskatusta ajasta, verenpaineen noususta tai mistään muusta epäsuotuisasta vaikutuksesta.</disclaimer> | |
119 | 124 | <disclaimer lang="fr_CA">Ce logiciel est expérimental. Utilisez à vos propres risques.</disclaimer> |
120 | 125 | <disclaimer lang="fr_FR">Logiciel expérimental. À utiliser à vos risques et périls.</disclaimer> |
121 | 126 | <disclaimer lang="gl_ES">Aínda se está no desenvolvemento. Usar baixo o seu propio risco.</disclaimer> |
137 | 142 | <disclaimer lang="pl_PL">Oprogramowanie nadal jest w fazie rozwoju i jest niestabilne! Autorzy w żaden sposób nie są odpowiedzialni za nieudane nagrania, błędy w harmonogramie nagrań, zmarnowany czas ani jakiekolwiek inne niepożądane efekty.</disclaimer> |
138 | 143 | <disclaimer lang="pt_BR">Este é um trabalho em progresso. Use a seu próprio risco</disclaimer> |
139 | 144 | <disclaimer lang="pt_PT">Este software é experimental. Use-o por sua conta e risco.</disclaimer> |
140 | <disclaimer lang="ro_RO">Acesta este software experimental. Folosiți-l pe riscul dumneavoastră.</disclaimer> | |
145 | <disclaimer lang="ro_RO">Această parte din program nu este stabilă. Folosiți-o pe riscul dumneavoastră.</disclaimer> | |
141 | 146 | <disclaimer lang="ru_RU">Это экспериментальное ПО. Используйте под свою ответственность.</disclaimer> |
142 | 147 | <disclaimer lang="sk_SK">Toto je experimentálny softvér. Používajte ho preto na vlastné riziko.</disclaimer> |
143 | 148 | <disclaimer lang="sl_SI">To je eksperimentalna programska oprema. Uporaba na lastno odgovornost.</disclaimer> |
144 | 149 | <disclaimer lang="sr_RS">Ово је експериментални софтвер. Користите на свој ризик.</disclaimer> |
145 | 150 | <disclaimer lang="sr_RS@latin">Ovo je eksperimentalni softver. Koristite na svoj rizik.</disclaimer> |
146 | 151 | <disclaimer lang="sv_SE">Detta är en experimentell mjukvara. Används på egen risk.</disclaimer> |
152 | <disclaimer lang="szl">Software durch je w fazie rozrostu i je niysztabilne! Autory w żŏdyn knif niy sōm ôdpedzialni za niypodarzōne nagrania, felery w harmōnogramie nagrań, stracōny czŏs ani jaki ino inksze niynazdane efekty.</disclaimer> | |
147 | 153 | <disclaimer lang="te_IN">ఈ ప్రయోగాత్మక సాఫ్ట్వేర్. మీ స్వంత పూచీకత్తుతో ఉపయోగించండి.</disclaimer> |
148 | 154 | <disclaimer lang="tr_TR">Bu deneysel bir yazılımdır. Kullanım riski kendi sorumluluğunuzdadır.</disclaimer> |
149 | 155 | <disclaimer lang="uk_UA">Це експериментальне програмне забезпечення. Використовуйте на свій страх і ризик.</disclaimer> |
150 | 156 | <disclaimer lang="zh_CN">试验性软件,使用风险自担。</disclaimer> |
151 | <disclaimer lang="zh_TW">這是開發中的工作。使用上您須自行考慮到可能有的風險。</disclaimer> | |
157 | <disclaimer lang="zh_TW">這是開發中的軟體。使用上您須自行考慮到可能有的風險。</disclaimer> | |
152 | 158 | <platform>@PLATFORM@</platform> |
153 | 159 | </extension> |
154 | 160 | </addon> |
0 | 2.4.5 | |
1 | - Update build sytem version | |
2 | - Update addon interface header usage | |
3 | ||
4 | 2.4.4 | |
5 | - implemented GetRecordingEdl | |
6 | ||
7 | 2.4.0 | |
8 | - implemented GetStreamTimes, removed BufferTime functions | |
9 | ||
10 | 2.3.0 | |
11 | - Updated to PVR addon API v5.10.0 | |
12 | ||
13 | 2.2.6 | |
14 | - Updated to PVR addon API v5.9.0 | |
15 | ||
16 | 2.2.0 | |
17 | - Updated to PVR addon API v5.7.0 | |
18 | ||
19 | 2.1.0 | |
20 | - Updated to PVR addon API v5.3.0 | |
21 | ||
22 | 2.0.5 | |
23 | - Remove of never used addon interface function | |
24 | ||
25 | 2.0.4 | |
26 | - Update Debian package control | |
27 | - PVR addon callback way changes | |
28 | ||
29 | 2.0.3 | |
30 | - Removed old no more needed version functions | |
31 | ||
32 | 2.0.2 | |
33 | - Set dependency versions automatic during build | |
34 | - Removed never used kodi to addon functions | |
35 | - Build system fixes | |
36 | ||
37 | 2.0.1 | |
38 | - Updated Language files from Transifex | |
39 | ||
40 | 2.0.0 | |
41 | - Initial Kodi v18 version | |
42 | ||
0 | 43 | 1.4.4 |
1 | 44 | - Updated Language files from Transifex |
2 | 45 |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
55 | 55 | msgid "Anytime" |
56 | 56 | msgstr "በማንኛውም ጊዜ" |
57 | 57 | |
58 | msgctxt "#30120" | |
59 | msgid "Delete Timer" | |
60 | msgstr "መቁጠሪያውን ማጥፊያ" | |
61 | ||
58 | 62 | msgctxt "#30122" |
59 | 63 | msgid "Delete the entire series" |
60 | 64 | msgstr "በጠቅላላ ተከታታዩን ማጥፊያ" |
65 | ||
66 | msgctxt "#30131" | |
67 | msgid "One time (manual)" | |
68 | msgstr "አንድ ጊዜ (በ እጅ)" | |
69 | ||
70 | msgctxt "#30132" | |
71 | msgid "One time (guide)" | |
72 | msgstr "አንድ ጊዜ (መምሪያ)" | |
61 | 73 | |
62 | 74 | msgctxt "#30140" |
63 | 75 | msgid "Normal" |
70 | 82 | msgctxt "#30142" |
71 | 83 | msgid "Low" |
72 | 84 | msgstr "ዝቅተኛ " |
85 | ||
86 | msgctxt "#30152" | |
87 | msgid "Live Only" | |
88 | msgstr "በቀጥታ የሚተላለፍ ብቻ" | |
89 | ||
90 | msgctxt "#30160" | |
91 | msgid "Not Set" | |
92 | msgstr "አልተሰናዳም" | |
93 | ||
94 | msgctxt "#30165" | |
95 | msgid "Keep For 1 Week" | |
96 | msgstr "ለ 1 ሳምንት ማቆያ" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
17 | 17 | |
18 | 18 | msgctxt "#30000" |
19 | 19 | msgid "Server Hostname or IP" |
20 | msgstr "Хост или IP адрес на сървъра" | |
20 | msgstr "Име на хоста или IP адрес на сървъра" | |
21 | 21 | |
22 | 22 | msgctxt "#30001" |
23 | 23 | msgid "Keep IP address to 127.0.0.1, if server is running on this same system" |
24 | msgstr "Нека IP адреса бъде 127.0.0.1, ако сървъра работи на същата система" | |
24 | msgstr "IP адресът да бъде 127.0.0.1, ако сървърът работи на същата система" | |
25 | 25 | |
26 | 26 | msgctxt "#30002" |
27 | 27 | msgid "Port Number" |
29 | 29 | |
30 | 30 | msgctxt "#30003" |
31 | 31 | msgid "Stream timeout, unknown problem" |
32 | msgstr "Времето за изчакване на потока изтече. Неизвестен проблем" | |
32 | msgstr "Времето за изчакване на потока изтече. Има неизвестен проблем." | |
33 | 33 | |
34 | 34 | msgctxt "#30004" |
35 | 35 | msgid "No video data found on this channel" |
61 | 61 | |
62 | 62 | msgctxt "#30011" |
63 | 63 | msgid "Can't start, tuner is no longer available" |
64 | msgstr "Не може да започне. Тунерът вече не наличен." | |
64 | msgstr "Стартирането е невъзможно. Тунерът вече не наличен." | |
65 | 65 | |
66 | 66 | msgctxt "#30012" |
67 | 67 | msgid "Channel content is protected" |
73 | 73 | |
74 | 74 | msgctxt "#30014" |
75 | 75 | msgid "Enable SignalStatus calls" |
76 | msgstr "Включи проверките за състояние на сигнала" | |
76 | msgstr "Проверки на състоянието на сигнала" | |
77 | 77 | |
78 | 78 | msgctxt "#30015" |
79 | 79 | msgid "Refresh SignalStatus Interval (sec)" |
80 | msgstr "Интервал за проверка на състоянието на сигнала (с)" | |
80 | msgstr "Интервал за проверка на състоянието на сигнала (сек)" | |
81 | 81 | |
82 | 82 | msgctxt "#30016" |
83 | 83 | msgid "Store Resume/Watched status on server" |
84 | msgstr "Пази информация за Възобновяване/Гледано на сървъра" | |
84 | msgstr "Пазене не инф. за възобновяване/изгледано на сървъра" | |
85 | 85 | |
86 | 86 | msgctxt "#30017" |
87 | 87 | msgid "Recorded TV folder not found" |
89 | 89 | |
90 | 90 | msgctxt "#30018" |
91 | 91 | msgid "Recorded TV folder cannot be opened" |
92 | msgstr "Папката със записана Тв не може да бъде отворена" | |
92 | msgstr "Папката със записана ТВ не може да бъде отворена" | |
93 | 93 | |
94 | 94 | msgctxt "#30019" |
95 | 95 | msgid "ServerWMC version update is available (%s)" |
96 | msgstr "Налична е актуализация на ServerWMC (%s)" | |
96 | msgstr "Налична е актуализация на сървър WMC (%s)" | |
97 | 97 | |
98 | 98 | msgctxt "#30020" |
99 | 99 | msgid "All tuners for this channel are busy" |
113 | 113 | |
114 | 114 | msgctxt "#30024" |
115 | 115 | msgid "Recording stream exited early" |
116 | msgstr "Потока за запис приключи преждевременно" | |
116 | msgstr "Потокът за запис приключи преждевременно" | |
117 | 117 | |
118 | 118 | msgctxt "#30025" |
119 | 119 | msgid "Use WakeOnLAN to wake up server" |
120 | msgstr "Използвай събуждане по LAN, за да събудиш сървъра" | |
120 | msgstr "Да се използва включване по LAN за събуждане на сървъра" | |
121 | 121 | |
122 | 122 | msgctxt "#30026" |
123 | 123 | msgid "Sending WakeOnLAN to server..." |
124 | msgstr "Изпращане на събуждане по LAN към сървъра..." | |
124 | msgstr "Изпращане на сигнал за включване по LAN към сървъра…" | |
125 | 125 | |
126 | 126 | msgctxt "#30027" |
127 | 127 | msgid "Time drift between client and backend of %s minutes" |
133 | 133 | |
134 | 134 | msgctxt "#30101" |
135 | 135 | msgid "Record this episode only" |
136 | msgstr "Запиши само този епизод" | |
136 | msgstr "Запис само на този епизод" | |
137 | 137 | |
138 | 138 | msgctxt "#30102" |
139 | 139 | msgid "Record the series" |
140 | msgstr "Запиши сериала" | |
140 | msgstr "Запис на сериала" | |
141 | 141 | |
142 | 142 | msgctxt "#30103" |
143 | 143 | msgid "Show type:" |
144 | msgstr "Покажи следните видове:" | |
144 | msgstr "Да се показват:" | |
145 | 145 | |
146 | 146 | msgctxt "#30104" |
147 | 147 | msgid "New and rerun" |
169 | 169 | |
170 | 170 | msgctxt "#30111" |
171 | 171 | msgid "Anytime" |
172 | msgstr "Всеки път" | |
172 | msgstr "По всяко време" | |
173 | 173 | |
174 | 174 | msgctxt "#30120" |
175 | 175 | msgid "Delete Timer" |
176 | msgstr "Изтрий брояча" | |
176 | msgstr "Изтриване на брояча" | |
177 | 177 | |
178 | 178 | msgctxt "#30121" |
179 | 179 | msgid "Delete this episode timer only" |
180 | msgstr "Изтрий само брояча на този епизод" | |
180 | msgstr "Изтриване на брояча само за този епизод" | |
181 | 181 | |
182 | 182 | msgctxt "#30122" |
183 | 183 | msgid "Delete the entire series" |
184 | msgstr "Изтрий целия сериал" | |
184 | msgstr "Изтриване на целия сериал" | |
185 | ||
186 | msgctxt "#30130" | |
187 | msgid "Created by Repeating Timer" | |
188 | msgstr "Създадено от повтарящ се брояч" | |
189 | ||
190 | msgctxt "#30131" | |
191 | msgid "One time (manual)" | |
192 | msgstr "Еднократно (ръчно)" | |
193 | ||
194 | msgctxt "#30132" | |
195 | msgid "One time (guide)" | |
196 | msgstr "Еднократно (справочник)" | |
197 | ||
198 | msgctxt "#30133" | |
199 | msgid "One time (wishlist)" | |
200 | msgstr "Еднократно (списък с желания)" | |
201 | ||
202 | msgctxt "#30134" | |
203 | msgid "Repeating (manual)" | |
204 | msgstr "Повтаряемо (ръчно)" | |
205 | ||
206 | msgctxt "#30135" | |
207 | msgid "Repeating (guide)" | |
208 | msgstr "Повтаряемо (справочник)" | |
209 | ||
210 | msgctxt "#30136" | |
211 | msgid "Repeating (wishlist)" | |
212 | msgstr "Повтаряемо (списък с желания)" | |
185 | 213 | |
186 | 214 | msgctxt "#30140" |
187 | 215 | msgid "Normal" |
195 | 223 | msgid "Low" |
196 | 224 | msgstr "Ниско" |
197 | 225 | |
226 | msgctxt "#30150" | |
227 | msgid "New Episodes Only" | |
228 | msgstr "Само нови епизоди" | |
229 | ||
230 | msgctxt "#30151" | |
231 | msgid "New and Rerun Episodes" | |
232 | msgstr "Нови епизоди и повторения" | |
233 | ||
234 | msgctxt "#30152" | |
235 | msgid "Live Only" | |
236 | msgstr "Само на живо" | |
237 | ||
198 | 238 | msgctxt "#30160" |
199 | 239 | msgid "Not Set" |
200 | msgstr "Няма поредица" | |
240 | msgstr "Не е зададено" | |
241 | ||
242 | msgctxt "#30161" | |
243 | msgid "Keep Latest Recordings" | |
244 | msgstr "Съхраняване на последните записи" | |
245 | ||
246 | msgctxt "#30162" | |
247 | msgid "Keep Until I Watch" | |
248 | msgstr "Съхраняване докато не бъдат изгледани" | |
249 | ||
250 | msgctxt "#30163" | |
251 | msgid "Keep Until Space Needed" | |
252 | msgstr "Съхраняване докато няма недостиг на място" | |
253 | ||
254 | msgctxt "#30164" | |
255 | msgid "Keep Until I Delete" | |
256 | msgstr "Съхраняване докато не бъдат изтрити" | |
257 | ||
258 | msgctxt "#30165" | |
259 | msgid "Keep For 1 Week" | |
260 | msgstr "Съхраняване за 1 седмица" | |
261 | ||
262 | msgctxt "#30170" | |
263 | msgid "Keep As Many As Possible" | |
264 | msgstr "Съхраняване на възможно най-много" | |
265 | ||
266 | msgctxt "#30171" | |
267 | msgid "Keep 1 Recording" | |
268 | msgstr "Съхраняване на 1 запис" | |
269 | ||
270 | msgctxt "#30172" | |
271 | msgid "Keep 2 Recordings" | |
272 | msgstr "Съхраняване на 2 записа" | |
273 | ||
274 | msgctxt "#30173" | |
275 | msgid "Keep 3 Recordings" | |
276 | msgstr "Съхраняване на 3 записа" | |
277 | ||
278 | msgctxt "#30174" | |
279 | msgid "Keep 4 Recordings" | |
280 | msgstr "Съхраняване на 4 записа" | |
281 | ||
282 | msgctxt "#30175" | |
283 | msgid "Keep 5 Recordings" | |
284 | msgstr "Съхраняване на 5 записа" | |
285 | ||
286 | msgctxt "#30176" | |
287 | msgid "Keep 6 Recordings" | |
288 | msgstr "Съхраняване на 6 записа" | |
289 | ||
290 | msgctxt "#30177" | |
291 | msgid "Keep 7 Recordings" | |
292 | msgstr "Съхраняване на 7 записа" | |
293 | ||
294 | msgctxt "#30178" | |
295 | msgid "Keep 10 Recordings" | |
296 | msgstr "Съхраняване на 10 записа" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
17 | 17 | |
18 | 18 | msgctxt "#30000" |
19 | 19 | msgid "Server Hostname or IP" |
20 | msgstr "Nom de màquina o IP del servidor" | |
20 | msgstr "Nom d'amfitrió o IP del servidor" | |
21 | ||
22 | msgctxt "#30001" | |
23 | msgid "Keep IP address to 127.0.0.1, if server is running on this same system" | |
24 | msgstr "Mantén les adreces IP a 127.0.0.1, si el servidor s'està executant en el mateix sistema" | |
21 | 25 | |
22 | 26 | msgctxt "#30002" |
23 | 27 | msgid "Port Number" |
24 | 28 | msgstr "Número de port" |
25 | 29 | |
30 | msgctxt "#30003" | |
31 | msgid "Stream timeout, unknown problem" | |
32 | msgstr "Temps d'expiració de la transmissió, problema desconegut" | |
33 | ||
26 | 34 | msgctxt "#30004" |
27 | 35 | msgid "No video data found on this channel" |
28 | 36 | msgstr "No s'ha trobat vídeo en aquest canal" |
43 | 51 | msgid "Recording file not found" |
44 | 52 | msgstr "Fitxer de l'enregistrament no trobat" |
45 | 53 | |
54 | msgctxt "#30011" | |
55 | msgid "Can't start, tuner is no longer available" | |
56 | msgstr "No es pot iniciar, el sintonitzador ja no està disponible" | |
57 | ||
58 | msgctxt "#30012" | |
59 | msgid "Channel content is protected" | |
60 | msgstr "El contingut del canal està protegit" | |
61 | ||
62 | msgctxt "#30014" | |
63 | msgid "Enable SignalStatus calls" | |
64 | msgstr "Habilita les crides SignalStatus" | |
65 | ||
66 | msgctxt "#30016" | |
67 | msgid "Store Resume/Watched status on server" | |
68 | msgstr "Emmagatzema l'estat reprèn/vist al servidor" | |
69 | ||
70 | msgctxt "#30025" | |
71 | msgid "Use WakeOnLAN to wake up server" | |
72 | msgstr "Utilitza WakeOnLAN per despertar el servidor" | |
73 | ||
74 | msgctxt "#30026" | |
75 | msgid "Sending WakeOnLAN to server..." | |
76 | msgstr "S'està enviant WakeOnLAN al servidor..." | |
77 | ||
46 | 78 | msgctxt "#30100" |
47 | 79 | msgid "Recording Preference" |
48 | 80 | msgstr "Preferència d'enregistrament" |
49 | 81 | |
82 | msgctxt "#30101" | |
83 | msgid "Record this episode only" | |
84 | msgstr "Enregistra únicament aquest episodi" | |
85 | ||
50 | 86 | msgctxt "#30102" |
51 | 87 | msgid "Record the series" |
52 | 88 | msgstr "Enregistra les sèries" |
53 | 89 | |
54 | 90 | msgctxt "#30103" |
55 | 91 | msgid "Show type:" |
56 | msgstr "Tipus de Xou:" | |
92 | msgstr "Tipus de programa de TV:" | |
57 | 93 | |
58 | 94 | msgctxt "#30105" |
59 | 95 | msgid "New only" |
83 | 119 | msgid "Delete Timer" |
84 | 120 | msgstr "Elimina Comptador" |
85 | 121 | |
122 | msgctxt "#30122" | |
123 | msgid "Delete the entire series" | |
124 | msgstr "Suprimeix les sèries completes" | |
125 | ||
126 | msgctxt "#30131" | |
127 | msgid "One time (manual)" | |
128 | msgstr "Un cop (manual)" | |
129 | ||
130 | msgctxt "#30132" | |
131 | msgid "One time (guide)" | |
132 | msgstr "Un cop (guia)" | |
133 | ||
134 | msgctxt "#30134" | |
135 | msgid "Repeating (manual)" | |
136 | msgstr "Repetició" | |
137 | ||
138 | msgctxt "#30135" | |
139 | msgid "Repeating (guide)" | |
140 | msgstr "Repetició (guia)" | |
141 | ||
86 | 142 | msgctxt "#30140" |
87 | 143 | msgid "Normal" |
88 | 144 | msgstr "Normal" |
89 | 145 | |
90 | 146 | msgctxt "#30141" |
91 | 147 | msgid "High" |
92 | msgstr "Màx." | |
148 | msgstr "Alt" | |
93 | 149 | |
94 | 150 | msgctxt "#30142" |
95 | 151 | msgid "Low" |
96 | msgstr "Mín." | |
152 | msgstr "Baix" | |
153 | ||
154 | msgctxt "#30150" | |
155 | msgid "New Episodes Only" | |
156 | msgstr "Únicament els episodis nous" | |
157 | ||
158 | msgctxt "#30152" | |
159 | msgid "Live Only" | |
160 | msgstr "Només en directe" | |
161 | ||
162 | msgctxt "#30160" | |
163 | msgid "Not Set" | |
164 | msgstr "Sense establir" | |
165 | ||
166 | msgctxt "#30161" | |
167 | msgid "Keep Latest Recordings" | |
168 | msgstr "Mantén els últims enregistraments" | |
169 | ||
170 | msgctxt "#30162" | |
171 | msgid "Keep Until I Watch" | |
172 | msgstr "Mantén fins que el miri" | |
173 | ||
174 | msgctxt "#30163" | |
175 | msgid "Keep Until Space Needed" | |
176 | msgstr "Mantén fins que es necessiti espai" | |
177 | ||
178 | msgctxt "#30164" | |
179 | msgid "Keep Until I Delete" | |
180 | msgstr "Mantén fins que l'elimini" | |
181 | ||
182 | msgctxt "#30165" | |
183 | msgid "Keep For 1 Week" | |
184 | msgstr "Mantén durant 1 setmana" | |
185 | ||
186 | msgctxt "#30170" | |
187 | msgid "Keep As Many As Possible" | |
188 | msgstr "Mantén tant com puguis" | |
189 | ||
190 | msgctxt "#30171" | |
191 | msgid "Keep 1 Recording" | |
192 | msgstr "Mantén 1 enregistrament" | |
193 | ||
194 | msgctxt "#30172" | |
195 | msgid "Keep 2 Recordings" | |
196 | msgstr "Mantén 2 enregistraments" | |
197 | ||
198 | msgctxt "#30173" | |
199 | msgid "Keep 3 Recordings" | |
200 | msgstr "Mantén 3 enregistraments" | |
201 | ||
202 | msgctxt "#30174" | |
203 | msgid "Keep 4 Recordings" | |
204 | msgstr "Mantén 4 enregistraments" | |
205 | ||
206 | msgctxt "#30175" | |
207 | msgid "Keep 5 Recordings" | |
208 | msgstr "Mantén 5 enregistraments" | |
209 | ||
210 | msgctxt "#30176" | |
211 | msgid "Keep 6 Recordings" | |
212 | msgstr "Mantén 6 enregistraments" | |
213 | ||
214 | msgctxt "#30177" | |
215 | msgid "Keep 7 Recordings" | |
216 | msgstr "Mantén 7 enregistraments" | |
217 | ||
218 | msgctxt "#30178" | |
219 | msgid "Keep 10 Recordings" | |
220 | msgstr "Mantén 10 enregistraments" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
17 | 17 | |
18 | 18 | msgctxt "#30000" |
19 | 19 | msgid "Server Hostname or IP" |
20 | msgstr "Název serveru nebo IP adresa" | |
20 | msgstr "Název hostitele nebo adresa IP serveru" | |
21 | 21 | |
22 | 22 | msgctxt "#30001" |
23 | 23 | msgid "Keep IP address to 127.0.0.1, if server is running on this same system" |
24 | msgstr "Pokud server běží na stejném systému, ponechte IP adresu 127.0.0.1" | |
24 | msgstr "Pokud server běží na stejném systému, ponechte adresu IP 127.0.0.1" | |
25 | 25 | |
26 | 26 | msgctxt "#30002" |
27 | 27 | msgid "Port Number" |
29 | 29 | |
30 | 30 | msgctxt "#30003" |
31 | 31 | msgid "Stream timeout, unknown problem" |
32 | msgstr "Stream timeout, neznámý problém" | |
32 | msgstr "Časový limit datového proudu, neznámý problém" | |
33 | 33 | |
34 | 34 | msgctxt "#30004" |
35 | 35 | msgid "No video data found on this channel" |
36 | msgstr "Na tomto kanále nebyla nalezena žádná video data" | |
36 | msgstr "Na tomto kanále nebyla nalezena žádná data videa" | |
37 | 37 | |
38 | 38 | msgctxt "#30005" |
39 | 39 | msgid "Tuner is needed for recording" |
40 | msgstr "Pro nahrávání je nutný TV tuner" | |
40 | msgstr "Pro nahrávání je nutný tuner" | |
41 | 41 | |
42 | 42 | msgctxt "#30006" |
43 | 43 | msgid "Recording delete failed, file in use or write protected" |
44 | msgstr "Smazaní nahrávky se nezdařilo, soubor je používán nebo je chráněn proti zápisu" | |
44 | msgstr "Odstranění nahrávky selhalo, soubor je používán nebo je chráněn proti zápisu" | |
45 | 45 | |
46 | 46 | msgctxt "#30007" |
47 | 47 | msgid "Recording delete failed, recorded file doesn't exist" |
48 | msgstr "Smazaní nahrávky se nezdařilo, soubor se záznamem neexistuje" | |
48 | msgstr "Odstranění nahrávky selhalo, soubor s nahrávkou neexistuje" | |
49 | 49 | |
50 | 50 | msgctxt "#30008" |
51 | 51 | msgid "Recording file not found" |
53 | 53 | |
54 | 54 | msgctxt "#30009" |
55 | 55 | msgid "Alternate channel chosen: " |
56 | msgstr "Vybrán alternativní kanál:" | |
56 | msgstr "Zvolen alternativní kanál:" | |
57 | 57 | |
58 | 58 | msgctxt "#30010" |
59 | 59 | msgid "Alternate time chosen: " |
60 | msgstr "Vybrán alternativí čas:" | |
60 | msgstr "Zvolený alternativní čas:" | |
61 | 61 | |
62 | 62 | msgctxt "#30011" |
63 | 63 | msgid "Can't start, tuner is no longer available" |
64 | msgstr "Nelze spustit, TV tuner není již k dispozici" | |
64 | msgstr "Nelze spustit, tuner už není dostupný" | |
65 | 65 | |
66 | 66 | msgctxt "#30012" |
67 | 67 | msgid "Channel content is protected" |
69 | 69 | |
70 | 70 | msgctxt "#30013" |
71 | 71 | msgid "End time increased by " |
72 | msgstr "Čas ukončení prodloužit o " | |
72 | msgstr "Čas ukončení posunut o " | |
73 | 73 | |
74 | 74 | msgctxt "#30014" |
75 | 75 | msgid "Enable SignalStatus calls" |
81 | 81 | |
82 | 82 | msgctxt "#30016" |
83 | 83 | msgid "Store Resume/Watched status on server" |
84 | msgstr "Uložit čas \"Začít od\" / \"Zhlédnuto\" na serveru" | |
84 | msgstr "Ukládat stav Obnovit a Zhlédnuto na serveru" | |
85 | 85 | |
86 | 86 | msgctxt "#30017" |
87 | 87 | msgid "Recorded TV folder not found" |
88 | msgstr "Složka pro TV nahrávky nenalezena" | |
88 | msgstr "Složka pro nahrávky nebyla nalezena" | |
89 | 89 | |
90 | 90 | msgctxt "#30018" |
91 | 91 | msgid "Recorded TV folder cannot be opened" |
92 | msgstr "Složku pro TV nahrávky nelze otevřít" | |
92 | msgstr "Složku pro nahrávky nelze otevřít" | |
93 | 93 | |
94 | 94 | msgctxt "#30019" |
95 | 95 | msgid "ServerWMC version update is available (%s)" |
96 | msgstr "Pro ServerWMC je k dispozici aktualizace (%s) " | |
96 | msgstr "Pro ServerWMC je dostupná aktualizace (%s) " | |
97 | 97 | |
98 | 98 | msgctxt "#30020" |
99 | 99 | msgid "All tuners for this channel are busy" |
100 | msgstr "Všechny TV tunery pro tento kanál jsou zaneprázdněny" | |
100 | msgstr "Všechny tunery pro tento kanál jsou zaneprázdněny" | |
101 | 101 | |
102 | 102 | msgctxt "#30021" |
103 | 103 | msgid "LiveTV timed-out" |
104 | msgstr "Timeout LiveTV" | |
104 | msgstr "Překročen časový limit živého vysílání" | |
105 | 105 | |
106 | 106 | msgctxt "#30022" |
107 | 107 | msgid "LiveTV error, exited early" |
108 | msgstr "Chyba LiveTV, ukončeno dříve" | |
108 | msgstr "Chyba živého vysílání, ukončeno dříve" | |
109 | 109 | |
110 | 110 | msgctxt "#30023" |
111 | 111 | msgid "Recording stream timed-out" |
112 | msgstr "Timeout nahrávání streamu" | |
112 | msgstr "Překročen časový limit nahrávání datového proudu" | |
113 | 113 | |
114 | 114 | msgctxt "#30024" |
115 | 115 | msgid "Recording stream exited early" |
116 | msgstr "Nahrávání streamu ukončeno dříve" | |
116 | msgstr "Nahrávání datového proudu ukončeno dříve" | |
117 | 117 | |
118 | 118 | msgctxt "#30025" |
119 | 119 | msgid "Use WakeOnLAN to wake up server" |
120 | msgstr "Použít WakeOnLAN k probuzení serveru" | |
120 | msgstr "Server probouzet prostřednictvím sítě (WakeOnLAN)" | |
121 | 121 | |
122 | 122 | msgctxt "#30026" |
123 | 123 | msgid "Sending WakeOnLAN to server..." |
124 | msgstr "Posílám WakeOnLAN na server" | |
124 | msgstr "Odesílání WakeOnLAN na server…" | |
125 | 125 | |
126 | 126 | msgctxt "#30027" |
127 | 127 | msgid "Time drift between client and backend of %s minutes" |
128 | msgstr "Časový posun mezi klientem a backendem v %s minutách" | |
128 | msgstr "Časový posun mezi klientem a serverem o %s minut" | |
129 | 129 | |
130 | 130 | msgctxt "#30100" |
131 | 131 | msgid "Recording Preference" |
137 | 137 | |
138 | 138 | msgctxt "#30102" |
139 | 139 | msgid "Record the series" |
140 | msgstr "Nahrát serii" | |
140 | msgstr "Nahrát sezónu" | |
141 | 141 | |
142 | 142 | msgctxt "#30103" |
143 | 143 | msgid "Show type:" |
145 | 145 | |
146 | 146 | msgctxt "#30104" |
147 | 147 | msgid "New and rerun" |
148 | msgstr "Nové a opakované" | |
148 | msgstr "Nové a reprízované" | |
149 | 149 | |
150 | 150 | msgctxt "#30105" |
151 | 151 | msgid "New only" |
161 | 161 | |
162 | 162 | msgctxt "#30108" |
163 | 163 | msgid "Any Channel" |
164 | msgstr "Každý kanál" | |
164 | msgstr "Jakýkoliv kanál" | |
165 | 165 | |
166 | 166 | msgctxt "#30110" |
167 | 167 | msgid "Airtime:" |
169 | 169 | |
170 | 170 | msgctxt "#30111" |
171 | 171 | msgid "Anytime" |
172 | msgstr "Kdykoli" | |
172 | msgstr "Kdykoliv" | |
173 | 173 | |
174 | 174 | msgctxt "#30120" |
175 | 175 | msgid "Delete Timer" |
176 | msgstr "Smazat časovač" | |
176 | msgstr "Odstranit časovač" | |
177 | 177 | |
178 | 178 | msgctxt "#30121" |
179 | 179 | msgid "Delete this episode timer only" |
181 | 181 | |
182 | 182 | msgctxt "#30122" |
183 | 183 | msgid "Delete the entire series" |
184 | msgstr "Smazat celou řadu" | |
184 | msgstr "Odstranit celou sezónu" | |
185 | 185 | |
186 | 186 | msgctxt "#30130" |
187 | 187 | msgid "Created by Repeating Timer" |
188 | msgstr "Vytvořeno opakovaným časovačem." | |
188 | msgstr "Vytvořeno opakujícím se časovačem" | |
189 | 189 | |
190 | 190 | msgctxt "#30131" |
191 | 191 | msgid "One time (manual)" |
192 | msgstr "Jednou (manuálně)" | |
192 | msgstr "Jednorázově (ručně)" | |
193 | 193 | |
194 | 194 | msgctxt "#30132" |
195 | 195 | msgid "One time (guide)" |
196 | msgstr "Jednou (podle programu)" | |
196 | msgstr "Jednorázově (program)" | |
197 | 197 | |
198 | 198 | msgctxt "#30133" |
199 | 199 | msgid "One time (wishlist)" |
201 | 201 | |
202 | 202 | msgctxt "#30134" |
203 | 203 | msgid "Repeating (manual)" |
204 | msgstr "Opakovaný (manuální)" | |
204 | msgstr "Opakovaný (ručně)" | |
205 | 205 | |
206 | 206 | msgctxt "#30135" |
207 | 207 | msgid "Repeating (guide)" |
208 | msgstr "Opakovaný (podle programu)" | |
208 | msgstr "Opakovaný (program)" | |
209 | 209 | |
210 | 210 | msgctxt "#30136" |
211 | 211 | msgid "Repeating (wishlist)" |
225 | 225 | |
226 | 226 | msgctxt "#30150" |
227 | 227 | msgid "New Episodes Only" |
228 | msgstr "Jen nové epizody" | |
228 | msgstr "Pouze nové epizody" | |
229 | 229 | |
230 | 230 | msgctxt "#30151" |
231 | 231 | msgid "New and Rerun Episodes" |
232 | msgstr "Nové i reprízované epizody" | |
232 | msgstr "Nové a reprízované epizody" | |
233 | 233 | |
234 | 234 | msgctxt "#30152" |
235 | 235 | msgid "Live Only" |
236 | msgstr "Jen živě" | |
236 | msgstr "Pouze živé" | |
237 | 237 | |
238 | 238 | msgctxt "#30160" |
239 | 239 | msgid "Not Set" |
241 | 241 | |
242 | 242 | msgctxt "#30161" |
243 | 243 | msgid "Keep Latest Recordings" |
244 | msgstr "Uchovávat poslední nahrávky" | |
244 | msgstr "Ponechávat nejnovější nahrávky" | |
245 | 245 | |
246 | 246 | msgctxt "#30162" |
247 | 247 | msgid "Keep Until I Watch" |
248 | msgstr "Uchovávat do zhlédnutí" | |
248 | msgstr "Ponechávat do zhlédnutí" | |
249 | 249 | |
250 | 250 | msgctxt "#30163" |
251 | 251 | msgid "Keep Until Space Needed" |
252 | msgstr "Uchovávat dokud není potřeba místo na HDD" | |
252 | msgstr "Ponechávat dokud není potřeba místo" | |
253 | 253 | |
254 | 254 | msgctxt "#30164" |
255 | 255 | msgid "Keep Until I Delete" |
256 | msgstr "Uchovávat do smazání" | |
256 | msgstr "Ponechávat do odstranění" | |
257 | 257 | |
258 | 258 | msgctxt "#30165" |
259 | 259 | msgid "Keep For 1 Week" |
260 | msgstr "Uchovávat po dobu jednoho týdne" | |
260 | msgstr "Ponechávat 1 týden" | |
261 | 261 | |
262 | 262 | msgctxt "#30170" |
263 | 263 | msgid "Keep As Many As Possible" |
264 | msgstr "Uchovávat co nejvíce" | |
264 | msgstr "Ponechávat co nejvíce" | |
265 | 265 | |
266 | 266 | msgctxt "#30171" |
267 | 267 | msgid "Keep 1 Recording" |
268 | msgstr "Uchovávat 1 nahrávku" | |
268 | msgstr "Ponechávat 1 nahrávku" | |
269 | 269 | |
270 | 270 | msgctxt "#30172" |
271 | 271 | msgid "Keep 2 Recordings" |
272 | msgstr "Uchovávat 2 nahrávky" | |
272 | msgstr "Ponechávat 2 nahrávky" | |
273 | 273 | |
274 | 274 | msgctxt "#30173" |
275 | 275 | msgid "Keep 3 Recordings" |
276 | msgstr "Uchovávat 3 nahrávky" | |
276 | msgstr "Ponechávat 3 nahrávky" | |
277 | 277 | |
278 | 278 | msgctxt "#30174" |
279 | 279 | msgid "Keep 4 Recordings" |
280 | msgstr "Uchovávat 4 nahrávky" | |
280 | msgstr "Ponechávat 4 nahrávky" | |
281 | 281 | |
282 | 282 | msgctxt "#30175" |
283 | 283 | msgid "Keep 5 Recordings" |
284 | msgstr "Uchovávat 5 nahrávek" | |
284 | msgstr "Ponechávat 5 nahrávek" | |
285 | 285 | |
286 | 286 | msgctxt "#30176" |
287 | 287 | msgid "Keep 6 Recordings" |
288 | msgstr "Uchovávat 6 nahrávek" | |
288 | msgstr "Ponechávat 6 nahrávek" | |
289 | 289 | |
290 | 290 | msgctxt "#30177" |
291 | 291 | msgid "Keep 7 Recordings" |
292 | msgstr "Uchovávat 7 nahrávek" | |
292 | msgstr "Ponechávat 7 nahrávek" | |
293 | 293 | |
294 | 294 | msgctxt "#30178" |
295 | 295 | msgid "Keep 10 Recordings" |
296 | msgstr "Uchovávat 10 nahrávek" | |
296 | msgstr "Ponechávat 10 nahrávek" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
14 | 14 | "Content-Transfer-Encoding: 8bit\n" |
15 | 15 | "Language: cy_GB\n" |
16 | 16 | "Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" |
17 | ||
18 | msgctxt "#30000" | |
19 | msgid "Server Hostname or IP" | |
20 | msgstr "Enw Cynhaliwr neu IP y Gweinydd" | |
21 | ||
22 | msgctxt "#30001" | |
23 | msgid "Keep IP address to 127.0.0.1, if server is running on this same system" | |
24 | msgstr "Cadwch y cyfeiriad IP yn 127.0.0.1 os bydd gweinydd yn rhedeg ar un system" | |
25 | ||
26 | msgctxt "#30002" | |
27 | msgid "Port Number" | |
28 | msgstr "Rhif y Porth" | |
29 | ||
30 | msgctxt "#30003" | |
31 | msgid "Stream timeout, unknown problem" | |
32 | msgstr "Terfyn amser ffrydio. Gwall anhysbys" | |
33 | ||
34 | msgctxt "#30004" | |
35 | msgid "No video data found on this channel" | |
36 | msgstr "Ni chanfuwyd unrhyw ddata fideo ar y sianel hon" | |
37 | ||
38 | msgctxt "#30005" | |
39 | msgid "Tuner is needed for recording" | |
40 | msgstr "Rhaid cael tiwniwr er mwyn recordio" | |
41 | ||
42 | msgctxt "#30006" | |
43 | msgid "Recording delete failed, file in use or write protected" | |
44 | msgstr "Nid oes modd dileu'r recordiad. Mae'n cael ei ddefnyddio neu y mae wedi'i ddiogelu." | |
45 | ||
46 | msgctxt "#30007" | |
47 | msgid "Recording delete failed, recorded file doesn't exist" | |
48 | msgstr "Nid oes modd dileu'r recordiad. Nid yw'r ffeil yn bodoli" | |
49 | ||
50 | msgctxt "#30008" | |
51 | msgid "Recording file not found" | |
52 | msgstr "Ni chanfuwyd ffeil recordio" | |
53 | ||
54 | msgctxt "#30009" | |
55 | msgid "Alternate channel chosen: " | |
56 | msgstr "Y sianel amgen a ddewiswyd:" | |
57 | ||
58 | msgctxt "#30010" | |
59 | msgid "Alternate time chosen: " | |
60 | msgstr "Yr amser angen a ddewiswyd:" | |
61 | ||
62 | msgctxt "#30011" | |
63 | msgid "Can't start, tuner is no longer available" | |
64 | msgstr "Methu dechrau. Nid yw'r tiwniwr ar gael bellach" | |
65 | ||
66 | msgctxt "#30012" | |
67 | msgid "Channel content is protected" | |
68 | msgstr "Diogelid cynnwys y sianel" | |
17 | 69 | |
18 | 70 | msgctxt "#30101" |
19 | 71 | msgid "Record this episode only" |
35 | 87 | msgid "Delete the entire series" |
36 | 88 | msgstr "Dileu'r gyfres gyfan" |
37 | 89 | |
90 | msgctxt "#30131" | |
91 | msgid "One time (manual)" | |
92 | msgstr "Unwaith (â llaw)" | |
93 | ||
94 | msgctxt "#30132" | |
95 | msgid "One time (guide)" | |
96 | msgstr "Unwaith (gydag arweiniad)" | |
97 | ||
98 | msgctxt "#30134" | |
99 | msgid "Repeating (manual)" | |
100 | msgstr "Ailadrodd (â llaw)" | |
101 | ||
102 | msgctxt "#30135" | |
103 | msgid "Repeating (guide)" | |
104 | msgstr "Ailadrodd (gydag arweiniad)" | |
105 | ||
38 | 106 | msgctxt "#30140" |
39 | 107 | msgid "Normal" |
40 | 108 | msgstr "Normal" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
183 | 183 | msgid "Delete the entire series" |
184 | 184 | msgstr "Delete the entire series" |
185 | 185 | |
186 | msgctxt "#30135" | |
187 | msgid "Repeating (guide)" | |
188 | msgstr "Gentagende (vejledning)" | |
189 | ||
186 | 190 | msgctxt "#30140" |
187 | 191 | msgid "Normal" |
188 | 192 | msgstr "Normal" |
194 | 198 | msgctxt "#30142" |
195 | 199 | msgid "Low" |
196 | 200 | msgstr "Lav" |
201 | ||
202 | msgctxt "#30150" | |
203 | msgid "New Episodes Only" | |
204 | msgstr "Kun nye afsnit" | |
205 | ||
206 | msgctxt "#30165" | |
207 | msgid "Keep For 1 Week" | |
208 | msgstr "Gem i 1 uge" | |
209 | ||
210 | msgctxt "#30171" | |
211 | msgid "Keep 1 Recording" | |
212 | msgstr "Gem 1 optagelse" | |
213 | ||
214 | msgctxt "#30172" | |
215 | msgid "Keep 2 Recordings" | |
216 | msgstr "Gem 2 optagelser" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
27 | 27 | msgid "Port Number" |
28 | 28 | msgstr "Numero de Puerto" |
29 | 29 | |
30 | msgctxt "#30003" | |
31 | msgid "Stream timeout, unknown problem" | |
32 | msgstr "Tiempo de espera de la transmisión, problema desconocido" | |
33 | ||
30 | 34 | msgctxt "#30004" |
31 | 35 | msgid "No video data found on this channel" |
32 | 36 | msgstr "No se encontraron datos de video en este canal " |
63 | 67 | msgid "Channel content is protected" |
64 | 68 | msgstr "El contenido del canal esta protegido" |
65 | 69 | |
70 | msgctxt "#30013" | |
71 | msgid "End time increased by " | |
72 | msgstr "El tiempo de finalización aumentó" | |
73 | ||
74 | msgctxt "#30014" | |
75 | msgid "Enable SignalStatus calls" | |
76 | msgstr "Habilitar llamadas de SignalStatus" | |
77 | ||
78 | msgctxt "#30015" | |
79 | msgid "Refresh SignalStatus Interval (sec)" | |
80 | msgstr "Actualizar el intervalo de SignalStatus (seg)" | |
81 | ||
82 | msgctxt "#30016" | |
83 | msgid "Store Resume/Watched status on server" | |
84 | msgstr "Almacenar estado reanudar/visto en el servidor" | |
85 | ||
86 | msgctxt "#30017" | |
87 | msgid "Recorded TV folder not found" | |
88 | msgstr "Carpeta de TV grabada no encontrada" | |
89 | ||
90 | msgctxt "#30018" | |
91 | msgid "Recorded TV folder cannot be opened" | |
92 | msgstr "No se puede abrir la carpeta de TV grabada" | |
93 | ||
94 | msgctxt "#30019" | |
95 | msgid "ServerWMC version update is available (%s)" | |
96 | msgstr "La actualización de la versión de ServerWMC está disponible (%s)" | |
97 | ||
98 | msgctxt "#30020" | |
99 | msgid "All tuners for this channel are busy" | |
100 | msgstr "Todos los sintonizadores de este canal están ocupados" | |
101 | ||
102 | msgctxt "#30021" | |
103 | msgid "LiveTV timed-out" | |
104 | msgstr "Tiempo de espera de LiveTV" | |
105 | ||
106 | msgctxt "#30022" | |
107 | msgid "LiveTV error, exited early" | |
108 | msgstr "Error de LiveTV, salió temprano" | |
109 | ||
110 | msgctxt "#30023" | |
111 | msgid "Recording stream timed-out" | |
112 | msgstr "Tiempo de espera agotado grabando la transmisión" | |
113 | ||
114 | msgctxt "#30024" | |
115 | msgid "Recording stream exited early" | |
116 | msgstr "La transmisión de grabación salió temprano" | |
117 | ||
118 | msgctxt "#30025" | |
119 | msgid "Use WakeOnLAN to wake up server" | |
120 | msgstr "Utilice WakeOnLAN para activar el servidor" | |
121 | ||
122 | msgctxt "#30026" | |
123 | msgid "Sending WakeOnLAN to server..." | |
124 | msgstr "Enviando WakeOnLAN al servidor ..." | |
125 | ||
126 | msgctxt "#30027" | |
127 | msgid "Time drift between client and backend of %s minutes" | |
128 | msgstr "Desviación de la hora entre el cliente y back-end de %s minutos" | |
129 | ||
130 | msgctxt "#30100" | |
131 | msgid "Recording Preference" | |
132 | msgstr "Preferencia de grabación" | |
133 | ||
66 | 134 | msgctxt "#30101" |
67 | 135 | msgid "Record this episode only" |
68 | 136 | msgstr "Grabar solo este episodio" |
69 | 137 | |
138 | msgctxt "#30102" | |
139 | msgid "Record the series" | |
140 | msgstr "Grabar la serie" | |
141 | ||
142 | msgctxt "#30103" | |
143 | msgid "Show type:" | |
144 | msgstr "Mostrar tipo:" | |
145 | ||
146 | msgctxt "#30104" | |
147 | msgid "New and rerun" | |
148 | msgstr "Nuevo y repetición" | |
149 | ||
150 | msgctxt "#30105" | |
151 | msgid "New only" | |
152 | msgstr "Solo nuevo" | |
153 | ||
154 | msgctxt "#30106" | |
155 | msgid "Live only" | |
156 | msgstr "Solo en vivo" | |
157 | ||
70 | 158 | msgctxt "#30107" |
71 | 159 | msgid "Channel:" |
72 | 160 | msgstr "Canal:" |
73 | 161 | |
162 | msgctxt "#30108" | |
163 | msgid "Any Channel" | |
164 | msgstr "Cualquier canal" | |
165 | ||
166 | msgctxt "#30110" | |
167 | msgid "Airtime:" | |
168 | msgstr "tiempo al aire:" | |
169 | ||
170 | msgctxt "#30111" | |
171 | msgid "Anytime" | |
172 | msgstr "Cualquier hora" | |
173 | ||
174 | msgctxt "#30120" | |
175 | msgid "Delete Timer" | |
176 | msgstr "Borrar temporizador" | |
177 | ||
178 | msgctxt "#30121" | |
179 | msgid "Delete this episode timer only" | |
180 | msgstr "Eliminar sólo este temporizador de episodios" | |
181 | ||
74 | 182 | msgctxt "#30122" |
75 | 183 | msgid "Delete the entire series" |
76 | 184 | msgstr "Eliminar serie completa" |
77 | 185 | |
186 | msgctxt "#30130" | |
187 | msgid "Created by Repeating Timer" | |
188 | msgstr "Creado por el temporizador de repetición" | |
189 | ||
190 | msgctxt "#30131" | |
191 | msgid "One time (manual)" | |
192 | msgstr "Una vez (manual)" | |
193 | ||
194 | msgctxt "#30132" | |
195 | msgid "One time (guide)" | |
196 | msgstr "Una vez (guía)" | |
197 | ||
198 | msgctxt "#30133" | |
199 | msgid "One time (wishlist)" | |
200 | msgstr "Una vez (lista de deseos)" | |
201 | ||
202 | msgctxt "#30134" | |
203 | msgid "Repeating (manual)" | |
204 | msgstr "Repetición (manual)" | |
205 | ||
206 | msgctxt "#30135" | |
207 | msgid "Repeating (guide)" | |
208 | msgstr "Repitiendo (guía)" | |
209 | ||
210 | msgctxt "#30136" | |
211 | msgid "Repeating (wishlist)" | |
212 | msgstr "Repetición (lista de deseos)" | |
213 | ||
78 | 214 | msgctxt "#30140" |
79 | 215 | msgid "Normal" |
80 | 216 | msgstr "Normal" |
86 | 222 | msgctxt "#30142" |
87 | 223 | msgid "Low" |
88 | 224 | msgstr "Bajo" |
225 | ||
226 | msgctxt "#30150" | |
227 | msgid "New Episodes Only" | |
228 | msgstr "Sólo nuevos episodios" | |
229 | ||
230 | msgctxt "#30151" | |
231 | msgid "New and Rerun Episodes" | |
232 | msgstr "Episodios nuevos y de repetición" | |
233 | ||
234 | msgctxt "#30152" | |
235 | msgid "Live Only" | |
236 | msgstr "Solo en vivo" | |
237 | ||
238 | msgctxt "#30160" | |
239 | msgid "Not Set" | |
240 | msgstr "No establecido" | |
241 | ||
242 | msgctxt "#30161" | |
243 | msgid "Keep Latest Recordings" | |
244 | msgstr "Mantener últimas grabaciones" | |
245 | ||
246 | msgctxt "#30162" | |
247 | msgid "Keep Until I Watch" | |
248 | msgstr "Guarda hasta que yo vea" | |
249 | ||
250 | msgctxt "#30163" | |
251 | msgid "Keep Until Space Needed" | |
252 | msgstr "Manténgase hasta que se necesite espacio" | |
253 | ||
254 | msgctxt "#30164" | |
255 | msgid "Keep Until I Delete" | |
256 | msgstr "Mantener hasta borrar" | |
257 | ||
258 | msgctxt "#30165" | |
259 | msgid "Keep For 1 Week" | |
260 | msgstr "Mantenga por 1 semana" | |
261 | ||
262 | msgctxt "#30170" | |
263 | msgid "Keep As Many As Possible" | |
264 | msgstr "Guarda tanto como sea posible" | |
265 | ||
266 | msgctxt "#30171" | |
267 | msgid "Keep 1 Recording" | |
268 | msgstr "Mantener 1 Grabación" | |
269 | ||
270 | msgctxt "#30172" | |
271 | msgid "Keep 2 Recordings" | |
272 | msgstr "Mantener 2 Grabaciones" | |
273 | ||
274 | msgctxt "#30173" | |
275 | msgid "Keep 3 Recordings" | |
276 | msgstr "Mantener 3 Grabaciones" | |
277 | ||
278 | msgctxt "#30174" | |
279 | msgid "Keep 4 Recordings" | |
280 | msgstr "Mantener 4 Grabaciones" | |
281 | ||
282 | msgctxt "#30175" | |
283 | msgid "Keep 5 Recordings" | |
284 | msgstr "Mantener 5 Grabaciones" | |
285 | ||
286 | msgctxt "#30176" | |
287 | msgid "Keep 6 Recordings" | |
288 | msgstr "Mantener 6 Grabaciones" | |
289 | ||
290 | msgctxt "#30177" | |
291 | msgid "Keep 7 Recordings" | |
292 | msgstr "Mantener 7 Grabaciones" | |
293 | ||
294 | msgctxt "#30178" | |
295 | msgid "Keep 10 Recordings" | |
296 | msgstr "Mantener 10 Grabaciones" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
14 | 14 | "Content-Transfer-Encoding: 8bit\n" |
15 | 15 | "Language: eu_ES\n" |
16 | 16 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
17 | ||
18 | msgctxt "#30001" | |
19 | msgid "Keep IP address to 127.0.0.1, if server is running on this same system" | |
20 | msgstr "Mantendu 127.0.0.1 helbidea zerbitzaria zerbitzari berean baldin badago" | |
21 | ||
22 | msgctxt "#30002" | |
23 | msgid "Port Number" | |
24 | msgstr "Atakaren zenbakia" | |
17 | 25 | |
18 | 26 | msgctxt "#30107" |
19 | 27 | msgid "Channel:" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
21 | 21 | |
22 | 22 | msgctxt "#30001" |
23 | 23 | msgid "Keep IP address to 127.0.0.1, if server is running on this same system" |
24 | msgstr "Pidä osoitteena 127.0.0.1, mikäli palvelinta ajetaan samassa järjestelmässä" | |
24 | msgstr "Pidä osoitteena 127.0.0.1, jos palvelinta ajetaan samassa järjestelmässä" | |
25 | 25 | |
26 | 26 | msgctxt "#30002" |
27 | 27 | msgid "Port Number" |
29 | 29 | |
30 | 30 | msgctxt "#30003" |
31 | 31 | msgid "Stream timeout, unknown problem" |
32 | msgstr "Virtautus aikakatkaistiin, tunnistamaton ongelma" | |
32 | msgstr "Suoratoiston aikakatkaisu, tuntematon ongelma" | |
33 | 33 | |
34 | 34 | msgctxt "#30004" |
35 | 35 | msgid "No video data found on this channel" |
37 | 37 | |
38 | 38 | msgctxt "#30005" |
39 | 39 | msgid "Tuner is needed for recording" |
40 | msgstr "Nauhoittamiseen tarvitaan viritin" | |
40 | msgstr "Tallentamiseen tarvitaan viritin" | |
41 | 41 | |
42 | 42 | msgctxt "#30006" |
43 | 43 | msgid "Recording delete failed, file in use or write protected" |
44 | msgstr "Nauhoituksen poisto epäonnistui, tiedosto on käytössä tai kirjoitussuojattu" | |
44 | msgstr "Tallennuksen poisto epäonnistui, tiedosto on käytössä tai kirjoitussuojattu" | |
45 | 45 | |
46 | 46 | msgctxt "#30007" |
47 | 47 | msgid "Recording delete failed, recorded file doesn't exist" |
48 | msgstr "Nauhoituksen poisto epäonnistui, tallennetiedostoa ei ole olemassa" | |
48 | msgstr "Tallennuksen poisto epäonnistui, tiedostoa ei ole olemassa" | |
49 | 49 | |
50 | 50 | msgctxt "#30008" |
51 | 51 | msgid "Recording file not found" |
52 | msgstr "Tallennetiedostoa ei löydy" | |
52 | msgstr "Tallennustiedostoa ei löytynyt" | |
53 | 53 | |
54 | 54 | msgctxt "#30009" |
55 | 55 | msgid "Alternate channel chosen: " |
73 | 73 | |
74 | 74 | msgctxt "#30014" |
75 | 75 | msgid "Enable SignalStatus calls" |
76 | msgstr "Ota käyttöön SignalStatus-soitot" | |
76 | msgstr "Ota käyttöön SignalStatus-kutsut" | |
77 | 77 | |
78 | 78 | msgctxt "#30015" |
79 | 79 | msgid "Refresh SignalStatus Interval (sec)" |
80 | msgstr "Päivitä SignalStatus-välimatka (sek)" | |
80 | msgstr "SignalStatuksen päivitysväli (sek)" | |
81 | 81 | |
82 | 82 | msgctxt "#30016" |
83 | 83 | msgid "Store Resume/Watched status on server" |
84 | msgstr "Säilytä Jatka/katsottu -tila palvelimella" | |
84 | msgstr "Tallenna Jatka/katsottu -tila palvelimelle" | |
85 | 85 | |
86 | 86 | msgctxt "#30017" |
87 | 87 | msgid "Recorded TV folder not found" |
93 | 93 | |
94 | 94 | msgctxt "#30019" |
95 | 95 | msgid "ServerWMC version update is available (%s)" |
96 | msgstr "ServerWMC versiopäivitys saatavilla (%s)" | |
96 | msgstr "ServerWMC:n versiopäivitys on saatavilla (%s)" | |
97 | 97 | |
98 | 98 | msgctxt "#30020" |
99 | 99 | msgid "All tuners for this channel are busy" |
117 | 117 | |
118 | 118 | msgctxt "#30025" |
119 | 119 | msgid "Use WakeOnLAN to wake up server" |
120 | msgstr "Käytä WakeOnLania herättääksesi palvelimen" | |
120 | msgstr "Herätä palvelin WakeOnLAN-komennolla" | |
121 | 121 | |
122 | 122 | msgctxt "#30026" |
123 | 123 | msgid "Sending WakeOnLAN to server..." |
137 | 137 | |
138 | 138 | msgctxt "#30102" |
139 | 139 | msgid "Record the series" |
140 | msgstr "Tallenna sarjoja" | |
140 | msgstr "Tallenna sarja" | |
141 | 141 | |
142 | 142 | msgctxt "#30103" |
143 | 143 | msgid "Show type:" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
17 | 17 | |
18 | 18 | msgctxt "#30000" |
19 | 19 | msgid "Server Hostname or IP" |
20 | msgstr "Nom d'hôte ou IP du serveur" | |
20 | msgstr "Nom d’hôte ou IP du serveur" | |
21 | 21 | |
22 | 22 | msgctxt "#30001" |
23 | 23 | msgid "Keep IP address to 127.0.0.1, if server is running on this same system" |
24 | msgstr "Si le serveur tourne sur ce système, gardez l'adresse IP 127.0.0.1" | |
24 | msgstr "Si le serveur tourne sur ce système, gardez l’adresse IP 127.0.0.1" | |
25 | 25 | |
26 | 26 | msgctxt "#30002" |
27 | 27 | msgid "Port Number" |
33 | 33 | |
34 | 34 | msgctxt "#30004" |
35 | 35 | msgid "No video data found on this channel" |
36 | msgstr "Aucune donnée vidéo trouvée sur cette chaîne" | |
36 | msgstr "Aucunes données vidéo n’ont été trouvées sur cette chaîne" | |
37 | 37 | |
38 | 38 | msgctxt "#30005" |
39 | 39 | msgid "Tuner is needed for recording" |
41 | 41 | |
42 | 42 | msgctxt "#30006" |
43 | 43 | msgid "Recording delete failed, file in use or write protected" |
44 | msgstr "Échec de suppression de l'enregistrement. Le fichier est utilisé ou protégé en écriture" | |
44 | msgstr "Échec de suppression de l’enregistrement. Le fichier est utilisé ou protégé en écriture" | |
45 | 45 | |
46 | 46 | msgctxt "#30007" |
47 | 47 | msgid "Recording delete failed, recorded file doesn't exist" |
48 | msgstr "Échec de suppression de l'enregistrement. Le fichier enregistré n'existe pas" | |
48 | msgstr "Échec de suppression de l’enregistrement. Le fichier enregistré n’existe pas" | |
49 | 49 | |
50 | 50 | msgctxt "#30008" |
51 | 51 | msgid "Recording file not found" |
53 | 53 | |
54 | 54 | msgctxt "#30009" |
55 | 55 | msgid "Alternate channel chosen: " |
56 | msgstr "Chaîne alternative choisie :" | |
56 | msgstr "Chaîne alternative choisie :" | |
57 | 57 | |
58 | 58 | msgctxt "#30010" |
59 | 59 | msgid "Alternate time chosen: " |
61 | 61 | |
62 | 62 | msgctxt "#30011" |
63 | 63 | msgid "Can't start, tuner is no longer available" |
64 | msgstr "Démarrage impossible, le syntoniseur n'est plus disponible" | |
64 | msgstr "Démarrage impossible, le syntoniseur n’est plus disponible" | |
65 | 65 | |
66 | 66 | msgctxt "#30012" |
67 | 67 | msgid "Channel content is protected" |
73 | 73 | |
74 | 74 | msgctxt "#30014" |
75 | 75 | msgid "Enable SignalStatus calls" |
76 | msgstr "Activer les appels d'état du signal" | |
76 | msgstr "Activer les appels d’état du signal" | |
77 | 77 | |
78 | 78 | msgctxt "#30015" |
79 | 79 | msgid "Refresh SignalStatus Interval (sec)" |
80 | msgstr "Rafraîchir les intervalles d'état du signal (sec)" | |
80 | msgstr "Rafraîchir les intervalles d’état du signal (sec)" | |
81 | 81 | |
82 | 82 | msgctxt "#30016" |
83 | 83 | msgid "Store Resume/Watched status on server" |
84 | msgstr "Stocker l'état de reprise/regardé sur le serveur" | |
84 | msgstr "Stocker l’état de reprise/de visionnement sur le serveur" | |
85 | 85 | |
86 | 86 | msgctxt "#30017" |
87 | 87 | msgid "Recorded TV folder not found" |
101 | 101 | |
102 | 102 | msgctxt "#30021" |
103 | 103 | msgid "LiveTV timed-out" |
104 | msgstr "La télé en direct s'est interrompue" | |
104 | msgstr "La télé en direct s’est interrompue" | |
105 | 105 | |
106 | 106 | msgctxt "#30022" |
107 | 107 | msgid "LiveTV error, exited early" |
109 | 109 | |
110 | 110 | msgctxt "#30023" |
111 | 111 | msgid "Recording stream timed-out" |
112 | msgstr "Le flux d'enregistrement s'est interrompu" | |
112 | msgstr "Le flux d’enregistrement s’est interrompu" | |
113 | 113 | |
114 | 114 | msgctxt "#30024" |
115 | 115 | msgid "Recording stream exited early" |
116 | msgstr "Arrêt prématuré du flux d'enregistrement" | |
116 | msgstr "Arrêt prématuré du flux d’enregistrement" | |
117 | 117 | |
118 | 118 | msgctxt "#30025" |
119 | 119 | msgid "Use WakeOnLAN to wake up server" |
121 | 121 | |
122 | 122 | msgctxt "#30026" |
123 | 123 | msgid "Sending WakeOnLAN to server..." |
124 | msgstr "Envoi du réveil par le réseau au serveur..." | |
124 | msgstr "Envoi du réveil par le réseau au serveur…" | |
125 | 125 | |
126 | 126 | msgctxt "#30027" |
127 | 127 | msgid "Time drift between client and backend of %s minutes" |
129 | 129 | |
130 | 130 | msgctxt "#30100" |
131 | 131 | msgid "Recording Preference" |
132 | msgstr "Préférences d'enregistrement" | |
132 | msgstr "Préférences d’enregistrement" | |
133 | 133 | |
134 | 134 | msgctxt "#30101" |
135 | 135 | msgid "Record this episode only" |
136 | msgstr "N'enregistrer que cet épisode" | |
136 | msgstr "N’enregistrer que cet épisode" | |
137 | 137 | |
138 | 138 | msgctxt "#30102" |
139 | 139 | msgid "Record the series" |
141 | 141 | |
142 | 142 | msgctxt "#30103" |
143 | 143 | msgid "Show type:" |
144 | msgstr "Type d'émissions :" | |
144 | msgstr "Type d’émissions :" | |
145 | 145 | |
146 | 146 | msgctxt "#30104" |
147 | 147 | msgid "New and rerun" |
161 | 161 | |
162 | 162 | msgctxt "#30108" |
163 | 163 | msgid "Any Channel" |
164 | msgstr "N'importe quelle chaîne" | |
164 | msgstr "N’importe quelle chaîne" | |
165 | 165 | |
166 | 166 | msgctxt "#30110" |
167 | 167 | msgid "Airtime:" |
169 | 169 | |
170 | 170 | msgctxt "#30111" |
171 | 171 | msgid "Anytime" |
172 | msgstr "N'importe quand" | |
172 | msgstr "N’importe quand" | |
173 | 173 | |
174 | 174 | msgctxt "#30120" |
175 | 175 | msgid "Delete Timer" |
245 | 245 | |
246 | 246 | msgctxt "#30162" |
247 | 247 | msgid "Keep Until I Watch" |
248 | msgstr "Garder jusqu'à ce que je le regarde" | |
248 | msgstr "Garder jusqu’à ce que je le regarde" | |
249 | 249 | |
250 | 250 | msgctxt "#30163" |
251 | 251 | msgid "Keep Until Space Needed" |
252 | msgstr "Garder jusqu'à ce que l'espace soit requis" | |
252 | msgstr "Garder jusqu’à ce que l’espace soit requis" | |
253 | 253 | |
254 | 254 | msgctxt "#30164" |
255 | 255 | msgid "Keep Until I Delete" |
256 | msgstr "Garder jusqu'à ce que je le supprime" | |
256 | msgstr "Garder jusqu’à ce que je le supprime" | |
257 | 257 | |
258 | 258 | msgctxt "#30165" |
259 | 259 | msgid "Keep For 1 Week" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
183 | 183 | msgid "Delete the entire series" |
184 | 184 | msgstr "Hapus semua seri" |
185 | 185 | |
186 | msgctxt "#30130" | |
187 | msgid "Created by Repeating Timer" | |
188 | msgstr "Dibuat dengan cara Mengulang Penghitung Waktu" | |
189 | ||
186 | 190 | msgctxt "#30140" |
187 | 191 | msgid "Normal" |
188 | 192 | msgstr "Normal" |
194 | 198 | msgctxt "#30142" |
195 | 199 | msgid "Low" |
196 | 200 | msgstr "Rendah" |
201 | ||
202 | msgctxt "#30150" | |
203 | msgid "New Episodes Only" | |
204 | msgstr "Hanya Episode Baru" | |
205 | ||
206 | msgctxt "#30151" | |
207 | msgid "New and Rerun Episodes" | |
208 | msgstr "Episode Baru dan yang Sedang Berjalan" | |
209 | ||
210 | msgctxt "#30160" | |
211 | msgid "Not Set" | |
212 | msgstr "Belum Diatur" | |
213 | ||
214 | msgctxt "#30161" | |
215 | msgid "Keep Latest Recordings" | |
216 | msgstr "Pertahankan Perekaman Terakhir" | |
217 | ||
218 | msgctxt "#30162" | |
219 | msgid "Keep Until I Watch" | |
220 | msgstr "Pertahankan Sampai Saya Menonton" | |
221 | ||
222 | msgctxt "#30163" | |
223 | msgid "Keep Until Space Needed" | |
224 | msgstr "Pertahankan Sampai Ruang Dibutuhkan" | |
225 | ||
226 | msgctxt "#30164" | |
227 | msgid "Keep Until I Delete" | |
228 | msgstr "Pertahankan Sampai Saya Hapus" | |
229 | ||
230 | msgctxt "#30165" | |
231 | msgid "Keep For 1 Week" | |
232 | msgstr "Pertahankan Selama 1 Minggu" | |
233 | ||
234 | msgctxt "#30170" | |
235 | msgid "Keep As Many As Possible" | |
236 | msgstr "Pertahankan Selama Mungkin" | |
237 | ||
238 | msgctxt "#30171" | |
239 | msgid "Keep 1 Recording" | |
240 | msgstr "Pertahankan 1 Rekaman" | |
241 | ||
242 | msgctxt "#30172" | |
243 | msgid "Keep 2 Recordings" | |
244 | msgstr "Pertahankan 2 Rekaman" | |
245 | ||
246 | msgctxt "#30173" | |
247 | msgid "Keep 3 Recordings" | |
248 | msgstr "Pertahankan 3 Rekaman" | |
249 | ||
250 | msgctxt "#30174" | |
251 | msgid "Keep 4 Recordings" | |
252 | msgstr "Pertahankan 4 Rekaman" | |
253 | ||
254 | msgctxt "#30175" | |
255 | msgid "Keep 5 Recordings" | |
256 | msgstr "Pertahankan 5 Rekaman" | |
257 | ||
258 | msgctxt "#30176" | |
259 | msgid "Keep 6 Recordings" | |
260 | msgstr "Pertahankan 6 Rekaman" | |
261 | ||
262 | msgctxt "#30177" | |
263 | msgid "Keep 7 Recordings" | |
264 | msgstr "Pertahankan 7 Rekaman" | |
265 | ||
266 | msgctxt "#30178" | |
267 | msgid "Keep 10 Recordings" | |
268 | msgstr "Pertahankan 10 Rekaman" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
17 | 17 | |
18 | 18 | msgctxt "#30000" |
19 | 19 | msgid "Server Hostname or IP" |
20 | msgstr "Nafn miðlara eða IP tala" | |
20 | msgstr "Nafn miðlara eða IP-tala" | |
21 | 21 | |
22 | 22 | msgctxt "#30001" |
23 | 23 | msgid "Keep IP address to 127.0.0.1, if server is running on this same system" |
24 | msgstr "Hafðu IP töluna 127.0.0.1, ef miðlari er á keyra á sömu tölvu" | |
24 | msgstr "Hafðu IP-töluna 127.0.0.1, ef miðlari er á keyra á sömu tölvu" | |
25 | 25 | |
26 | 26 | msgctxt "#30002" |
27 | 27 | msgid "Port Number" |
28 | msgstr "Hlið númer" | |
28 | msgstr "Gátt númer" | |
29 | 29 | |
30 | 30 | msgctxt "#30003" |
31 | 31 | msgid "Stream timeout, unknown problem" |
32 | msgstr "Tengitími straums rann út, óþekkt vandamál" | |
32 | msgstr "Streymi rann út á tíma, óþekkt vandamál" | |
33 | 33 | |
34 | 34 | msgctxt "#30004" |
35 | 35 | msgid "No video data found on this channel" |
101 | 101 | |
102 | 102 | msgctxt "#30021" |
103 | 103 | msgid "LiveTV timed-out" |
104 | msgstr "Tengitími fyrir LiveTV rann út" | |
104 | msgstr "Tengitími fyrir beina útsendingu rann út" | |
105 | 105 | |
106 | 106 | msgctxt "#30022" |
107 | 107 | msgid "LiveTV error, exited early" |
108 | msgstr "LiveTV villa, hætti snemma" | |
108 | msgstr "Villa í beinni útsendingu, hætti snemma" | |
109 | 109 | |
110 | 110 | msgctxt "#30023" |
111 | 111 | msgid "Recording stream timed-out" |
112 | msgstr "Tengitími upptökustraums rann út" | |
112 | msgstr "Upptökustreymi rann út á tíma" | |
113 | 113 | |
114 | 114 | msgctxt "#30024" |
115 | 115 | msgid "Recording stream exited early" |
116 | msgstr "Upptökustraumur hætti snemma" | |
116 | msgstr "Upptökustreymi hætti of snemma" | |
117 | 117 | |
118 | 118 | msgctxt "#30025" |
119 | 119 | msgid "Use WakeOnLAN to wake up server" |
161 | 161 | |
162 | 162 | msgctxt "#30108" |
163 | 163 | msgid "Any Channel" |
164 | msgstr "Allar Rásir" | |
164 | msgstr "Hvaða rás sem er" | |
165 | 165 | |
166 | 166 | msgctxt "#30110" |
167 | 167 | msgid "Airtime:" |
183 | 183 | msgid "Delete the entire series" |
184 | 184 | msgstr "Eyða fyrir alla þáttaröðina" |
185 | 185 | |
186 | msgctxt "#30130" | |
187 | msgid "Created by Repeating Timer" | |
188 | msgstr "Búið til með endurtekinni tímatöku" | |
189 | ||
190 | msgctxt "#30131" | |
191 | msgid "One time (manual)" | |
192 | msgstr "Eitt skipti (handvirkt)" | |
193 | ||
194 | msgctxt "#30132" | |
195 | msgid "One time (guide)" | |
196 | msgstr "Eitt skipti (dagskrárvísir)" | |
197 | ||
198 | msgctxt "#30133" | |
199 | msgid "One time (wishlist)" | |
200 | msgstr "Eitt skipti (óskalisti)" | |
201 | ||
202 | msgctxt "#30134" | |
203 | msgid "Repeating (manual)" | |
204 | msgstr "Endurtekið (handvirkt)" | |
205 | ||
206 | msgctxt "#30135" | |
207 | msgid "Repeating (guide)" | |
208 | msgstr "Endurtekið (dagskrárvísir)" | |
209 | ||
210 | msgctxt "#30136" | |
211 | msgid "Repeating (wishlist)" | |
212 | msgstr "Endurtekið (óskalisti)" | |
213 | ||
186 | 214 | msgctxt "#30140" |
187 | 215 | msgid "Normal" |
188 | 216 | msgstr "Venjulegt" |
194 | 222 | msgctxt "#30142" |
195 | 223 | msgid "Low" |
196 | 224 | msgstr "Lægst" |
225 | ||
226 | msgctxt "#30150" | |
227 | msgid "New Episodes Only" | |
228 | msgstr "Einungis nýjir þættir" | |
229 | ||
230 | msgctxt "#30151" | |
231 | msgid "New and Rerun Episodes" | |
232 | msgstr "Nýjir og endursýndir þættir" | |
233 | ||
234 | msgctxt "#30152" | |
235 | msgid "Live Only" | |
236 | msgstr "Aðeins beinar útsendingar" | |
237 | ||
238 | msgctxt "#30160" | |
239 | msgid "Not Set" | |
240 | msgstr "Ekki stillt" | |
241 | ||
242 | msgctxt "#30161" | |
243 | msgid "Keep Latest Recordings" | |
244 | msgstr "Halda síðustu upptökum" | |
245 | ||
246 | msgctxt "#30162" | |
247 | msgid "Keep Until I Watch" | |
248 | msgstr "Halda þangað til búið er að horfa á" | |
249 | ||
250 | msgctxt "#30163" | |
251 | msgid "Keep Until Space Needed" | |
252 | msgstr "Halda þangað til vantar pláss" | |
253 | ||
254 | msgctxt "#30164" | |
255 | msgid "Keep Until I Delete" | |
256 | msgstr "Halda þangað til ég eyði" | |
257 | ||
258 | msgctxt "#30165" | |
259 | msgid "Keep For 1 Week" | |
260 | msgstr "Halda í 1 viku" | |
261 | ||
262 | msgctxt "#30170" | |
263 | msgid "Keep As Many As Possible" | |
264 | msgstr "Halda eins mörgum og mögulegt er" | |
265 | ||
266 | msgctxt "#30171" | |
267 | msgid "Keep 1 Recording" | |
268 | msgstr "Halda 1 upptöku" | |
269 | ||
270 | msgctxt "#30172" | |
271 | msgid "Keep 2 Recordings" | |
272 | msgstr "Halda 2 upptökum" | |
273 | ||
274 | msgctxt "#30173" | |
275 | msgid "Keep 3 Recordings" | |
276 | msgstr "Halda 3 upptökum" | |
277 | ||
278 | msgctxt "#30174" | |
279 | msgid "Keep 4 Recordings" | |
280 | msgstr "Halda 4 upptökum" | |
281 | ||
282 | msgctxt "#30175" | |
283 | msgid "Keep 5 Recordings" | |
284 | msgstr "Halda 5 upptökum" | |
285 | ||
286 | msgctxt "#30176" | |
287 | msgid "Keep 6 Recordings" | |
288 | msgstr "Halda 6 upptökum" | |
289 | ||
290 | msgctxt "#30177" | |
291 | msgid "Keep 7 Recordings" | |
292 | msgstr "Halda 7 upptökum" | |
293 | ||
294 | msgctxt "#30178" | |
295 | msgid "Keep 10 Recordings" | |
296 | msgstr "Halda 10 upptökum" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
125 | 125 | |
126 | 126 | msgctxt "#30027" |
127 | 127 | msgid "Time drift between client and backend of %s minutes" |
128 | msgstr "Laika nobīde starp klientu un aizmugursistēmu %s minūtes" | |
128 | msgstr "Laika nobīde starp klientu un galasistēmu %s minūtes" | |
129 | 129 | |
130 | 130 | msgctxt "#30100" |
131 | 131 | msgid "Recording Preference" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
17 | 17 | |
18 | 18 | msgctxt "#30000" |
19 | 19 | msgid "Server Hostname or IP" |
20 | msgstr "Servernavn eller IP" | |
20 | msgstr "Tjenernavn eller IP" | |
21 | 21 | |
22 | 22 | msgctxt "#30001" |
23 | 23 | msgid "Keep IP address to 127.0.0.1, if server is running on this same system" |
24 | msgstr "Behold IP adressen 127.0.0.1 om serveren kjører på samme system." | |
24 | msgstr "Behold IP-adressen 127.0.0.1 om tjeneren kjører på samme system." | |
25 | 25 | |
26 | 26 | msgctxt "#30002" |
27 | 27 | msgid "Port Number" |
81 | 81 | |
82 | 82 | msgctxt "#30016" |
83 | 83 | msgid "Store Resume/Watched status on server" |
84 | msgstr "Lagre Gjenoppta/Overvåket status på server" | |
84 | msgstr "Lagre Gjenoppta/overvåket -status på tjener" | |
85 | 85 | |
86 | 86 | msgctxt "#30017" |
87 | 87 | msgid "Recorded TV folder not found" |
93 | 93 | |
94 | 94 | msgctxt "#30019" |
95 | 95 | msgid "ServerWMC version update is available (%s)" |
96 | msgstr "ServerWMC versjon oppdatering er tilgjengelig (%s)" | |
96 | msgstr "ServerWMC-versjonsoppdatering tilgjengelig (%s)" | |
97 | 97 | |
98 | 98 | msgctxt "#30020" |
99 | 99 | msgid "All tuners for this channel are busy" |
101 | 101 | |
102 | 102 | msgctxt "#30021" |
103 | 103 | msgid "LiveTV timed-out" |
104 | msgstr "Tidsavbrudd for LiveTV" | |
104 | msgstr "Tidsavbrudd for direkte-TV" | |
105 | 105 | |
106 | 106 | msgctxt "#30022" |
107 | 107 | msgid "LiveTV error, exited early" |
108 | msgstr "LiveTV feil - avsluttet tidlig" | |
108 | msgstr "Feil med direkte-TV - avsluttet tidlig" | |
109 | 109 | |
110 | 110 | msgctxt "#30023" |
111 | 111 | msgid "Recording stream timed-out" |
117 | 117 | |
118 | 118 | msgctxt "#30025" |
119 | 119 | msgid "Use WakeOnLAN to wake up server" |
120 | msgstr "Bruk StartMedLAN for å starte opp serveren" | |
120 | msgstr "Bruk StartMedLAN for å starte opp tjeneren" | |
121 | 121 | |
122 | 122 | msgctxt "#30026" |
123 | 123 | msgid "Sending WakeOnLAN to server..." |
124 | msgstr "Sender StartPåLAN til server..." | |
124 | msgstr "Sender StartPåLAN til tjener…" | |
125 | 125 | |
126 | 126 | msgctxt "#30027" |
127 | 127 | msgid "Time drift between client and backend of %s minutes" |
185 | 185 | |
186 | 186 | msgctxt "#30130" |
187 | 187 | msgid "Created by Repeating Timer" |
188 | msgstr "Opprettet av Gjentangende Ur" | |
188 | msgstr "Opprettet av gjentangende ur" | |
189 | 189 | |
190 | 190 | msgctxt "#30131" |
191 | 191 | msgid "One time (manual)" |
192 | msgstr "En gang (manuell)" | |
192 | msgstr "Én gang (manuell)" | |
193 | 193 | |
194 | 194 | msgctxt "#30132" |
195 | 195 | msgid "One time (guide)" |
196 | msgstr "En gang (guide)" | |
196 | msgstr "Én gang (guide)" | |
197 | 197 | |
198 | 198 | msgctxt "#30133" |
199 | 199 | msgid "One time (wishlist)" |
200 | msgstr "En gang (ønskeliste)" | |
200 | msgstr "Én gang (ønskeliste)" | |
201 | 201 | |
202 | 202 | msgctxt "#30134" |
203 | 203 | msgid "Repeating (manual)" |
229 | 229 | |
230 | 230 | msgctxt "#30151" |
231 | 231 | msgid "New and Rerun Episodes" |
232 | msgstr "Nye og reprise episoder" | |
232 | msgstr "Nye episoder og repriser" | |
233 | 233 | |
234 | 234 | msgctxt "#30152" |
235 | 235 | msgid "Live Only" |
257 | 257 | |
258 | 258 | msgctxt "#30165" |
259 | 259 | msgid "Keep For 1 Week" |
260 | msgstr "Behold i 1 uke" | |
260 | msgstr "Behold i én uke" | |
261 | 261 | |
262 | 262 | msgctxt "#30170" |
263 | 263 | msgid "Keep As Many As Possible" |
265 | 265 | |
266 | 266 | msgctxt "#30171" |
267 | 267 | msgid "Keep 1 Recording" |
268 | msgstr "Behold 1 opptak" | |
268 | msgstr "Behold ett opptak" | |
269 | 269 | |
270 | 270 | msgctxt "#30172" |
271 | 271 | msgid "Keep 2 Recordings" |
272 | msgstr "Behold 2 opptak" | |
272 | msgstr "Behold to opptak" | |
273 | 273 | |
274 | 274 | msgctxt "#30173" |
275 | 275 | msgid "Keep 3 Recordings" |
276 | msgstr "Behold 3 opptak" | |
276 | msgstr "Behold tre opptak" | |
277 | 277 | |
278 | 278 | msgctxt "#30174" |
279 | 279 | msgid "Keep 4 Recordings" |
280 | msgstr "Behold 4 opptak" | |
280 | msgstr "Behold fire opptak" | |
281 | 281 | |
282 | 282 | msgctxt "#30175" |
283 | 283 | msgid "Keep 5 Recordings" |
284 | msgstr "Behold 5 opptak" | |
284 | msgstr "Behold fem opptak" | |
285 | 285 | |
286 | 286 | msgctxt "#30176" |
287 | 287 | msgid "Keep 6 Recordings" |
288 | msgstr "Behold 6 opptak" | |
288 | msgstr "Behold seks opptak" | |
289 | 289 | |
290 | 290 | msgctxt "#30177" |
291 | 291 | msgid "Keep 7 Recordings" |
292 | msgstr "Behold 7 opptak" | |
292 | msgstr "Behold syv opptak" | |
293 | 293 | |
294 | 294 | msgctxt "#30178" |
295 | 295 | msgid "Keep 10 Recordings" |
296 | msgstr "Behold 10 opptak" | |
296 | msgstr "Behold ti opptak" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
65 | 65 | |
66 | 66 | msgctxt "#30012" |
67 | 67 | msgid "Channel content is protected" |
68 | msgstr "Kanaal inhoud is beschermd" | |
68 | msgstr "Kanaalinhoud is beschermd" | |
69 | 69 | |
70 | 70 | msgctxt "#30013" |
71 | 71 | msgid "End time increased by " |
73 | 73 | |
74 | 74 | msgctxt "#30014" |
75 | 75 | msgid "Enable SignalStatus calls" |
76 | msgstr "Schakel in Signaastatus oproepen" | |
76 | msgstr "Signaalstatus-oproepen inschakelen" | |
77 | 77 | |
78 | 78 | msgctxt "#30015" |
79 | 79 | msgid "Refresh SignalStatus Interval (sec)" |
85 | 85 | |
86 | 86 | msgctxt "#30017" |
87 | 87 | msgid "Recorded TV folder not found" |
88 | msgstr "Opgenomen TV folder niet gevonden" | |
88 | msgstr "TV opname-folder niet gevonden" | |
89 | 89 | |
90 | 90 | msgctxt "#30018" |
91 | 91 | msgid "Recorded TV folder cannot be opened" |
97 | 97 | |
98 | 98 | msgctxt "#30020" |
99 | 99 | msgid "All tuners for this channel are busy" |
100 | msgstr "Alle tuners voor dit kanaal zij in gebruik" | |
100 | msgstr "Alle tuners voor dit kanaal zijn in gebruik" | |
101 | 101 | |
102 | 102 | msgctxt "#30021" |
103 | 103 | msgid "LiveTV timed-out" |
105 | 105 | |
106 | 106 | msgctxt "#30022" |
107 | 107 | msgid "LiveTV error, exited early" |
108 | msgstr "LiveTV error, Vroegtijdig beïnidigd " | |
108 | msgstr "LiveTV error, Vroegtijdig beëindigd " | |
109 | 109 | |
110 | 110 | msgctxt "#30023" |
111 | 111 | msgid "Recording stream timed-out" |
125 | 125 | |
126 | 126 | msgctxt "#30027" |
127 | 127 | msgid "Time drift between client and backend of %s minutes" |
128 | msgstr "Tijdsdrift tussen opdrachtgever en backend van% s minuten" | |
128 | msgstr "Tijdsverschil tussen opdrachtgever en backend van% s minuten" | |
129 | 129 | |
130 | 130 | msgctxt "#30100" |
131 | 131 | msgid "Recording Preference" |
132 | msgstr "Opname voorkeur" | |
132 | msgstr "Opnamevoorkeur" | |
133 | 133 | |
134 | 134 | msgctxt "#30101" |
135 | 135 | msgid "Record this episode only" |
149 | 149 | |
150 | 150 | msgctxt "#30105" |
151 | 151 | msgid "New only" |
152 | msgstr "Alleen nieuwe" | |
152 | msgstr "Alleen nieuw" | |
153 | 153 | |
154 | 154 | msgctxt "#30106" |
155 | 155 | msgid "Live only" |
181 | 181 | |
182 | 182 | msgctxt "#30122" |
183 | 183 | msgid "Delete the entire series" |
184 | msgstr "verwijder de gehele serie" | |
184 | msgstr "Verwijder de gehele serie" | |
185 | 185 | |
186 | 186 | msgctxt "#30130" |
187 | 187 | msgid "Created by Repeating Timer" |
229 | 229 | |
230 | 230 | msgctxt "#30151" |
231 | 231 | msgid "New and Rerun Episodes" |
232 | msgstr "Nieuw en herhaal afleveringen" | |
232 | msgstr "Nieuw en herhaalafleveringen" | |
233 | 233 | |
234 | 234 | msgctxt "#30152" |
235 | 235 | msgid "Live Only" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
29 | 29 | |
30 | 30 | msgctxt "#30003" |
31 | 31 | msgid "Stream timeout, unknown problem" |
32 | msgstr "Przekroczono limit czasu oczekiwania na strumień, nieznany błąd" | |
32 | msgstr "Przekroczono limit czasu oczekiwania na transmisję, nieznany błąd" | |
33 | 33 | |
34 | 34 | msgctxt "#30004" |
35 | 35 | msgid "No video data found on this channel" |
36 | msgstr "Brak strumienia wideo dla tego kanału" | |
36 | msgstr "Brak transmisji wideo dla tego kanału" | |
37 | 37 | |
38 | 38 | msgctxt "#30005" |
39 | 39 | msgid "Tuner is needed for recording" |
105 | 105 | |
106 | 106 | msgctxt "#30022" |
107 | 107 | msgid "LiveTV error, exited early" |
108 | msgstr "Błąd strumieniowania, przedwczesne zamknięcie strumienia" | |
108 | msgstr "Błąd transmisji, przedwczesne zamknięcie" | |
109 | 109 | |
110 | 110 | msgctxt "#30023" |
111 | 111 | msgid "Recording stream timed-out" |
113 | 113 | |
114 | 114 | msgctxt "#30024" |
115 | 115 | msgid "Recording stream exited early" |
116 | msgstr "Błąd nagrywania, przedwczesne zamknięcie strumienia" | |
116 | msgstr "Błąd nagrywania, przedwczesne zamknięcie transmisji" | |
117 | 117 | |
118 | 118 | msgctxt "#30025" |
119 | 119 | msgid "Use WakeOnLAN to wake up server" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
17 | 17 | |
18 | 18 | msgctxt "#30000" |
19 | 19 | msgid "Server Hostname or IP" |
20 | msgstr "Nume gazdă sau IP server" | |
20 | msgstr "Nume gazdă sau adresă IP servitor" | |
21 | 21 | |
22 | 22 | msgctxt "#30001" |
23 | 23 | msgid "Keep IP address to 127.0.0.1, if server is running on this same system" |
24 | msgstr "Mențineți adresa IP 127.0.0.1, dacă serverul rulează pe același sistem" | |
24 | msgstr "Mențineți adresa IP 127.0.0.1, dacă servitorul rulează pe același sistem" | |
25 | 25 | |
26 | 26 | msgctxt "#30002" |
27 | 27 | msgid "Port Number" |
81 | 81 | |
82 | 82 | msgctxt "#30016" |
83 | 83 | msgid "Store Resume/Watched status on server" |
84 | msgstr "Storchează stare Reluare/Văzut pe server" | |
84 | msgstr "Stochează stare Reluate/Văzute pe servitor" | |
85 | 85 | |
86 | 86 | msgctxt "#30017" |
87 | 87 | msgid "Recorded TV folder not found" |
117 | 117 | |
118 | 118 | msgctxt "#30025" |
119 | 119 | msgid "Use WakeOnLAN to wake up server" |
120 | msgstr "Folosește WakeOnLAN pentru a deștepta server-ul" | |
120 | msgstr "Folosește WakeOnLAN pentru a deștepta servitorul" | |
121 | 121 | |
122 | 122 | msgctxt "#30026" |
123 | 123 | msgid "Sending WakeOnLAN to server..." |
124 | msgstr "Se trimite pachetul WakeOnLAN la server..." | |
124 | msgstr "Se trimite pachetul de deșteptare (WakeOnLAN) la servitor..." | |
125 | 125 | |
126 | 126 | msgctxt "#30027" |
127 | 127 | msgid "Time drift between client and backend of %s minutes" |
237 | 237 | |
238 | 238 | msgctxt "#30160" |
239 | 239 | msgid "Not Set" |
240 | msgstr "Nedefinit" | |
240 | msgstr "Nestabilit" | |
241 | 241 | |
242 | 242 | msgctxt "#30161" |
243 | 243 | msgid "Keep Latest Recordings" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
21 | 21 | |
22 | 22 | msgctxt "#30001" |
23 | 23 | msgid "Keep IP address to 127.0.0.1, if server is running on this same system" |
24 | msgstr "Ange IP-adress 127.0.0.1 om servern körs på detta system" | |
24 | msgstr "Behåll IP-adress 127.0.0.1 om servern körs på detta system" | |
25 | 25 | |
26 | 26 | msgctxt "#30002" |
27 | 27 | msgid "Port Number" |
101 | 101 | |
102 | 102 | msgctxt "#30021" |
103 | 103 | msgid "LiveTV timed-out" |
104 | msgstr "Väntetiden för LiveTV överskreds" | |
104 | msgstr "Väntetiden för Live-TV överskreds" | |
105 | 105 | |
106 | 106 | msgctxt "#30022" |
107 | 107 | msgid "LiveTV error, exited early" |
108 | msgstr "LiveTV fel, avslutades tidigt" | |
108 | msgstr "Live-TV fel, avslutades tidigt" | |
109 | 109 | |
110 | 110 | msgctxt "#30023" |
111 | 111 | msgid "Recording stream timed-out" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
15 | 15 | "Language: szl\n" |
16 | 16 | "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" |
17 | 17 | |
18 | msgctxt "#30000" | |
19 | msgid "Server Hostname or IP" | |
20 | msgstr "Miano lebo adresa serwera" | |
21 | ||
22 | msgctxt "#30001" | |
23 | msgid "Keep IP address to 127.0.0.1, if server is running on this same system" | |
24 | msgstr "Spamiyntej adresa IP 127.0.0.1, jeźli serwer je sztartniynty na tym samym systymie" | |
25 | ||
26 | msgctxt "#30002" | |
27 | msgid "Port Number" | |
28 | msgstr "Port" | |
29 | ||
30 | msgctxt "#30003" | |
31 | msgid "Stream timeout, unknown problem" | |
32 | msgstr "Przestōmpiōno było limit czŏsu czekaniŏ na szprica, niyznōmy feler" | |
33 | ||
34 | msgctxt "#30004" | |
35 | msgid "No video data found on this channel" | |
36 | msgstr "Niy ma szpricy wideo dlŏ tego kanału" | |
37 | ||
38 | msgctxt "#30005" | |
39 | msgid "Tuner is needed for recording" | |
40 | msgstr "Niy ma dostympnygo tunera dlŏ funkcyje nagrowaniŏ" | |
41 | ||
42 | msgctxt "#30006" | |
43 | msgid "Recording delete failed, file in use or write protected" | |
44 | msgstr "Niypodarzōne uchrōniynie nagraniŏ, zbiōr je w użyciu lebo bezpieczōny przed spamiyntowaniym" | |
45 | ||
46 | msgctxt "#30007" | |
47 | msgid "Recording delete failed, recorded file doesn't exist" | |
48 | msgstr "Niypodarzōne uchrōniynie nagraniŏ, zbioru nagraniŏ niy ma" | |
49 | ||
50 | msgctxt "#30008" | |
51 | msgid "Recording file not found" | |
52 | msgstr "Zbiōr nagraniŏ niydostympny" | |
53 | ||
54 | msgctxt "#30009" | |
55 | msgid "Alternate channel chosen: " | |
56 | msgstr "Ôbrany alternatywny kanał:" | |
57 | ||
58 | msgctxt "#30010" | |
59 | msgid "Alternate time chosen: " | |
60 | msgstr "Ôbrany alternatywny czŏs:" | |
61 | ||
62 | msgctxt "#30011" | |
63 | msgid "Can't start, tuner is no longer available" | |
64 | msgstr "Niypodarzōne sztartniyńcie, tuner je niydostympny" | |
65 | ||
66 | msgctxt "#30012" | |
67 | msgid "Channel content is protected" | |
68 | msgstr "Zawartość kanału je bezpieczōnŏ" | |
69 | ||
70 | msgctxt "#30013" | |
71 | msgid "End time increased by " | |
72 | msgstr "Czŏs kōńca szafniynty ô" | |
73 | ||
74 | msgctxt "#30014" | |
75 | msgid "Enable SignalStatus calls" | |
76 | msgstr "Pokŏzuj jakość sygnołu" | |
77 | ||
78 | msgctxt "#30015" | |
79 | msgid "Refresh SignalStatus Interval (sec)" | |
80 | msgstr "Frekwyncyjŏ ôdświyżaniŏ jakości sygnału (w sekundach)" | |
81 | ||
82 | msgctxt "#30016" | |
83 | msgid "Store Resume/Watched status on server" | |
84 | msgstr "Spamiyntuj stany ôdtwŏrzaniŏ na serwerze" | |
85 | ||
86 | msgctxt "#30017" | |
87 | msgid "Recorded TV folder not found" | |
88 | msgstr "Niy znŏdniynto było folderu nagrań telewizyjnych" | |
89 | ||
90 | msgctxt "#30018" | |
91 | msgid "Recorded TV folder cannot be opened" | |
92 | msgstr " Niy idzie ôdewrzić folderu nagrań telewizyjnych" | |
93 | ||
94 | msgctxt "#30019" | |
95 | msgid "ServerWMC version update is available (%s)" | |
96 | msgstr "Dostympnŏ je aktualizacyjŏ wersyje serwera (%s)" | |
97 | ||
98 | msgctxt "#30020" | |
99 | msgid "All tuners for this channel are busy" | |
100 | msgstr "Wszyjske tunery dlŏ tego kanału sōm zajynte" | |
101 | ||
102 | msgctxt "#30021" | |
103 | msgid "LiveTV timed-out" | |
104 | msgstr "Przestōmpiōno było limit czŏsu skuplowaniŏ" | |
105 | ||
106 | msgctxt "#30022" | |
107 | msgid "LiveTV error, exited early" | |
108 | msgstr "Feler telewizyje, wyrychlane zawrzynie szpricy" | |
109 | ||
110 | msgctxt "#30023" | |
111 | msgid "Recording stream timed-out" | |
112 | msgstr "Przestōmpiōno było limit czŏsu napoczyńciŏ nagraniŏ" | |
113 | ||
114 | msgctxt "#30024" | |
115 | msgid "Recording stream exited early" | |
116 | msgstr "Feler nagrowaniŏ, wyrychlane zawrzynie szpricy" | |
117 | ||
118 | msgctxt "#30025" | |
119 | msgid "Use WakeOnLAN to wake up server" | |
120 | msgstr "Używej zdŏlnygo cucyniŏ serwera" | |
121 | ||
122 | msgctxt "#30026" | |
123 | msgid "Sending WakeOnLAN to server..." | |
124 | msgstr "Posyłanie nakŏzaniŏ cucyniŏ do serwera..." | |
125 | ||
126 | msgctxt "#30027" | |
127 | msgid "Time drift between client and backend of %s minutes" | |
128 | msgstr "Szafniyńcie czŏsu miyndzy klijyntym a serwerym ô %s minut" | |
129 | ||
130 | msgctxt "#30100" | |
131 | msgid "Recording Preference" | |
132 | msgstr "Preferyncyje nagrowaniŏ" | |
133 | ||
134 | msgctxt "#30101" | |
135 | msgid "Record this episode only" | |
136 | msgstr "Nagrej ino tyn part" | |
137 | ||
138 | msgctxt "#30102" | |
139 | msgid "Record the series" | |
140 | msgstr "Nagrowej cołki serial" | |
141 | ||
142 | msgctxt "#30103" | |
143 | msgid "Show type:" | |
144 | msgstr "Pokŏzuj zortã:" | |
145 | ||
146 | msgctxt "#30104" | |
147 | msgid "New and rerun" | |
148 | msgstr "Nowe i zaś nadŏwane" | |
149 | ||
150 | msgctxt "#30105" | |
151 | msgid "New only" | |
152 | msgstr "Ino nowe" | |
153 | ||
154 | msgctxt "#30106" | |
155 | msgid "Live only" | |
156 | msgstr "Ino na żywo" | |
157 | ||
18 | 158 | msgctxt "#30107" |
19 | 159 | msgid "Channel:" |
20 | 160 | msgstr "Kanał:" |
21 | 161 | |
162 | msgctxt "#30108" | |
163 | msgid "Any Channel" | |
164 | msgstr "Leda jaki kanał" | |
165 | ||
166 | msgctxt "#30110" | |
167 | msgid "Airtime:" | |
168 | msgstr "Czŏs ymisyje:" | |
169 | ||
170 | msgctxt "#30111" | |
171 | msgid "Anytime" | |
172 | msgstr "Kej ino" | |
173 | ||
174 | msgctxt "#30120" | |
175 | msgid "Delete Timer" | |
176 | msgstr "Uchrōń auftrag" | |
177 | ||
178 | msgctxt "#30121" | |
179 | msgid "Delete this episode timer only" | |
180 | msgstr "Uchrōń ôbcyrklowane nagranie ino tego partu" | |
181 | ||
182 | msgctxt "#30122" | |
183 | msgid "Delete the entire series" | |
184 | msgstr "Uchrōń cołki seriŏl" | |
185 | ||
186 | msgctxt "#30130" | |
187 | msgid "Created by Repeating Timer" | |
188 | msgstr "Wytworzōne bez auftrag cykliczny" | |
189 | ||
190 | msgctxt "#30131" | |
191 | msgid "One time (manual)" | |
192 | msgstr "Jednorazowo (manualnie)" | |
193 | ||
194 | msgctxt "#30132" | |
195 | msgid "One time (guide)" | |
196 | msgstr "Jednorazowo (ôkludzŏcz)" | |
197 | ||
198 | msgctxt "#30133" | |
199 | msgid "One time (wishlist)" | |
200 | msgstr "Jednorazowo (wykŏz)" | |
201 | ||
202 | msgctxt "#30134" | |
203 | msgid "Repeating (manual)" | |
204 | msgstr "Cyklicznie (manualnie)" | |
205 | ||
206 | msgctxt "#30135" | |
207 | msgid "Repeating (guide)" | |
208 | msgstr "Cyklicznie (ôkludzŏcz)" | |
209 | ||
210 | msgctxt "#30136" | |
211 | msgid "Repeating (wishlist)" | |
212 | msgstr "Cyklicznie (wykŏz)" | |
213 | ||
22 | 214 | msgctxt "#30140" |
23 | 215 | msgid "Normal" |
24 | 216 | msgstr "Ôbyczajny" |
30 | 222 | msgctxt "#30142" |
31 | 223 | msgid "Low" |
32 | 224 | msgstr "min." |
225 | ||
226 | msgctxt "#30150" | |
227 | msgid "New Episodes Only" | |
228 | msgstr "Ino nowe party" | |
229 | ||
230 | msgctxt "#30151" | |
231 | msgid "New and Rerun Episodes" | |
232 | msgstr "Nowe i zaś ymitowane party" | |
233 | ||
234 | msgctxt "#30152" | |
235 | msgid "Live Only" | |
236 | msgstr "Ino na żywo" | |
237 | ||
238 | msgctxt "#30160" | |
239 | msgid "Not Set" | |
240 | msgstr "Niynasztalowane" | |
241 | ||
242 | msgctxt "#30161" | |
243 | msgid "Keep Latest Recordings" | |
244 | msgstr "Spamiyntuj ôstatnie nagrania" | |
245 | ||
246 | msgctxt "#30162" | |
247 | msgid "Keep Until I Watch" | |
248 | msgstr "Spamiyntuj do piyrszygo ôbejzdrzyniŏ" | |
249 | ||
250 | msgctxt "#30163" | |
251 | msgid "Keep Until Space Needed" | |
252 | msgstr "Spamiyntuj aże braknie placu na dysku" | |
253 | ||
254 | msgctxt "#30164" | |
255 | msgid "Keep Until I Delete" | |
256 | msgstr "Spamiyntuj do uchrōniyniŏ" | |
257 | ||
258 | msgctxt "#30165" | |
259 | msgid "Keep For 1 Week" | |
260 | msgstr "Spamiyntuj bez 1 tydziyń" | |
261 | ||
262 | msgctxt "#30170" | |
263 | msgid "Keep As Many As Possible" | |
264 | msgstr "Spamiyntuj wiela to ino możebne" | |
265 | ||
266 | msgctxt "#30171" | |
267 | msgid "Keep 1 Recording" | |
268 | msgstr "Spamiyntuj 1 nagranie" | |
269 | ||
270 | msgctxt "#30172" | |
271 | msgid "Keep 2 Recordings" | |
272 | msgstr "Spamiyntuj 2 nagrania" | |
273 | ||
274 | msgctxt "#30173" | |
275 | msgid "Keep 3 Recordings" | |
276 | msgstr "Spamiyntuj 3 nagrania" | |
277 | ||
278 | msgctxt "#30174" | |
279 | msgid "Keep 4 Recordings" | |
280 | msgstr "Spamiyntuj 4 nagrania" | |
281 | ||
282 | msgctxt "#30175" | |
283 | msgid "Keep 5 Recordings" | |
284 | msgstr "Spamiyntuj 5 nagrań" | |
285 | ||
286 | msgctxt "#30176" | |
287 | msgid "Keep 6 Recordings" | |
288 | msgstr "Spamiyntuj 6 nagrań" | |
289 | ||
290 | msgctxt "#30177" | |
291 | msgid "Keep 7 Recordings" | |
292 | msgstr "Spamiyntuj 7 nagrań" | |
293 | ||
294 | msgctxt "#30178" | |
295 | msgid "Keep 10 Recordings" | |
296 | msgstr "Spamiyntuj 10 nagrań" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
183 | 183 | msgid "Delete the entire series" |
184 | 184 | msgstr "Tüm seriyi sil" |
185 | 185 | |
186 | msgctxt "#30130" | |
187 | msgid "Created by Repeating Timer" | |
188 | msgstr "Tekrarlanan Zamanlayıcı tarafından oluşturuldu" | |
189 | ||
190 | msgctxt "#30131" | |
191 | msgid "One time (manual)" | |
192 | msgstr "Tek seferlik (elle)" | |
193 | ||
194 | msgctxt "#30132" | |
195 | msgid "One time (guide)" | |
196 | msgstr "Tek seferiik (rehber)" | |
197 | ||
198 | msgctxt "#30133" | |
199 | msgid "One time (wishlist)" | |
200 | msgstr "Tek seferlik (istek listesi)" | |
201 | ||
202 | msgctxt "#30134" | |
203 | msgid "Repeating (manual)" | |
204 | msgstr "Tekrarlı (elle)" | |
205 | ||
206 | msgctxt "#30135" | |
207 | msgid "Repeating (guide)" | |
208 | msgstr "Tekrarlı (rehber)" | |
209 | ||
210 | msgctxt "#30136" | |
211 | msgid "Repeating (wishlist)" | |
212 | msgstr "Tekrarlı (istek listesi)" | |
213 | ||
186 | 214 | msgctxt "#30140" |
187 | 215 | msgid "Normal" |
188 | 216 | msgstr "Normal" |
198 | 226 | msgctxt "#30150" |
199 | 227 | msgid "New Episodes Only" |
200 | 228 | msgstr "Sadece Yeni Bölümler" |
229 | ||
230 | msgctxt "#30151" | |
231 | msgid "New and Rerun Episodes" | |
232 | msgstr "Yeni ve tekrar bölümler" | |
233 | ||
234 | msgctxt "#30152" | |
235 | msgid "Live Only" | |
236 | msgstr "Sadece canlı yayın" | |
237 | ||
238 | msgctxt "#30160" | |
239 | msgid "Not Set" | |
240 | msgstr "Belirlenmemiş" | |
241 | ||
242 | msgctxt "#30161" | |
243 | msgid "Keep Latest Recordings" | |
244 | msgstr "Son kayıtları sakla" | |
245 | ||
246 | msgctxt "#30162" | |
247 | msgid "Keep Until I Watch" | |
248 | msgstr "İzleyene kadar sakla" | |
249 | ||
250 | msgctxt "#30163" | |
251 | msgid "Keep Until Space Needed" | |
252 | msgstr "Boş alan lazım olana dek sakla" | |
253 | ||
254 | msgctxt "#30164" | |
255 | msgid "Keep Until I Delete" | |
256 | msgstr "Silene kadar sakla" | |
257 | ||
258 | msgctxt "#30165" | |
259 | msgid "Keep For 1 Week" | |
260 | msgstr "1 hafta sakla" | |
261 | ||
262 | msgctxt "#30170" | |
263 | msgid "Keep As Many As Possible" | |
264 | msgstr "Mümkün olduğunca fazla sayıda sakla" | |
265 | ||
266 | msgctxt "#30171" | |
267 | msgid "Keep 1 Recording" | |
268 | msgstr "1 kayıt sakla" | |
269 | ||
270 | msgctxt "#30172" | |
271 | msgid "Keep 2 Recordings" | |
272 | msgstr "2 kayıt sakla" | |
273 | ||
274 | msgctxt "#30173" | |
275 | msgid "Keep 3 Recordings" | |
276 | msgstr "3 kayıt sakla" | |
277 | ||
278 | msgctxt "#30174" | |
279 | msgid "Keep 4 Recordings" | |
280 | msgstr "4 kayıt sakla" | |
281 | ||
282 | msgctxt "#30175" | |
283 | msgid "Keep 5 Recordings" | |
284 | msgstr "5 kayıt sakla" | |
285 | ||
286 | msgctxt "#30176" | |
287 | msgid "Keep 6 Recordings" | |
288 | msgstr "6 kayıt sakla" | |
289 | ||
290 | msgctxt "#30177" | |
291 | msgid "Keep 7 Recordings" | |
292 | msgstr "7 kayıt sakla" | |
293 | ||
294 | msgctxt "#30178" | |
295 | msgid "Keep 10 Recordings" | |
296 | msgstr "10 kayıt sakla" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
183 | 183 | msgid "Delete the entire series" |
184 | 184 | msgstr "Видалити весь серіал" |
185 | 185 | |
186 | msgctxt "#30130" | |
187 | msgid "Created by Repeating Timer" | |
188 | msgstr "Створено зусиллями Repeating Timer" | |
189 | ||
186 | 190 | msgctxt "#30140" |
187 | 191 | msgid "Normal" |
188 | 192 | msgstr "Нормальне" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
4 | 4 | msgid "" |
5 | 5 | msgstr "" |
6 | 6 | "Project-Id-Version: KODI Main\n" |
7 | "Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" | |
7 | "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" | |
8 | 8 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" |
9 | 9 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
10 | 10 | "Last-Translator: Kodi Translation Team\n" |
15 | 15 | "Language: zh_TW\n" |
16 | 16 | "Plural-Forms: nplurals=1; plural=0;\n" |
17 | 17 | |
18 | msgctxt "#30000" | |
19 | msgid "Server Hostname or IP" | |
20 | msgstr "伺服器網址或IP" | |
21 | ||
22 | msgctxt "#30001" | |
23 | msgid "Keep IP address to 127.0.0.1, if server is running on this same system" | |
24 | msgstr "如果伺服器在本機運作,請將IP設為127.0.0.1。" | |
25 | ||
26 | msgctxt "#30002" | |
27 | msgid "Port Number" | |
28 | msgstr "連接埠號碼" | |
29 | ||
30 | msgctxt "#30003" | |
31 | msgid "Stream timeout, unknown problem" | |
32 | msgstr "串流逾時,問題不明" | |
33 | ||
34 | msgctxt "#30004" | |
35 | msgid "No video data found on this channel" | |
36 | msgstr "本頻道沒有影像資料" | |
37 | ||
38 | msgctxt "#30005" | |
39 | msgid "Tuner is needed for recording" | |
40 | msgstr "錄影需要電視選台器" | |
41 | ||
42 | msgctxt "#30006" | |
43 | msgid "Recording delete failed, file in use or write protected" | |
44 | msgstr "刪除錄影檔失敗,檔案使用中或已受保護" | |
45 | ||
46 | msgctxt "#30007" | |
47 | msgid "Recording delete failed, recorded file doesn't exist" | |
48 | msgstr "刪除錄影檔失敗,檔案不存在" | |
49 | ||
50 | msgctxt "#30008" | |
51 | msgid "Recording file not found" | |
52 | msgstr "找不到錄影檔" | |
53 | ||
54 | msgctxt "#30009" | |
55 | msgid "Alternate channel chosen: " | |
56 | msgstr "替代頻道選擇:" | |
57 | ||
58 | msgctxt "#30010" | |
59 | msgid "Alternate time chosen: " | |
60 | msgstr "替代時間選擇:" | |
61 | ||
62 | msgctxt "#30011" | |
63 | msgid "Can't start, tuner is no longer available" | |
64 | msgstr "無法啟動,選台器不可用" | |
65 | ||
66 | msgctxt "#30012" | |
67 | msgid "Channel content is protected" | |
68 | msgstr "頻道內容已受保護" | |
69 | ||
70 | msgctxt "#30013" | |
71 | msgid "End time increased by " | |
72 | msgstr "結束時間延長" | |
73 | ||
74 | msgctxt "#30014" | |
75 | msgid "Enable SignalStatus calls" | |
76 | msgstr "開啟SignalStatus的呼叫" | |
77 | ||
78 | msgctxt "#30015" | |
79 | msgid "Refresh SignalStatus Interval (sec)" | |
80 | msgstr "更新SignalStatus的間隔 (秒)" | |
81 | ||
82 | msgctxt "#30016" | |
83 | msgid "Store Resume/Watched status on server" | |
84 | msgstr "儲存伺服器中\"續播/已看完\"的狀態" | |
85 | ||
86 | msgctxt "#30017" | |
87 | msgid "Recorded TV folder not found" | |
88 | msgstr "找不到已錄製的電視節目資料夾" | |
89 | ||
90 | msgctxt "#30018" | |
91 | msgid "Recorded TV folder cannot be opened" | |
92 | msgstr "無法開啟已錄製電視節目資料夾" | |
93 | ||
94 | msgctxt "#30019" | |
95 | msgid "ServerWMC version update is available (%s)" | |
96 | msgstr "有可用的ServerWMC更新版本(%s)" | |
97 | ||
98 | msgctxt "#30020" | |
99 | msgid "All tuners for this channel are busy" | |
100 | msgstr "本頻道可用的選台器忙碌中" | |
101 | ||
102 | msgctxt "#30021" | |
103 | msgid "LiveTV timed-out" | |
104 | msgstr "LiveTV逾時" | |
105 | ||
106 | msgctxt "#30022" | |
107 | msgid "LiveTV error, exited early" | |
108 | msgstr "LiveTV錯誤,提前退出" | |
109 | ||
110 | msgctxt "#30023" | |
111 | msgid "Recording stream timed-out" | |
112 | msgstr "串流錄影逾時" | |
113 | ||
114 | msgctxt "#30024" | |
115 | msgid "Recording stream exited early" | |
116 | msgstr "串流錄影提早退出" | |
117 | ||
118 | msgctxt "#30025" | |
119 | msgid "Use WakeOnLAN to wake up server" | |
120 | msgstr "使用WakeOnLAN來喚醒伺服器" | |
121 | ||
122 | msgctxt "#30026" | |
123 | msgid "Sending WakeOnLAN to server..." | |
124 | msgstr "傳送WakeOnLAN指令到伺服器" | |
125 | ||
126 | msgctxt "#30027" | |
127 | msgid "Time drift between client and backend of %s minutes" | |
128 | msgstr "用戶端與後端時間差%s分" | |
129 | ||
130 | msgctxt "#30100" | |
131 | msgid "Recording Preference" | |
132 | msgstr "錄影設定" | |
133 | ||
18 | 134 | msgctxt "#30101" |
19 | 135 | msgid "Record this episode only" |
20 | msgstr "只刪除這個插曲" | |
136 | msgstr "僅刪除本集" | |
137 | ||
138 | msgctxt "#30102" | |
139 | msgid "Record the series" | |
140 | msgstr "錄製系列影集" | |
141 | ||
142 | msgctxt "#30103" | |
143 | msgid "Show type:" | |
144 | msgstr "影集類型:" | |
145 | ||
146 | msgctxt "#30104" | |
147 | msgid "New and rerun" | |
148 | msgstr "新番與重播" | |
149 | ||
150 | msgctxt "#30105" | |
151 | msgid "New only" | |
152 | msgstr "僅新番" | |
153 | ||
154 | msgctxt "#30106" | |
155 | msgid "Live only" | |
156 | msgstr "僅直播節目" | |
21 | 157 | |
22 | 158 | msgctxt "#30107" |
23 | 159 | msgid "Channel:" |
27 | 163 | msgid "Any Channel" |
28 | 164 | msgstr "任何頻道" |
29 | 165 | |
166 | msgctxt "#30110" | |
167 | msgid "Airtime:" | |
168 | msgstr "播放時間:" | |
169 | ||
30 | 170 | msgctxt "#30111" |
31 | 171 | msgid "Anytime" |
32 | 172 | msgstr "任何時間" |
33 | 173 | |
174 | msgctxt "#30120" | |
175 | msgid "Delete Timer" | |
176 | msgstr "刪除定時器" | |
177 | ||
178 | msgctxt "#30121" | |
179 | msgid "Delete this episode timer only" | |
180 | msgstr "僅刪除本集的定時器" | |
181 | ||
34 | 182 | msgctxt "#30122" |
35 | 183 | msgid "Delete the entire series" |
36 | 184 | msgstr "刪除整個系列" |
37 | 185 | |
186 | msgctxt "#30130" | |
187 | msgid "Created by Repeating Timer" | |
188 | msgstr "用重複定時器來產生" | |
189 | ||
190 | msgctxt "#30131" | |
191 | msgid "One time (manual)" | |
192 | msgstr "單次 (首動)" | |
193 | ||
194 | msgctxt "#30132" | |
195 | msgid "One time (guide)" | |
196 | msgstr "單次 (節目指南)" | |
197 | ||
198 | msgctxt "#30133" | |
199 | msgid "One time (wishlist)" | |
200 | msgstr "單次 (期望清單)" | |
201 | ||
202 | msgctxt "#30134" | |
203 | msgid "Repeating (manual)" | |
204 | msgstr "重複 (手動)" | |
205 | ||
206 | msgctxt "#30135" | |
207 | msgid "Repeating (guide)" | |
208 | msgstr "重複 (節目指南)" | |
209 | ||
210 | msgctxt "#30136" | |
211 | msgid "Repeating (wishlist)" | |
212 | msgstr "重複 (期望清單)" | |
213 | ||
38 | 214 | msgctxt "#30140" |
39 | 215 | msgid "Normal" |
40 | 216 | msgstr "一般" |
41 | 217 | |
42 | 218 | msgctxt "#30141" |
43 | 219 | msgid "High" |
44 | msgstr "高溫" | |
220 | msgstr "高" | |
45 | 221 | |
46 | 222 | msgctxt "#30142" |
47 | 223 | msgid "Low" |
48 | msgstr "低溫" | |
224 | msgstr "低" | |
225 | ||
226 | msgctxt "#30150" | |
227 | msgid "New Episodes Only" | |
228 | msgstr "僅新番" | |
229 | ||
230 | msgctxt "#30151" | |
231 | msgid "New and Rerun Episodes" | |
232 | msgstr "新番及重播" | |
233 | ||
234 | msgctxt "#30152" | |
235 | msgid "Live Only" | |
236 | msgstr "僅直播節目" | |
237 | ||
238 | msgctxt "#30160" | |
239 | msgid "Not Set" | |
240 | msgstr "未設定" | |
241 | ||
242 | msgctxt "#30161" | |
243 | msgid "Keep Latest Recordings" | |
244 | msgstr "保留最新的錄影檔" | |
245 | ||
246 | msgctxt "#30162" | |
247 | msgid "Keep Until I Watch" | |
248 | msgstr "保留至我看完" | |
249 | ||
250 | msgctxt "#30163" | |
251 | msgid "Keep Until Space Needed" | |
252 | msgstr "保留至空間不足" | |
253 | ||
254 | msgctxt "#30164" | |
255 | msgid "Keep Until I Delete" | |
256 | msgstr "保留至被我刪除" | |
257 | ||
258 | msgctxt "#30165" | |
259 | msgid "Keep For 1 Week" | |
260 | msgstr "保留1週" | |
261 | ||
262 | msgctxt "#30170" | |
263 | msgid "Keep As Many As Possible" | |
264 | msgstr "能放多少放多少" | |
265 | ||
266 | msgctxt "#30171" | |
267 | msgid "Keep 1 Recording" | |
268 | msgstr "保留1個錄影檔" | |
269 | ||
270 | msgctxt "#30172" | |
271 | msgid "Keep 2 Recordings" | |
272 | msgstr "保留2個錄影檔" | |
273 | ||
274 | msgctxt "#30173" | |
275 | msgid "Keep 3 Recordings" | |
276 | msgstr "保留3個錄影檔" | |
277 | ||
278 | msgctxt "#30174" | |
279 | msgid "Keep 4 Recordings" | |
280 | msgstr "保留4個錄影檔" | |
281 | ||
282 | msgctxt "#30175" | |
283 | msgid "Keep 5 Recordings" | |
284 | msgstr "保留5個錄影檔" | |
285 | ||
286 | msgctxt "#30176" | |
287 | msgid "Keep 6 Recordings" | |
288 | msgstr "保留6個錄影檔" | |
289 | ||
290 | msgctxt "#30177" | |
291 | msgid "Keep 7 Recordings" | |
292 | msgstr "保留7個錄影檔" | |
293 | ||
294 | msgctxt "#30178" | |
295 | msgid "Keep 10 Recordings" | |
296 | msgstr "保留10個錄影檔" |
17 | 17 | * |
18 | 18 | */ |
19 | 19 | |
20 | #include "libXBMC_addon.h" | |
20 | #include "kodi/libXBMC_addon.h" | |
21 | 21 | #include <string> |
22 | 22 | #include "p8-platform/os.h" |
23 | 23 | #include "client.h" |
62 | 62 | close(); |
63 | 63 | } |
64 | 64 | |
65 | bool Socket::setHostname ( const CStdString& host ) | |
65 | bool Socket::setHostname ( const std::string& host ) | |
66 | 66 | { |
67 | 67 | if (isalpha(host.c_str()[0])) |
68 | 68 | { |
139 | 139 | return true; |
140 | 140 | } |
141 | 141 | |
142 | int Socket::send( const CStdString& data ) | |
142 | int Socket::send( const std::string& data ) | |
143 | 143 | { |
144 | 144 | if (!is_valid()) |
145 | 145 | { |
198 | 198 | } |
199 | 199 | |
200 | 200 | //Receive until error or \n |
201 | bool Socket::ReadResponses(int &code, vector<CStdString> &lines) | |
201 | bool Socket::ReadResponses(int &code, vector<std::string> &lines) | |
202 | 202 | { |
203 | 203 | int result; |
204 | 204 | char buffer[4096]; // this buff size has to be known in server |
205 | 205 | code = 0; |
206 | 206 | |
207 | 207 | bool readComplete = false; |
208 | CStdString bigString = ""; | |
208 | std::string bigString = ""; | |
209 | 209 | |
210 | 210 | do |
211 | 211 | { |
234 | 234 | if (EndsWith(bigString, "<EOF>")) |
235 | 235 | { |
236 | 236 | readComplete = true; // all server data has benn read |
237 | lines = split(bigString, "<EOL>", true); // split each reponse by <EOL> delimiters | |
237 | lines = split(bigString, "<EOL>"); // split each reponse by <EOL> delimiters | |
238 | 238 | lines.erase(lines.end() - 1); // erase <EOF> at end |
239 | 239 | } |
240 | 240 | else |
247 | 247 | return readComplete; |
248 | 248 | } |
249 | 249 | |
250 | bool Socket::connect ( const CStdString& host, const unsigned short port ) | |
250 | bool Socket::connect ( const std::string& host, const unsigned short port ) | |
251 | 251 | { |
252 | 252 | if ( !is_valid() ) |
253 | 253 | { |
558 | 558 | #endif //TARGET_WINDOWS || TARGET_LINUX || TARGET_DARWIN || TARGET_FREEBSD |
559 | 559 | |
560 | 560 | |
561 | void Socket::SetServerName(CStdString strServerName) | |
561 | void Socket::SetServerName(std::string strServerName) | |
562 | 562 | { |
563 | 563 | _serverName = strServerName; |
564 | 564 | } |
565 | 565 | |
566 | void Socket::SetClientName(CStdString strClientName) | |
566 | void Socket::SetClientName(std::string strClientName) | |
567 | 567 | { |
568 | 568 | _clientName = strClientName; |
569 | 569 | } |
573 | 573 | _port = port; |
574 | 574 | } |
575 | 575 | |
576 | int Socket::SendRequest(CStdString requestStr) | |
577 | { | |
578 | CStdString sRequest; | |
579 | sRequest.Format("%s|%s<Client Quit>", _clientName.c_str(), requestStr.c_str()); // build the request string | |
576 | int Socket::SendRequest(std::string requestStr) | |
577 | { | |
578 | std::string sRequest; | |
579 | sRequest = string_format("%s|%s<Client Quit>", _clientName.c_str(), requestStr.c_str()); // build the request string | |
580 | 580 | int status = send(sRequest); |
581 | 581 | return status; |
582 | 582 | } |
587 | 587 | _timeout = tSec; |
588 | 588 | } |
589 | 589 | |
590 | std::vector<CStdString> Socket::GetVector(const CStdString &request, bool allowRetry, bool allowWOL /* = true*/) | |
590 | std::vector<std::string> Socket::GetVector(const std::string &request, bool allowRetry, bool allowWOL /* = true*/) | |
591 | 591 | { |
592 | 592 | int maxAttempts = 3; |
593 | 593 | int sleepAttemptsMs = 1000; |
595 | 595 | P8PLATFORM::CLockObject lock(m_mutex); // only process one request at a time |
596 | 596 | |
597 | 597 | int code; |
598 | std::vector<CStdString> reponses; | |
598 | std::vector<std::string> reponses; | |
599 | 599 | |
600 | 600 | int cntAttempts = 1; |
601 | 601 | while (cntAttempts <= maxAttempts) |
616 | 616 | XBMC->Log(LOG_INFO, "Socket::GetVector> Sending WOL packet to %s", g_strServerMAC.c_str()); |
617 | 617 | if (g_BackendOnline != BACKEND_UNKNOWN) |
618 | 618 | { |
619 | CStdString infoStr = XBMC->GetLocalizedString(30026); | |
619 | std::string infoStr = XBMC->GetLocalizedString(30026); | |
620 | 620 | XBMC->QueueNotification(QUEUE_INFO, infoStr.c_str()); // Notify WOL is being sent |
621 | 621 | } |
622 | XBMC->WakeOnLan(g_strServerMAC); // Send WOL request | |
622 | XBMC->WakeOnLan(g_strServerMAC.c_str()); // Send WOL request | |
623 | 623 | } |
624 | 624 | |
625 | 625 | if (!connect(_serverName, (unsigned short)_port)) // if this fails, it is likely due to server down |
670 | 670 | return reponses; // return responses |
671 | 671 | } |
672 | 672 | |
673 | CStdString Socket::GetString(const CStdString &request, bool allowRetry, bool allowWOL /* = true*/) | |
674 | { | |
675 | std::vector<CStdString> result = GetVector(request, allowRetry, allowWOL); | |
673 | std::string Socket::GetString(const std::string &request, bool allowRetry, bool allowWOL /* = true*/) | |
674 | { | |
675 | std::vector<std::string> result = GetVector(request, allowRetry, allowWOL); | |
676 | 676 | return result[0]; |
677 | 677 | } |
678 | 678 | |
679 | bool Socket::GetBool(const CStdString &request, bool allowRetry, bool allowWOL /* = true*/) | |
679 | bool Socket::GetBool(const std::string &request, bool allowRetry, bool allowWOL /* = true*/) | |
680 | 680 | { |
681 | 681 | return GetString(request, allowRetry, allowWOL) == "True"; |
682 | 682 | } |
683 | 683 | |
684 | 684 | |
685 | int Socket::GetInt(const CStdString &request, bool allowRetry, bool allowWOL /* = true*/) | |
686 | { | |
687 | CStdString valStr = GetString(request, allowRetry, allowWOL); | |
688 | long val = strtol(valStr, 0, 10); | |
685 | int Socket::GetInt(const std::string &request, bool allowRetry, bool allowWOL /* = true*/) | |
686 | { | |
687 | std::string valStr = GetString(request, allowRetry, allowWOL); | |
688 | long val = strtol(valStr.c_str(), 0, 10); | |
689 | 689 | return val; |
690 | 690 | } |
691 | 691 | |
692 | long long Socket::GetLL(const CStdString &request, bool allowRetry, bool allowWOL /* = true*/) | |
693 | { | |
694 | CStdString valStr = GetString(request, allowRetry, allowWOL); | |
695 | #ifdef TARGET_WINDOWS | |
696 | long long val = _strtoi64(valStr, 0, 10); | |
697 | #else | |
698 | long long val = strtoll(valStr, NULL, 10); | |
699 | #endif | |
692 | long long Socket::GetLL(const std::string &request, bool allowRetry, bool allowWOL /* = true*/) | |
693 | { | |
694 | std::string valStr = GetString(request, allowRetry, allowWOL); | |
695 | long long val = strtoll(valStr.c_str(), NULL, 10); | |
700 | 696 | return val; |
701 | 697 | } |
178 | 178 | _sockaddr.sin_port = htons ( port ); |
179 | 179 | }; |
180 | 180 | |
181 | bool setHostname ( const CStdString& host ); | |
181 | bool setHostname ( const std::string& host ); | |
182 | 182 | |
183 | 183 | // Server initialization |
184 | 184 | |
204 | 204 | //bool accept ( Socket& socket ) const; |
205 | 205 | |
206 | 206 | // Client initialization |
207 | bool connect ( const CStdString& host, const unsigned short port ); | |
207 | bool connect ( const std::string& host, const unsigned short port ); | |
208 | 208 | |
209 | 209 | bool reconnect(); |
210 | 210 | |
216 | 216 | * \param data Reference to a std::string with the data to transmit |
217 | 217 | * \return Number of bytes send or -1 in case of an error |
218 | 218 | */ |
219 | int send ( const CStdString& data ); | |
219 | int send ( const std::string& data ); | |
220 | 220 | |
221 | 221 | /*! |
222 | 222 | * Socket send function |
229 | 229 | |
230 | 230 | bool set_non_blocking ( const bool ); |
231 | 231 | |
232 | bool ReadResponses(int &code, std::vector<CStdString> &lines); | |
232 | bool ReadResponses(int &code, std::vector<std::string> &lines); | |
233 | 233 | |
234 | 234 | bool is_valid() const; |
235 | 235 | |
255 | 255 | |
256 | 256 | // client interface |
257 | 257 | private: |
258 | CStdString _serverName; | |
259 | CStdString _clientName; | |
258 | std::string _serverName; | |
259 | std::string _clientName; | |
260 | 260 | int _port; |
261 | int SendRequest(CStdString requestStr); | |
261 | int SendRequest(std::string requestStr); | |
262 | 262 | public: |
263 | void SetServerName(CStdString strServerName); | |
264 | void SetClientName(CStdString strClientName); | |
263 | void SetServerName(std::string strServerName); | |
264 | void SetClientName(std::string strClientName); | |
265 | 265 | void SetServerPort(int port); |
266 | std::vector<CStdString> GetVector(const CStdString &request, bool allowRetry, bool allowWOL = true); | |
267 | CStdString GetString(const CStdString &request, bool allowRetry, bool allowWOL = true); | |
268 | bool GetBool(const CStdString &request, bool allowRetry, bool allowWOL = true); | |
269 | int GetInt(const CStdString &request, bool allowRetry, bool allowWOL = true); | |
270 | long long GetLL(const CStdString &request, bool allowRetry, bool allowWOL = true); | |
266 | std::vector<std::string> GetVector(const std::string &request, bool allowRetry, bool allowWOL = true); | |
267 | std::string GetString(const std::string &request, bool allowRetry, bool allowWOL = true); | |
268 | bool GetBool(const std::string &request, bool allowRetry, bool allowWOL = true); | |
269 | int GetInt(const std::string &request, bool allowRetry, bool allowWOL = true); | |
270 | long long GetLL(const std::string &request, bool allowRetry, bool allowWOL = true); | |
271 | 271 | |
272 | 272 | void SetTimeOut(int tSec); |
273 | 273 | }; |
18 | 18 | */ |
19 | 19 | |
20 | 20 | #include "client.h" |
21 | #include "xbmc_pvr_dll.h" | |
21 | #include "kodi/xbmc_pvr_dll.h" | |
22 | 22 | #include "pvr2wmc.h" |
23 | 23 | #include "utilities.h" |
24 | 24 | #include "p8-platform/util/util.h" |
25 | 25 | |
26 | using namespace std; | |
27 | 26 | using namespace ADDON; |
28 | 27 | |
29 | #ifdef TARGET_WINDOWS | |
30 | #define snprintf _snprintf | |
31 | #endif | |
32 | 28 | |
33 | 29 | #define DEFAULT_PORT 9080 |
34 | 30 | #define DEFAULT_WAKEONLAN_ENABLE false |
43 | 39 | PVR_CHANNEL _currentChannel; |
44 | 40 | PVR_MENUHOOK *menuHook = NULL; |
45 | 41 | |
46 | CStdString g_strServerName; // the name of the server to connect to | |
47 | CStdString g_strClientName; // the name of the computer running addon | |
42 | std::string g_strServerName; // the name of the server to connect to | |
43 | std::string g_strClientName; // the name of the computer running addon | |
48 | 44 | int g_port; |
49 | 45 | bool g_bWakeOnLAN; // whether to send wake on LAN to server |
50 | CStdString g_strServerMAC; // MAC address of server | |
46 | std::string g_strServerMAC; // MAC address of server | |
51 | 47 | bool g_bSignalEnable; |
52 | 48 | int g_signalThrottle; |
53 | 49 | bool g_bEnableMultiResume; |
54 | CStdString g_clientOS; // OS of client, passed to server | |
50 | std::string g_clientOS; // OS of client, passed to server | |
55 | 51 | |
56 | 52 | backend_status g_BackendOnline; // whether the backend is online |
57 | 53 | |
59 | 55 | * Default values are defined inside client.h |
60 | 56 | * and exported to the other source files. |
61 | 57 | */ |
62 | CStdString g_strUserPath = ""; | |
63 | CStdString g_strClientPath = ""; | |
64 | CStdString g_AddonDataCustom = ""; // location of custom addondata settings file | |
58 | std::string g_strUserPath = ""; | |
59 | std::string g_strClientPath = ""; | |
60 | std::string g_AddonDataCustom = ""; // location of custom addondata settings file | |
65 | 61 | |
66 | 62 | CHelper_libXBMC_addon *XBMC = NULL; |
67 | 63 | CHelper_libXBMC_pvr *PVR = NULL; |
106 | 102 | XBMC->Log(LOG_ERROR, "Couldn't get 'wake_on_lan' setting, using '%s'", DEFAULT_WAKEONLAN_ENABLE); |
107 | 103 | } |
108 | 104 | |
109 | CStdString fileContent; | |
105 | std::string fileContent; | |
110 | 106 | if (ReadFileContents(g_AddonDataCustom, fileContent)) |
111 | 107 | { |
112 | 108 | g_strServerMAC = fileContent; |
138 | 134 | g_strClientName = buffer; // send this computers name to server |
139 | 135 | |
140 | 136 | #ifdef TARGET_WINDOWS |
141 | // get windows version | |
142 | OSVERSIONINFO osvi; | |
143 | ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); | |
144 | osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); | |
145 | GetVersionEx(&osvi); | |
146 | g_clientOS.Format("windows(%d.%d)", osvi.dwMajorVersion, osvi.dwMinorVersion); // set windows version string | |
137 | g_clientOS = "windows"; // set to the client OS name | |
147 | 138 | #elif defined TARGET_LINUX |
148 | 139 | g_clientOS = "linux"; // set to the client OS name |
149 | 140 | #elif defined TARGET_DARWIN |
151 | 142 | #elif defined TARGET_FREEBSD |
152 | 143 | g_clientOS = "freeBSD"; // set to the client OS name |
153 | 144 | #else |
154 | g_clientOS = ""; // set blank client OS name | |
145 | g_clientOS = ""; // set blank client OS name | |
155 | 146 | #endif |
156 | 147 | } |
157 | 148 | |
165 | 156 | |
166 | 157 | // register the addon |
167 | 158 | XBMC = new CHelper_libXBMC_addon; |
159 | ||
168 | 160 | if (!XBMC->RegisterMe(hdl)) |
169 | 161 | { |
170 | 162 | SAFE_DELETE(XBMC); |
230 | 222 | _CurStatus = ADDON_STATUS_UNKNOWN; |
231 | 223 | } |
232 | 224 | |
233 | bool ADDON_HasSettings() | |
234 | { | |
235 | return true; | |
236 | } | |
237 | ||
238 | unsigned int ADDON_GetSettings(ADDON_StructSetting ***sSet) | |
239 | { | |
240 | return 0; | |
241 | } | |
242 | ||
243 | 225 | // Called everytime a setting is changed by the user and to inform AddOn about |
244 | 226 | // new setting and to do required stuff to apply it. |
245 | 227 | ADDON_STATUS ADDON_SetSetting(const char *settingName, const void *settingValue) |
247 | 229 | if (!XBMC) |
248 | 230 | return ADDON_STATUS_OK; |
249 | 231 | |
250 | CStdString sName = settingName; | |
232 | std::string sName = settingName; | |
251 | 233 | |
252 | 234 | if (sName == "host") |
253 | 235 | { |
254 | CStdString oldName = g_strServerName; | |
236 | std::string oldName = g_strServerName; | |
255 | 237 | g_strServerName = (const char*)settingValue; |
256 | //if (g_strServerName == ".") | |
257 | // g_strServerName = LOCALHOST; | |
238 | ||
258 | 239 | XBMC->Log(LOG_INFO, "Setting 'host' changed from %s to %s", g_strServerName.c_str(), (const char*) settingValue); |
259 | 240 | if (oldName != g_strServerName) |
260 | 241 | return ADDON_STATUS_NEED_RESTART; |
263 | 244 | return ADDON_STATUS_OK; |
264 | 245 | } |
265 | 246 | |
266 | void ADDON_Stop() | |
267 | { | |
268 | } | |
269 | ||
270 | void ADDON_FreeSettings() | |
271 | { | |
272 | } | |
273 | ||
274 | 247 | /*********************************************************** |
275 | 248 | * PVR Client AddOn specific public library functions |
276 | 249 | ***********************************************************/ |
289 | 262 | |
290 | 263 | void OnPowerSavingDeactivated() |
291 | 264 | { |
292 | } | |
293 | ||
294 | const char* GetPVRAPIVersion(void) | |
295 | { | |
296 | static const char *strApiVersion = XBMC_PVR_API_VERSION; | |
297 | return strApiVersion; | |
298 | } | |
299 | ||
300 | const char* GetMininumPVRAPIVersion(void) | |
301 | { | |
302 | static const char *strMinApiVersion = XBMC_PVR_MIN_API_VERSION; | |
303 | return strMinApiVersion; | |
304 | } | |
305 | ||
306 | const char* GetGUIAPIVersion(void) | |
307 | { | |
308 | return ""; // GUI API not used | |
309 | } | |
310 | ||
311 | const char* GetMininumGUIAPIVersion(void) | |
312 | { | |
313 | return ""; // GUI API not used | |
314 | 265 | } |
315 | 266 | |
316 | 267 | PVR_ERROR GetAddonCapabilities(PVR_ADDON_CAPABILITIES* pCapabilities) |
327 | 278 | pCapabilities->bHandlesDemuxing = false; |
328 | 279 | pCapabilities->bSupportsRecordingPlayCount = true; |
329 | 280 | pCapabilities->bSupportsLastPlayedPosition = g_bEnableMultiResume; |
330 | pCapabilities->bSupportsRecordingEdl = false; | |
281 | pCapabilities->bSupportsRecordingEdl = true; | |
282 | pCapabilities->bSupportsRecordingsRename = true; | |
283 | pCapabilities->bSupportsRecordingsLifetimeChange = false; | |
284 | pCapabilities->bSupportsDescrambleInfo = false; | |
331 | 285 | |
332 | 286 | return PVR_ERROR_NO_ERROR; |
333 | 287 | } |
348 | 302 | |
349 | 303 | const char *GetConnectionString(void) |
350 | 304 | { |
351 | static CStdString strConnectionString; | |
352 | strConnectionString.Format("%s:%u", g_strServerName, g_port); | |
305 | static std::string strConnectionString; | |
306 | strConnectionString = string_format("%s:%u", g_strServerName.c_str(), g_port); | |
353 | 307 | return strConnectionString.c_str(); |
354 | 308 | } |
355 | 309 | |
374 | 328 | return PVR_ERROR_SERVER_ERROR; |
375 | 329 | } |
376 | 330 | |
377 | PVR_ERROR GetStreamProperties(PVR_STREAM_PROPERTIES* pProperties) | |
378 | { | |
331 | ||
332 | PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS &signalStatus) | |
333 | { | |
334 | if (_wmc) | |
335 | return _wmc->SignalStatus(signalStatus); | |
336 | ||
337 | return PVR_ERROR_NO_ERROR; | |
338 | } | |
339 | ||
340 | // channel functions ----------------------------- | |
341 | ||
342 | int GetChannelsAmount(void) | |
343 | { | |
344 | if (_wmc) | |
345 | return _wmc->GetChannelsAmount(); | |
346 | ||
347 | return -1; | |
348 | } | |
349 | ||
350 | PVR_ERROR GetChannels(ADDON_HANDLE handle, bool bRadio) | |
351 | { | |
352 | if (_wmc) | |
353 | return _wmc->GetChannels(handle, bRadio); | |
354 | ||
355 | return PVR_ERROR_SERVER_ERROR; | |
356 | } | |
357 | ||
358 | int GetChannelGroupsAmount(void) | |
359 | { | |
360 | if (_wmc) | |
361 | return _wmc->GetChannelGroupsAmount(); | |
362 | ||
363 | return -1; | |
364 | } | |
365 | ||
366 | PVR_ERROR GetChannelGroups(ADDON_HANDLE handle, bool bRadio) | |
367 | { | |
368 | if (_wmc) | |
369 | return _wmc->GetChannelGroups(handle, bRadio); | |
370 | ||
371 | return PVR_ERROR_SERVER_ERROR; | |
372 | } | |
373 | ||
374 | PVR_ERROR GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group) | |
375 | { | |
376 | if (_wmc) | |
377 | return _wmc->GetChannelGroupMembers(handle, group); | |
378 | ||
379 | return PVR_ERROR_SERVER_ERROR; | |
380 | } | |
381 | ||
382 | ||
383 | // timer functions ----------------------- | |
384 | ||
385 | PVR_ERROR GetTimerTypes(PVR_TIMER_TYPE types[], int *size) | |
386 | { | |
387 | if (_wmc) | |
388 | return _wmc->GetTimerTypes(types, size); | |
389 | ||
379 | 390 | return PVR_ERROR_NOT_IMPLEMENTED; |
380 | 391 | } |
381 | 392 | |
382 | PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS &signalStatus) | |
383 | { | |
384 | if (_wmc) | |
385 | return _wmc->SignalStatus(signalStatus); | |
386 | ||
387 | return PVR_ERROR_NO_ERROR; | |
388 | } | |
389 | ||
390 | // channel functions | |
391 | int GetChannelsAmount(void) | |
392 | { | |
393 | if (_wmc) | |
394 | return _wmc->GetChannelsAmount(); | |
395 | ||
396 | return -1; | |
397 | } | |
398 | ||
399 | PVR_ERROR GetChannels(ADDON_HANDLE handle, bool bRadio) | |
400 | { | |
401 | if (_wmc) | |
402 | return _wmc->GetChannels(handle, bRadio); | |
393 | int GetTimersAmount(void) | |
394 | { | |
395 | if (_wmc) | |
396 | return _wmc->GetTimersAmount(); | |
403 | 397 | |
404 | 398 | return PVR_ERROR_SERVER_ERROR; |
405 | 399 | } |
406 | 400 | |
407 | int GetChannelGroupsAmount(void) | |
408 | { | |
409 | if (_wmc) | |
410 | return _wmc->GetChannelGroupsAmount(); | |
411 | ||
412 | return -1; | |
413 | } | |
414 | ||
415 | PVR_ERROR GetChannelGroups(ADDON_HANDLE handle, bool bRadio) | |
416 | { | |
417 | if (_wmc) | |
418 | return _wmc->GetChannelGroups(handle, bRadio); | |
419 | ||
420 | return PVR_ERROR_SERVER_ERROR; | |
421 | } | |
422 | ||
423 | PVR_ERROR GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group) | |
424 | { | |
425 | if (_wmc) | |
426 | return _wmc->GetChannelGroupMembers(handle, group); | |
427 | ||
428 | return PVR_ERROR_SERVER_ERROR; | |
429 | } | |
430 | ||
431 | ||
432 | // timer functions | |
433 | PVR_ERROR GetTimerTypes(PVR_TIMER_TYPE types[], int *size) | |
434 | { | |
435 | if (_wmc) | |
436 | return _wmc->GetTimerTypes(types, size); | |
437 | ||
438 | return PVR_ERROR_NOT_IMPLEMENTED; | |
439 | } | |
440 | ||
441 | int GetTimersAmount(void) | |
442 | { | |
443 | if (_wmc) | |
444 | return _wmc->GetTimersAmount(); | |
445 | ||
446 | return PVR_ERROR_SERVER_ERROR; | |
447 | } | |
448 | ||
449 | 401 | PVR_ERROR GetTimers(ADDON_HANDLE handle) |
450 | 402 | { |
451 | /* TODO: Change implementation to get support for the timer features introduced with PVR API 1.9.7 */ | |
452 | 403 | if (_wmc) |
453 | 404 | return _wmc->GetTimers(handle); |
454 | 405 | |
500 | 451 | return PVR_ERROR_NOT_IMPLEMENTED; |
501 | 452 | } |
502 | 453 | |
503 | //#define TRUESWITCH | |
504 | ||
505 | bool SwitchChannel(const PVR_CHANNEL &channel) | |
506 | { | |
507 | //CloseLiveStream(); | |
508 | #ifdef TRUESWITCH | |
509 | ||
510 | if (_wmc) | |
511 | { | |
512 | return _wmc->SwitchChannel(channel); | |
513 | } | |
514 | return false; | |
515 | #else | |
516 | return OpenLiveStream(channel); // this will perform the closing of a current live stream itself | |
517 | #endif | |
518 | } | |
519 | ||
520 | // live stream functions | |
454 | ||
455 | // live stream functions --------------------------- | |
456 | ||
521 | 457 | bool OpenLiveStream(const PVR_CHANNEL &channel) |
522 | 458 | { |
523 | 459 | if (_wmc) |
524 | 460 | { |
525 | //CloseLiveStream(); | |
526 | 461 | if (_wmc->OpenLiveStream(channel)) |
527 | 462 | { |
528 | 463 | _bIsPlaying = true; |
590 | 525 | return true; |
591 | 526 | } |
592 | 527 | |
593 | // recorded stream functions (other "Open" these just call the live stream functions) | |
528 | // recorded stream functions ----------------------------- | |
529 | ||
594 | 530 | bool OpenRecordedStream(const PVR_RECORDING &recording) |
595 | 531 | { |
596 | 532 | if (_wmc) |
647 | 583 | return -1; |
648 | 584 | } |
649 | 585 | |
650 | // recorded file functions | |
586 | // recorded file functions ----------------- | |
587 | ||
651 | 588 | PVR_ERROR DeleteRecording(const PVR_RECORDING &recording) |
652 | 589 | { |
653 | 590 | if (_wmc) |
662 | 599 | return _wmc->SetRecordingLastPlayedPosition(recording, lastplayedposition); |
663 | 600 | return PVR_ERROR_NOT_IMPLEMENTED; |
664 | 601 | } |
602 | ||
665 | 603 | int GetRecordingLastPlayedPosition(const PVR_RECORDING &recording) |
666 | 604 | { |
667 | 605 | if (_wmc && g_bEnableMultiResume) |
676 | 614 | return PVR_ERROR_NOT_IMPLEMENTED; |
677 | 615 | } |
678 | 616 | |
679 | ||
680 | PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_MENUHOOK_DATA &item) | |
681 | { | |
682 | return PVR_ERROR_NOT_IMPLEMENTED; | |
683 | } | |
617 | // time shift functions ----------------- | |
684 | 618 | |
685 | 619 | bool IsTimeshifting(void) |
686 | 620 | { |
689 | 623 | else |
690 | 624 | return false; |
691 | 625 | } |
692 | time_t GetPlayingTime() | |
693 | { | |
694 | if (_wmc) | |
695 | return _wmc->GetPlayingTime(); | |
696 | else | |
697 | return 0; | |
698 | } | |
699 | time_t GetBufferTimeStart() | |
700 | { | |
701 | if (_wmc) | |
702 | return _wmc->GetBufferTimeStart(); | |
703 | else | |
704 | return 0; | |
705 | } | |
706 | time_t GetBufferTimeEnd() | |
707 | { | |
708 | if (_wmc) | |
709 | return _wmc->GetBufferTimeEnd(); | |
710 | else | |
711 | return 0; | |
626 | ||
627 | PVR_ERROR GetStreamTimes(PVR_STREAM_TIMES *strTimes) | |
628 | { | |
629 | if (_wmc) | |
630 | return _wmc->GetStreamTimes(strTimes); | |
631 | else | |
632 | return PVR_ERROR_SERVER_ERROR; | |
633 | } | |
634 | ||
635 | ||
636 | PVR_ERROR GetRecordingEdl(const PVR_RECORDING &recording, PVR_EDL_ENTRY edlEntries[], int *count) | |
637 | { | |
638 | if (_wmc) | |
639 | return _wmc->GetRecordingEdl(recording, edlEntries, count); | |
640 | else | |
641 | return PVR_ERROR_SERVER_ERROR; | |
712 | 642 | } |
713 | 643 | |
714 | 644 | /** UNUSED API FUNCTIONS */ |
722 | 652 | void DemuxFlush(void) {} |
723 | 653 | void DemuxAbort(void) {} |
724 | 654 | DemuxPacket* DemuxRead(void) { return NULL; } |
725 | unsigned int GetChannelSwitchDelay(void) { return 0; } | |
726 | const char * GetLiveStreamURL(const PVR_CHANNEL &channel) { return ""; } | |
727 | bool SeekTime(int,bool,double*) { return false; } | |
655 | bool SeekTime(double,bool,double*) { return false; } | |
728 | 656 | void SetSpeed(int) {}; |
729 | 657 | bool IsRealTimeStream(void) { return true; } |
730 | PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY[], int*) { return PVR_ERROR_NOT_IMPLEMENTED; }; | |
731 | 658 | PVR_ERROR UndeleteRecording(const PVR_RECORDING& recording) { return PVR_ERROR_NOT_IMPLEMENTED; } |
732 | 659 | PVR_ERROR DeleteAllRecordingsFromTrash() { return PVR_ERROR_NOT_IMPLEMENTED; } |
733 | 660 | PVR_ERROR SetEPGTimeFrame(int) { return PVR_ERROR_NOT_IMPLEMENTED; } |
734 | ||
661 | PVR_ERROR GetDescrambleInfo(PVR_DESCRAMBLE_INFO*) { return PVR_ERROR_NOT_IMPLEMENTED; } | |
662 | PVR_ERROR SetRecordingLifetime(const PVR_RECORDING*) { return PVR_ERROR_NOT_IMPLEMENTED; } | |
663 | PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_MENUHOOK_DATA &item) { return PVR_ERROR_NOT_IMPLEMENTED; } | |
664 | ||
665 | PVR_ERROR IsEPGTagPlayable(const EPG_TAG*, bool*) { return PVR_ERROR_NOT_IMPLEMENTED; } | |
666 | PVR_ERROR IsEPGTagRecordable(const EPG_TAG*, bool*) { return PVR_ERROR_NOT_IMPLEMENTED; } | |
667 | PVR_ERROR GetEPGTagStreamProperties(const EPG_TAG*, PVR_NAMED_VALUE*, unsigned int*) { return PVR_ERROR_NOT_IMPLEMENTED; } | |
668 | PVR_ERROR GetEPGTagEdl(const EPG_TAG* epgTag, PVR_EDL_ENTRY edl[], int *size) { return PVR_ERROR_NOT_IMPLEMENTED; } | |
669 | ||
670 | PVR_ERROR GetStreamProperties(PVR_STREAM_PROPERTIES* pProperties) { return PVR_ERROR_NOT_IMPLEMENTED; } | |
671 | PVR_ERROR GetChannelStreamProperties(const PVR_CHANNEL* channel, PVR_NAMED_VALUE* properties, unsigned int* iPropertiesCount) { return PVR_ERROR_NOT_IMPLEMENTED; } | |
672 | PVR_ERROR GetRecordingStreamProperties(const PVR_RECORDING*, PVR_NAMED_VALUE*, unsigned int*) { return PVR_ERROR_NOT_IMPLEMENTED; } | |
673 | PVR_ERROR GetStreamReadChunkSize(int* chunksize) { return PVR_ERROR_NOT_IMPLEMENTED; } | |
735 | 674 | } |
18 | 18 | */ |
19 | 19 | #pragma once |
20 | 20 | |
21 | #include "libXBMC_addon.h" | |
22 | #include "libXBMC_pvr.h" | |
23 | #include "libKODI_guilib.h" | |
24 | #include "p8-platform/util/StdString.h" | |
21 | ||
22 | #include "kodi/libXBMC_addon.h" | |
23 | #include "kodi/libXBMC_pvr.h" | |
24 | #include "kodi/libKODI_guilib.h" | |
25 | #include <p8-platform/util/StringUtils.h> | |
25 | 26 | |
26 | 27 | #include "clientversion.h" |
27 | 28 | |
29 | #define string_format StringUtils::Format | |
30 | #define split StringUtils::Split | |
31 | ||
28 | 32 | extern bool m_bCreated; |
29 | extern CStdString g_strUserPath; | |
30 | extern CStdString g_strClientPath; | |
31 | extern CStdString g_strServerName; // the name of the server to connect to | |
32 | extern CStdString g_strClientName; // the name of the computer running addon | |
33 | extern CStdString g_clientOS; // OS of client, passed to server | |
33 | extern std::string g_strUserPath; | |
34 | extern std::string g_strClientPath; | |
35 | extern std::string g_strServerName; // the name of the server to connect to | |
36 | extern std::string g_strClientName; // the name of the computer running addon | |
37 | extern std::string g_clientOS; // OS of client, passed to server | |
34 | 38 | extern int g_port; |
35 | 39 | extern bool g_bSignalEnable; |
36 | 40 | extern int g_signalThrottle; |
37 | 41 | extern bool g_bEnableMultiResume; |
38 | 42 | extern ADDON::CHelper_libXBMC_addon *XBMC; |
39 | 43 | extern CHelper_libXBMC_pvr *PVR; |
40 | extern CStdString g_strServerMAC; | |
44 | extern std::string g_strServerMAC; | |
41 | 45 | extern bool g_bWakeOnLAN; |
42 | extern CStdString g_AddonDataCustom; | |
46 | extern std::string g_AddonDataCustom; | |
43 | 47 | |
44 | 48 | enum backend_status |
45 | 49 | { |
18 | 18 | */ |
19 | 19 | #pragma once |
20 | 20 | |
21 | inline CStdString PVRWMC_GetClientVersion() | |
21 | inline std::string PVRWMC_GetClientVersion() | |
22 | 22 | { |
23 | return "1.3.0"; // ALSO CHANGE IN REV NUMBER in 'pvr.wmc/addon.xml.in' | |
23 | return "2.4.4"; // ALSO CHANGE IN REV NUMBER in 'pvr.wmc/addon.xml.in' | |
24 | 24 | } |
31 | 31 | #define null NULL |
32 | 32 | |
33 | 33 | #define STRCPY(dest, src) strncpy(dest, src, sizeof(dest)-1); |
34 | #define FOREACH(ss, vv) for(std::vector<CStdString>::iterator ss = vv.begin(); ss != vv.end(); ++ss) | |
35 | ||
36 | #define FAKE_TS_LENGTH 2000000 // a fake file length for give to xbmc (used to insert duration headers) | |
34 | #define FOREACH(ss, vv) for(std::vector<std::string>::iterator ss = vv.begin(); ss != vv.end(); ++ss) | |
37 | 35 | |
38 | 36 | int64_t _lastRecordingUpdateTime; // the time of the last recording display update |
39 | 37 | |
40 | int _buffTimesCnt; // filter how often we do buffer status reads | |
41 | int _buffTimeFILTER; | |
38 | long _buffTimesCnt; // filter how often we do buffer status reads | |
39 | long _buffTimeFILTER; | |
42 | 40 | |
43 | 41 | Pvr2Wmc::Pvr2Wmc(void) |
44 | 42 | { |
58 | 56 | |
59 | 57 | _initialStreamResetCnt = 0; // used to count how many times we reset the stream position (due to 2 pass demuxer) |
60 | 58 | _initialStreamPosition = 0; // used to set an initial position (multiple clients watching the same live tv buffer) |
61 | ||
62 | _insertDurationHeader = false; // if true, insert a duration header for active Rec TS file | |
63 | _durationHeader = ""; // the header to insert (received from server) | |
64 | 59 | |
65 | 60 | _lastRecordingUpdateTime = 0; // time of last recording display update |
66 | 61 | _lostStream = false; // set to true if stream is lost |
80 | 75 | |
81 | 76 | bool Pvr2Wmc::IsServerDown() |
82 | 77 | { |
83 | CStdString request; | |
84 | request.Format("GetServiceStatus|%s|%s", PVRWMC_GetClientVersion(), g_clientOS); | |
78 | std::string request; | |
79 | request = string_format("GetServiceStatus|%s|%s", PVRWMC_GetClientVersion().c_str(), g_clientOS.c_str()); | |
85 | 80 | _socketClient.SetTimeOut(10); // set a timout interval for checking if server is down |
86 | vector<CStdString> results = _socketClient.GetVector(request, true); // get serverstatus | |
81 | vector<std::string> results = _socketClient.GetVector(request, true); // get serverstatus | |
87 | 82 | bool isServerDown = (results[0] != "True"); // true if server is down |
88 | 83 | |
89 | 84 | // GetServiceStatus may return any updates requested by server |
104 | 99 | { |
105 | 100 | if (!IsServerDown()) |
106 | 101 | { |
107 | static CStdString strVersion = "0.0"; | |
102 | static std::string strVersion = "0.0"; | |
108 | 103 | |
109 | 104 | // Send client's time (in UTC) to backend |
110 | 105 | time_t now = time(NULL); |
112 | 107 | strftime(datestr, 32, "%Y-%m-%d %H:%M:%S", gmtime(&now)); |
113 | 108 | |
114 | 109 | // Also send this client's setting for backend servername (so server knows how it is being accessed) |
115 | CStdString request; | |
116 | request.Format("GetServerVersion|%s|%s", datestr, g_strServerName.c_str()); | |
117 | vector<CStdString> results = _socketClient.GetVector(request, true); | |
110 | std::string request; | |
111 | request = string_format("GetServerVersion|%s|%s", datestr, g_strServerName.c_str()); | |
112 | vector<std::string> results = _socketClient.GetVector(request, true); | |
118 | 113 | if (results.size() > 0) |
119 | 114 | { |
120 | strVersion = CStdString(results[0]); | |
115 | strVersion = std::string(results[0]); | |
121 | 116 | } |
122 | 117 | if (results.size() > 1) |
123 | 118 | { |
124 | _serverBuild = atoi(results[1]); // get server build number for feature checking | |
119 | _serverBuild = atoi(results[1].c_str()); // get server build number for feature checking | |
125 | 120 | } |
126 | 121 | // check if recorded tv folder is accessible from client |
127 | 122 | if (results.size() > 2 && results[2] != "") // if server sends empty string, skip check |
128 | 123 | { |
129 | if (!XBMC->DirectoryExists(results[2])) | |
124 | if (!XBMC->DirectoryExists(results[2].c_str())) | |
130 | 125 | { |
131 | 126 | XBMC->Log(LOG_ERROR, "Recorded tv '%s' does not exist", results[2].c_str()); |
132 | CStdString infoStr = XBMC->GetLocalizedString(30017); | |
127 | std::string infoStr = XBMC->GetLocalizedString(30017); | |
133 | 128 | XBMC->QueueNotification(QUEUE_ERROR, infoStr.c_str()); |
134 | 129 | } |
135 | else if (!XBMC->CanOpenDirectory(results[2])) | |
130 | else if (!XBMC->CanOpenDirectory(results[2].c_str())) | |
136 | 131 | { |
137 | 132 | XBMC->Log(LOG_ERROR, "Recorded tv '%s' count not be opened", results[2].c_str()); |
138 | CStdString infoStr = XBMC->GetLocalizedString(30018); | |
133 | std::string infoStr = XBMC->GetLocalizedString(30018); | |
139 | 134 | XBMC->QueueNotification(QUEUE_ERROR, infoStr.c_str()); |
140 | 135 | } |
141 | 136 | } |
478 | 473 | } |
479 | 474 | |
480 | 475 | // test for returned error vector from server, handle accompanying messages if any |
481 | bool isServerError(vector<CStdString> results) | |
476 | bool isServerError(vector<std::string> results) | |
482 | 477 | { |
483 | 478 | if (results[0] == "error") |
484 | 479 | { |
491 | 486 | int errorID = atoi(results[2].c_str()); |
492 | 487 | if (errorID != 0) |
493 | 488 | { |
494 | CStdString errStr = XBMC->GetLocalizedString(errorID); | |
489 | std::string errStr = XBMC->GetLocalizedString(errorID); | |
495 | 490 | XBMC->QueueNotification(QUEUE_ERROR, errStr.c_str()); |
496 | 491 | } |
497 | 492 | } |
502 | 497 | } |
503 | 498 | |
504 | 499 | // look at result vector from server and perform any updates requested |
505 | void Pvr2Wmc::TriggerUpdates(vector<CStdString> results) | |
500 | void Pvr2Wmc::TriggerUpdates(vector<std::string> results) | |
506 | 501 | { |
507 | 502 | FOREACH(response, results) |
508 | 503 | { |
509 | vector<CStdString> v = split(*response, "|"); // split to unpack string | |
504 | vector<std::string> v = split(*response, "|"); // split to unpack string | |
510 | 505 | |
511 | 506 | if (v.size() < 1) |
512 | 507 | { |
539 | 534 | } |
540 | 535 | |
541 | 536 | XBMC->Log(LOG_INFO, "Received message from backend: %s", response->c_str()); |
542 | CStdString infoStr; | |
537 | std::string infoStr; | |
543 | 538 | |
544 | 539 | // Get notification level |
545 | 540 | int level = atoi(v[1].c_str()); |
587 | 582 | } |
588 | 583 | } |
589 | 584 | |
590 | void Pvr2Wmc::ExtractDriveSpace(vector<CStdString> results) | |
585 | void Pvr2Wmc::ExtractDriveSpace(vector<std::string> results) | |
591 | 586 | { |
592 | 587 | FOREACH(response, results) |
593 | 588 | { |
594 | vector<CStdString> v = split(*response, "|"); // split to unpack string | |
589 | vector<std::string> v = split(*response, "|"); // split to unpack string | |
595 | 590 | |
596 | 591 | if (v.size() < 1) |
597 | 592 | { |
618 | 613 | if (IsServerDown()) |
619 | 614 | return PVR_ERROR_SERVER_ERROR; |
620 | 615 | |
621 | CStdString request; | |
622 | request.Format("GetChannels|%s", bRadio ? "True" : "False"); | |
623 | vector<CStdString> results = _socketClient.GetVector(request, true); | |
616 | std::string request; | |
617 | request = string_format("GetChannels|%s", bRadio ? "True" : "False"); | |
618 | vector<std::string> results = _socketClient.GetVector(request, true); | |
624 | 619 | |
625 | 620 | FOREACH(response, results) |
626 | 621 | { |
627 | 622 | PVR_CHANNEL xChannel; |
628 | 623 | |
629 | 624 | memset(&xChannel, 0, sizeof(PVR_CHANNEL)); // set all mem to zero |
630 | vector<CStdString> v = split(*response, "|"); | |
625 | vector<std::string> v = StringUtils::Split(*response, "|"); | |
631 | 626 | // packing: id, bradio, c.OriginalNumber, c.CallSign, c.IsEncrypted, imageStr, c.IsBlocked |
632 | 627 | |
633 | 628 | if (v.size() < 9) |
637 | 632 | } |
638 | 633 | |
639 | 634 | // Populate Channel (and optionally subchannel if one was provided) |
640 | vector<CStdString> c = split(v[7], "."); | |
635 | vector<std::string> c = split(v[7], "."); | |
641 | 636 | if (c.size() > 1) |
642 | 637 | { |
643 | 638 | xChannel.iChannelNumber = atoi(c[0].c_str()); |
652 | 647 | xChannel.bIsRadio = Str2Bool(v[1]); |
653 | 648 | STRCPY(xChannel.strChannelName, v[3].c_str()); |
654 | 649 | xChannel.iEncryptionSystem = Str2Bool(v[4]); |
655 | if (v[5].compare("NULL") != 0) // if icon path is null | |
650 | if (v[5].compare("NULL") != 0) // if icon path is not null | |
656 | 651 | STRCPY(xChannel.strIconPath, v[5].c_str()); |
657 | 652 | xChannel.bIsHidden = Str2Bool(v[6]); |
658 | 653 | |
659 | // Populate Stream DLNA URL if present | |
660 | if (v.size() >= 10 && v[9] != "") | |
661 | { | |
662 | STRCPY(xChannel.strStreamURL, v[9].c_str()); | |
663 | } | |
664 | ||
665 | 654 | PVR->TransferChannelEntry(handle, &xChannel); |
666 | 655 | } |
667 | 656 | return PVR_ERROR_NO_ERROR; |
680 | 669 | if (IsServerDown()) |
681 | 670 | return PVR_ERROR_SERVER_ERROR; |
682 | 671 | |
683 | CStdString request; | |
684 | request.Format("GetChannelGroups|%s", bRadio ? "True" : "False"); | |
685 | vector<CStdString> results = _socketClient.GetVector(request, true); | |
672 | std::string request; | |
673 | request = string_format("GetChannelGroups|%s", bRadio ? "True" : "False"); | |
674 | vector<std::string> results = _socketClient.GetVector(request, true); | |
686 | 675 | |
687 | 676 | FOREACH(response, results) |
688 | 677 | { |
689 | 678 | PVR_CHANNEL_GROUP xGroup; |
690 | 679 | memset(&xGroup, 0, sizeof(PVR_CHANNEL_GROUP)); |
691 | 680 | |
692 | vector<CStdString> v = split(*response, "|"); | |
681 | vector<std::string> v = split(*response, "|"); | |
693 | 682 | |
694 | 683 | if (v.size() < 1) |
695 | 684 | { |
717 | 706 | if (IsServerDown()) |
718 | 707 | return PVR_ERROR_SERVER_ERROR; |
719 | 708 | |
720 | CStdString request; | |
721 | request.Format("GetChannelGroupMembers|%s|%s", group.bIsRadio ? "True" : "False", group.strGroupName); | |
722 | vector<CStdString> results = _socketClient.GetVector(request, true); | |
709 | std::string request; | |
710 | request = string_format("GetChannelGroupMembers|%s|%s", group.bIsRadio ? "True" : "False", group.strGroupName); | |
711 | vector<std::string> results = _socketClient.GetVector(request, true); | |
723 | 712 | |
724 | 713 | FOREACH(response, results) |
725 | 714 | { |
726 | 715 | PVR_CHANNEL_GROUP_MEMBER xGroupMember; |
727 | 716 | memset(&xGroupMember, 0, sizeof(PVR_CHANNEL_GROUP_MEMBER)); |
728 | 717 | |
729 | vector<CStdString> v = split(*response, "|"); | |
718 | vector<std::string> v = split(*response, "|"); | |
730 | 719 | |
731 | 720 | if (v.size() < 2) |
732 | 721 | { |
749 | 738 | if (IsServerDown()) |
750 | 739 | return PVR_ERROR_SERVER_ERROR; |
751 | 740 | |
752 | CStdString request; | |
753 | request.Format("GetEntries|%d|%d|%d", channel.iUniqueId, iStart, iEnd); // build the request string | |
754 | ||
755 | vector<CStdString> results = _socketClient.GetVector(request, true); // get entries from server | |
741 | std::string request; | |
742 | request = string_format("GetEntries|%u|%lld|%lld", channel.iUniqueId, (long long)iStart, (long long)iEnd); // build the request string | |
743 | ||
744 | vector<std::string> results = _socketClient.GetVector(request, true); // get entries from server | |
756 | 745 | |
757 | 746 | FOREACH(response, results) |
758 | 747 | { |
759 | 748 | EPG_TAG xEpg; |
760 | 749 | memset(&xEpg, 0, sizeof(EPG_TAG)); // set all mem to zero |
761 | vector<CStdString> v = split(*response, "|"); // split to unpack string | |
750 | vector<std::string> v = split(*response, "|"); // split to unpack string | |
762 | 751 | |
763 | 752 | if (v.size() < 16) |
764 | 753 | { |
773 | 762 | // e.Program.EpisodeTitle |
774 | 763 | // (MB3 fields) channelID, audioFormat, GenreString, ProgramType |
775 | 764 | // actors, directors, writers, year, movieID |
765 | xEpg.iUniqueChannelId = channel.iUniqueId; // assign unique channel ID | |
776 | 766 | xEpg.iUniqueBroadcastId = atoi(v[0].c_str()); // entry ID |
777 | 767 | xEpg.strTitle = v[1].c_str(); // entry title |
778 | xEpg.iChannelNumber = atoi(v[2].c_str()); // channel number | |
779 | 768 | xEpg.startTime = atol(v[3].c_str()); // start time |
780 | 769 | xEpg.endTime = atol(v[4].c_str()); // end time |
781 | 770 | xEpg.strPlotOutline = v[5].c_str(); // short plot description (currently using episode name, if there is one) |
832 | 821 | return PVR_ERROR_SERVER_ERROR; |
833 | 822 | |
834 | 823 | // Send request to ServerWMC |
835 | CStdString command = ""; | |
824 | std::string command = ""; | |
836 | 825 | command = "SetTimerKodi" + Timer2String(xTmr); // convert timer to string |
837 | 826 | |
838 | vector<CStdString> results = _socketClient.GetVector(command, false); // get results from server | |
827 | vector<std::string> results = _socketClient.GetVector(command, false); // get results from server | |
839 | 828 | |
840 | 829 | PVR->TriggerTimerUpdate(); // update timers regardless of whether there is an error |
841 | 830 | |
851 | 840 | { |
852 | 841 | FOREACH(result, results) |
853 | 842 | { |
854 | vector<CStdString> splitResult = split(*result, "|"); // split to unpack extra info on each result | |
855 | CStdString infoStr; | |
843 | vector<std::string> splitResult = split(*result, "|"); // split to unpack extra info on each result | |
844 | std::string infoStr; | |
856 | 845 | |
857 | 846 | if (splitResult[0] == "recordingNow") // recording is active now |
858 | 847 | { |
890 | 879 | } |
891 | 880 | } |
892 | 881 | |
893 | CStdString Pvr2Wmc::Timer2String(const PVR_TIMER &xTmr) | |
894 | { | |
895 | CStdString tStr; | |
882 | std::string Pvr2Wmc::Timer2String(const PVR_TIMER &xTmr) | |
883 | { | |
884 | std::string tStr; | |
896 | 885 | |
897 | 886 | bool bRepeating = xTmr.iTimerType >= TIMER_REPEATING_MIN && xTmr.iTimerType <= TIMER_REPEATING_MAX; |
898 | 887 | bool bKeyword = xTmr.iTimerType == TIMER_REPEATING_KEYWORD || xTmr.iTimerType == TIMER_ONCE_KEYWORD || xTmr.iTimerType == TIMER_ONCE_KEYWORD_CHILD; |
899 | 888 | bool bManual = xTmr.iTimerType == TIMER_ONCE_MANUAL || xTmr.iTimerType == TIMER_ONCE_MANUAL_CHILD || xTmr.iTimerType == TIMER_REPEATING_MANUAL; |
900 | 889 | |
901 | tStr.Format("|%d|%d|%d|%d|%d|%s|%d|%d|%d|%d|%d", | |
902 | xTmr.iClientIndex, xTmr.iClientChannelUid, xTmr.startTime, xTmr.endTime, PVR_TIMER_STATE_NEW, // 0-4 | |
890 | //was ("|%d|%d|%d|%d|%d|%s|%d|%d|%d|%d|%d", | |
891 | tStr = string_format("|%u|%d|%lld|%lld|%d|%s|%d|%u|%u|%d|%u", | |
892 | xTmr.iClientIndex, xTmr.iClientChannelUid, (long long)xTmr.startTime, (long long)xTmr.endTime, PVR_TIMER_STATE_NEW, // 0-4 | |
903 | 893 | xTmr.strTitle, xTmr.iPriority, xTmr.iMarginStart, xTmr.iMarginEnd, bRepeating, // 5-9 |
904 | 894 | xTmr.iEpgUid); // 10 |
905 | 895 | |
906 | 896 | // Append extra fields from Kodi 16 |
907 | CStdString extra; | |
908 | extra.Format("|%d|%d|%d|%d|%d|%d|%s|%d|%d", | |
897 | std::string extra; | |
898 | //was ("|%d|%d|%d|%d|%d|%d|%s|%d|%d", | |
899 | extra = string_format("|%u|%d|%u|%d|%d|%d|%s|%d|%d", | |
909 | 900 | xTmr.iPreventDuplicateEpisodes, xTmr.bStartAnyTime, xTmr.iWeekdays, // 11-13 param |
910 | 901 | xTmr.iLifetime, bKeyword, xTmr.bFullTextEpgSearch, xTmr.strEpgSearchString, xTmr.iMaxRecordings, bManual); // 14-19 |
911 | 902 | tStr.append(extra); |
920 | 911 | |
921 | 912 | bool bRepeating = xTmr.iTimerType >= TIMER_REPEATING_MIN && xTmr.iTimerType <= TIMER_REPEATING_MAX; |
922 | 913 | |
923 | CStdString command = "DeleteTimerKodi"; | |
924 | command.Format("DeleteTimerKodi|%d|%d", xTmr.iClientIndex, bRepeating); | |
914 | std::string command = "DeleteTimerKodi"; | |
915 | command = string_format("DeleteTimerKodi|%u|%d", xTmr.iClientIndex, bRepeating); | |
925 | 916 | |
926 | vector<CStdString> results = _socketClient.GetVector(command, false); // get results from server | |
917 | vector<std::string> results = _socketClient.GetVector(command, false); // get results from server | |
927 | 918 | |
928 | 919 | PVR->TriggerTimerUpdate(); // update timers regardless of whether there is an error |
929 | 920 | |
943 | 934 | if (IsServerDown()) |
944 | 935 | return PVR_ERROR_SERVER_ERROR; |
945 | 936 | |
946 | vector<CStdString> responsesSeries = _socketClient.GetVector("GetSeriesTimers", true); | |
937 | vector<std::string> responsesSeries = _socketClient.GetVector("GetSeriesTimers", true); | |
947 | 938 | FOREACH(response, responsesSeries) |
948 | 939 | { |
949 | 940 | PVR_TIMER xTmr; |
950 | 941 | memset(&xTmr, 0, sizeof(PVR_TIMER)); // set all struct to zero |
951 | 942 | |
952 | vector<CStdString> v = split(*response, "|"); // split to unpack string | |
943 | vector<std::string> v = split(*response, "|"); // split to unpack string | |
953 | 944 | if (v.size() < 24) |
954 | 945 | { |
955 | 946 | XBMC->Log(LOG_DEBUG, "Wrong number of fields xfered for SeriesTimer data"); |
961 | 952 | // [1] Title (superceded by [17] Timer Name) |
962 | 953 | xTmr.iClientChannelUid = atoi(v[2].c_str()); // [2] channel id |
963 | 954 | xTmr.iEpgUid = atoi(v[3].c_str()); // [3] epg ID (same as client ID, except for a 'manual' record) |
964 | STRCPY(xTmr.strSummary, v[4].c_str()); // [4] currently set to episode description | |
955 | STRCPY(xTmr.strSummary, v[4].c_str()); // [4] currently set to description | |
965 | 956 | xTmr.startTime = atoi(v[5].c_str()); // [5] start time |
966 | 957 | xTmr.endTime = atoi(v[6].c_str()); // [6] end time |
967 | 958 | xTmr.iMarginStart = atoi(v[7].c_str()); // [7] rec margin at start (sec) |
996 | 987 | bool hasKeyword = strlen(xTmr.strEpgSearchString) > 0; |
997 | 988 | bool hasEPG = (xTmr.iEpgUid != PVR_TIMER_NO_EPG_UID); |
998 | 989 | xTmr.iTimerType = hasKeyword ? TIMER_REPEATING_KEYWORD : hasEPG ? TIMER_REPEATING_EPG : TIMER_REPEATING_MANUAL; |
999 | ||
990 | ||
1000 | 991 | PVR->TransferTimerEntry(handle, &xTmr); |
1001 | 992 | } |
1002 | 993 | |
1003 | vector<CStdString> responsesTimers = _socketClient.GetVector("GetTimers", true); | |
994 | vector<std::string> responsesTimers = _socketClient.GetVector("GetTimers", true); | |
1004 | 995 | FOREACH(response, responsesTimers) |
1005 | 996 | { |
1006 | 997 | PVR_TIMER xTmr; |
1007 | 998 | memset(&xTmr, 0, sizeof(PVR_TIMER)); // set all struct to zero |
1008 | 999 | |
1009 | vector<CStdString> v = split(*response, "|"); // split to unpack string | |
1000 | vector<std::string> v = split(*response, "|"); // split to unpack string | |
1010 | 1001 | // eId, chId, start_t, end_t, pState, |
1011 | 1002 | // rp.Program.Title, ""/*recdir*/, rp.Program.EpisodeTitle/*summary?*/, rp.Priority, rp.Request.IsRecurring, |
1012 | 1003 | // eId, preMargin, postMargin, genre, subgenre |
1025 | 1016 | xTmr.state = (PVR_TIMER_STATE)atoi(v[4].c_str()); // [4] current state of time |
1026 | 1017 | STRCPY(xTmr.strTitle, v[5].c_str()); // [5] timer name (set to same as Program title) |
1027 | 1018 | STRCPY(xTmr.strDirectory, v[6].c_str()); // [6] rec directory |
1028 | STRCPY(xTmr.strSummary, v[7].c_str()); // [7] currently set to episode title | |
1019 | STRCPY(xTmr.strSummary, v[7].c_str()); // [7] set to program description | |
1029 | 1020 | // [8] WMC Priority (need Kodi compatible value, see [26]) |
1030 | 1021 | // [9] IsRecurring |
1031 | 1022 | xTmr.iEpgUid = atoi(v[10].c_str()); // [10] epg ID |
1093 | 1084 | if (IsServerDown()) |
1094 | 1085 | return PVR_ERROR_SERVER_ERROR; |
1095 | 1086 | |
1096 | vector<CStdString> responses = _socketClient.GetVector("GetRecordings", true); | |
1087 | vector<std::string> responses = _socketClient.GetVector("GetRecordings", true); | |
1097 | 1088 | |
1098 | 1089 | FOREACH(response, responses) |
1099 | 1090 | { |
1100 | 1091 | PVR_RECORDING xRec; |
1101 | 1092 | memset(&xRec, 0, sizeof(PVR_RECORDING)); // set all struct to zero |
1102 | 1093 | |
1103 | vector<CStdString> v = split(*response, "|"); // split to unpack string | |
1094 | vector<std::string> v = split(*response, "|"); // split to unpack string | |
1104 | 1095 | |
1105 | 1096 | // r.Id, r.Program.Title, r.FileName, recDir, plotOutline, |
1106 | 1097 | // plot, r.Channel.CallSign, ""/*icon path*/, ""/*thumbnail path*/, ToTime_t(r.RecordingTime), |
1115 | 1106 | |
1116 | 1107 | STRCPY(xRec.strRecordingId, v[0].c_str()); |
1117 | 1108 | STRCPY(xRec.strTitle, v[1].c_str()); |
1118 | STRCPY(xRec.strStreamURL, v[2].c_str()); | |
1119 | 1109 | STRCPY(xRec.strDirectory, v[3].c_str()); |
1120 | 1110 | STRCPY(xRec.strPlotOutline, v[4].c_str()); |
1121 | 1111 | STRCPY(xRec.strPlot, v[5].c_str()); |
1156 | 1146 | /* TODO: PVR API 5.1.0: Implement this */ |
1157 | 1147 | xRec.channelType = PVR_RECORDING_CHANNEL_TYPE_UNKNOWN; |
1158 | 1148 | |
1159 | // fix for advocate99 bug: new recordings won't play until kodi file cache gets a refresh. | |
1160 | // If a recording path is given, but is not in the Kodi cache, use the trick below to force refresh kodi cache. | |
1161 | // Does nothing if swmc doesn't return a path to the recording | |
1162 | if (strlen(xRec.strStreamURL) > 0 && !XBMC->FileExists(xRec.strStreamURL, true/*inCache*/)) // path str exists, but rec is not in Kodi cache | |
1163 | { | |
1164 | CStdString dummyFile = xRec.strStreamURL; | |
1165 | dummyFile += "_new_rec_fix.deleteMe"; | |
1166 | if (XBMC->CreateDirectory(dummyFile)) // create a dummy folder | |
1167 | XBMC->RemoveDirectory(dummyFile); // delete the dummy folder if it was created | |
1168 | ||
1169 | // check to see if fix worked | |
1170 | if (XBMC->FileExists(xRec.strStreamURL, true)) | |
1171 | XBMC->Log(LOG_DEBUG, "recording cache fix for '%s' succeeded", xRec.strStreamURL); | |
1172 | else | |
1173 | XBMC->Log(LOG_DEBUG, "fix for recording cache bug failed for '%s'", xRec.strStreamURL); | |
1174 | } | |
1175 | ||
1176 | 1149 | PVR->TransferRecordingEntry(handle, &xRec); |
1177 | 1150 | } |
1178 | 1151 | |
1186 | 1159 | if (IsServerDown()) |
1187 | 1160 | return PVR_ERROR_SERVER_ERROR; |
1188 | 1161 | |
1189 | CStdString command;// = format("DeleteRecording|%s|%s|%s", recording.strRecordingId, recording.strTitle, recording.strStreamURL); | |
1190 | command.Format("DeleteRecording|%s|%s|%s", recording.strRecordingId, recording.strTitle, recording.strStreamURL); | |
1191 | ||
1192 | vector<CStdString> results = _socketClient.GetVector(command, false); // get results from server | |
1162 | std::string command; | |
1163 | command = string_format("DeleteRecording|%s|%s|%s", recording.strRecordingId, recording.strTitle, ""); | |
1164 | ||
1165 | vector<std::string> results = _socketClient.GetVector(command, false); // get results from server | |
1193 | 1166 | |
1194 | 1167 | |
1195 | 1168 | if (isServerError(results)) // did the server do it? |
1215 | 1188 | if (IsServerDown()) |
1216 | 1189 | return PVR_ERROR_SERVER_ERROR; |
1217 | 1190 | |
1218 | CStdString command;// = format("RenameRecording|%s|%s", recording.strRecordingId, recording.strTitle); | |
1219 | command.Format("RenameRecording|%s|%s", recording.strRecordingId, recording.strTitle); | |
1220 | ||
1221 | vector<CStdString> results = _socketClient.GetVector(command, false); // get results from server | |
1191 | std::string command;// = format("RenameRecording|%s|%s", recording.strRecordingId, recording.strTitle); | |
1192 | command = string_format("RenameRecording|%s|%s", recording.strRecordingId, recording.strTitle); | |
1193 | ||
1194 | vector<std::string> results = _socketClient.GetVector(command, false); // get results from server | |
1222 | 1195 | |
1223 | 1196 | if (isServerError(results)) // did the server do it? |
1224 | 1197 | { |
1238 | 1211 | if (IsServerDown()) |
1239 | 1212 | return PVR_ERROR_SERVER_ERROR; |
1240 | 1213 | |
1241 | CStdString command; | |
1242 | command.Format("SetResumePosition|%s|%d", recording.strRecordingId, lastplayedposition); | |
1243 | vector<CStdString> results = _socketClient.GetVector(command, true); | |
1214 | std::string command; | |
1215 | command = string_format("SetResumePosition|%s|%d", recording.strRecordingId, lastplayedposition); | |
1216 | ||
1217 | vector<std::string> results = _socketClient.GetVector(command, true); | |
1244 | 1218 | PVR->TriggerRecordingUpdate(); // this is needed to get the new resume point actually used by the player (xbmc bug) |
1245 | 1219 | return PVR_ERROR_NO_ERROR; |
1246 | 1220 | } |
1253 | 1227 | if (IsServerDown()) |
1254 | 1228 | return PVR_ERROR_SERVER_ERROR; |
1255 | 1229 | |
1256 | CStdString command; | |
1257 | command.Format("GetResumePosition|%s", recording.strRecordingId); | |
1230 | std::string command; | |
1231 | command = string_format("GetResumePosition|%s", recording.strRecordingId); | |
1258 | 1232 | int pos = _socketClient.GetInt(command, true); |
1259 | 1233 | return pos; |
1260 | 1234 | } |
1265 | 1239 | if (IsServerDown()) |
1266 | 1240 | return PVR_ERROR_SERVER_ERROR; |
1267 | 1241 | |
1268 | CStdString command; | |
1269 | command.Format("SetPlayCount|%s|%d", recording.strRecordingId, count); | |
1270 | vector<CStdString> results = _socketClient.GetVector(command, true); | |
1242 | std::string command; | |
1243 | command = string_format("SetPlayCount|%s|%d", recording.strRecordingId, count); | |
1244 | vector<std::string> results = _socketClient.GetVector(command, true); | |
1271 | 1245 | if (count <= 0) |
1272 | 1246 | PVR->TriggerRecordingUpdate(); // this is needed to get the new play count actually used by the player (xbmc bug) |
1273 | 1247 | return PVR_ERROR_NO_ERROR; |
1274 | 1248 | } |
1275 | 1249 | |
1276 | 1250 | |
1277 | CStdString Pvr2Wmc::Channel2String(const PVR_CHANNEL &xCh) | |
1251 | std::string Pvr2Wmc::Channel2String(const PVR_CHANNEL &xCh) | |
1278 | 1252 | { |
1279 | 1253 | // packing: id, bradio, c.OriginalNumber, c.CallSign, c.IsEncrypted, imageStr, c.IsBlocked |
1280 | CStdString chStr; | |
1281 | chStr.Format("|%d|%d|%d|%s", xCh.iUniqueId, xCh.bIsRadio, xCh.iChannelNumber, xCh.strChannelName); | |
1254 | std::string chStr; | |
1255 | chStr = string_format("|%u|%d|%u|%s", xCh.iUniqueId, xCh.bIsRadio, xCh.iChannelNumber, xCh.strChannelName); | |
1282 | 1256 | return chStr; |
1283 | 1257 | } |
1284 | 1258 | |
1291 | 1265 | |
1292 | 1266 | _lostStream = true; // init |
1293 | 1267 | _readCnt = 0; |
1294 | int _buffTimesCnt = 0; | |
1295 | int _buffTimeFILTER = 0; | |
1268 | _buffTimesCnt = 0; | |
1269 | _buffTimeFILTER = 0; | |
1296 | 1270 | |
1297 | 1271 | CloseLiveStream(false); // close current stream (if any) |
1298 | 1272 | |
1299 | CStdString request = "OpenLiveStream" + Channel2String(channel); // request a live stream using channel | |
1300 | vector<CStdString> results = _socketClient.GetVector(request, false); // try to open live stream, get path to stream file | |
1273 | std::string request = "OpenLiveStream" + Channel2String(channel); // request a live stream using channel | |
1274 | vector<std::string> results = _socketClient.GetVector(request, false); // try to open live stream, get path to stream file | |
1301 | 1275 | |
1302 | 1276 | if (isServerError(results)) // test if server reported an error |
1303 | 1277 | { |
1320 | 1294 | // Check for a specified initial position and save it for the first ReadLiveStream command to use |
1321 | 1295 | if (results.size() > 2) |
1322 | 1296 | { |
1323 | _initialStreamPosition = atoll(results[2]); | |
1297 | _initialStreamPosition = atoll(results[2].c_str()); | |
1324 | 1298 | } |
1325 | 1299 | |
1326 | 1300 | _streamFile = XBMC->OpenFile(_streamFileName.c_str(), 0); // open the video file for streaming, same handle |
1327 | 1301 | |
1328 | 1302 | if (!_streamFile) // something went wrong |
1329 | 1303 | { |
1330 | CStdString lastError; | |
1304 | std::string lastError; | |
1331 | 1305 | #ifdef TARGET_WINDOWS |
1332 | 1306 | int errorVal = GetLastError(); |
1333 | lastError.Format("Error opening stream file, Win32 error code: %d", errorVal); | |
1307 | lastError = string_format("Error opening stream file, Win32 error code: %d", errorVal); | |
1334 | 1308 | #else |
1335 | lastError.Format("Error opening stream file"); | |
1309 | lastError = "Error opening stream file"; | |
1336 | 1310 | #endif |
1337 | 1311 | XBMC->Log(LOG_ERROR, lastError.c_str()); // log more info on error |
1338 | 1312 | |
1349 | 1323 | _lostStream = false; // if we got to here, stream started ok, so set default values |
1350 | 1324 | _lastStreamSize = 0; |
1351 | 1325 | _isStreamFileGrowing = true; |
1352 | _insertDurationHeader = false; // only used for active recordings | |
1353 | 1326 | return true; // stream is up |
1354 | 1327 | } |
1355 | } | |
1356 | ||
1357 | bool Pvr2Wmc::SwitchChannel(const PVR_CHANNEL &channel) | |
1358 | { | |
1359 | CStdString request = "SwitchChannel|" + g_strClientName + Channel2String(channel); // request a live stream using channel | |
1360 | return _socketClient.GetBool(request, false); // try to open live stream, get path to stream file | |
1361 | 1328 | } |
1362 | 1329 | |
1363 | 1330 | |
1366 | 1333 | { |
1367 | 1334 | if (_lostStream) // if stream has already been flagged as lost, return 0 bytes |
1368 | 1335 | return 0; // after this happens a few time, xbmc will call CloseLiveStream |
1369 | ||
1370 | 1336 | _readCnt++; // keep a count of the number of reads executed |
1371 | 1337 | |
1372 | 1338 | if (!_streamWTV) // if NOT streaming wtv, make sure stream is big enough before it is read |
1373 | 1339 | { |
1374 | 1340 | int timeout = 0; // reset timeout counter |
1375 | 1341 | |
1342 | ||
1376 | 1343 | // If we are trying to skip to an initial start position (eg we are watching an existing live stream |
1377 | 1344 | // in a multiple client scenario), we need to do it here, as the Seek command didnt work in OpenLiveStream, |
1378 | 1345 | // XBMC just started playing from the start of the file anyway. But once the stream is open, XBMC repeatedly |
1406 | 1373 | } |
1407 | 1374 | |
1408 | 1375 | long long currentPos = PositionLiveStream(); // get the current file position |
1409 | ||
1410 | // this is a hack to set the time duration of an ACTIVE recording file. Xbmc reads the ts duration by looking for timestamps | |
1411 | // (pts/dts) toward the end of the ts file. Since our ts file is very small at the start, xbmc skips trying to get the duration | |
1412 | // and just sets it to zero, this makes FF,RW,Skip work poorly and gives bad OSD feedback during playback. The hack is | |
1413 | // to tell xbmc that the ts file is 'FAKE_TS_LENGTH' in length at the start of the playback (see LengthLiveStream). Then when xbmc | |
1414 | // tries to read the duration by probing the end of the file (it starts looking at fileLength-250k), we catch this read below and feed | |
1415 | // it a packet that contains a pts with the duration we want (this packet header is received from the server). After this, everything | |
1416 | // is set back to normal. | |
1417 | if (_insertDurationHeader && FAKE_TS_LENGTH - 250000 == currentPos) // catch xbmc probing for timestamps at end of file | |
1418 | { | |
1419 | //char pcr[16] = {0x47, 0x51, 0x00, 0x19, 0x00, 0x00, 0x01, 0xBD, 0x00, 0x00, 0x85, 0x80, 0x05, 0x21, 0x2E, 0xDF}; | |
1420 | _insertDurationHeader = false; // only do header insertion once | |
1421 | memset(pBuffer, 0xFF, iBufferSize); // set buffer to all FF (default padding char for packets) | |
1422 | vector<CStdString> v = split(_durationHeader, " "); // get header bytes by unpacking reponse | |
1423 | for (int i=0; i<16; i++) // insert header bytes, creating a fake packet at start of buffer | |
1424 | { | |
1425 | //*(pBuffer + i) = pcr[i]; | |
1426 | *(pBuffer + i) = (char)strtol(v[i].c_str(), NULL, 16); | |
1427 | } | |
1428 | return iBufferSize; // terminate read here after header is inserted | |
1429 | } | |
1430 | // in case something goes wrong, turn off fake header insertion flag. | |
1431 | // the header insertion usually happens around _readCnt=21, so 50 should be safe | |
1432 | if (_readCnt > 50) | |
1433 | _insertDurationHeader = false; | |
1434 | ||
1435 | 1376 | long long fileSize = _lastStreamSize; // use the last fileSize found, rather than querying host |
1436 | 1377 | |
1437 | 1378 | if (_isStreamFileGrowing && currentPos + iBufferSize > fileSize) // if its not big enough for the readsize |
1493 | 1434 | { |
1494 | 1435 | if (!IsServerDown()) |
1495 | 1436 | { |
1496 | CStdString request; | |
1497 | request.Format("CheckError"); | |
1498 | //request.Format("CheckError|%d|%d|%d", checkCnt, (long)streamPos, (long)streamfileSize); | |
1499 | vector<CStdString> results = _socketClient.GetVector(request, true); // see if server posted an error for active stream | |
1437 | std::string request; | |
1438 | request = "CheckError"; | |
1439 | vector<std::string> results = _socketClient.GetVector(request, true); // see if server posted an error for active stream | |
1500 | 1440 | return isServerError(results); |
1501 | 1441 | } |
1502 | 1442 | return false; |
1540 | 1480 | } |
1541 | 1481 | else |
1542 | 1482 | { |
1543 | CStdString request; | |
1544 | request.Format("StreamFileSize|%d", count); // request stream size form client, passing number of consecutive queries | |
1483 | std::string request; | |
1484 | request = string_format("StreamFileSize|%d", count); // request stream size form client, passing number of consecutive queries | |
1545 | 1485 | lFileSize = _socketClient.GetLL(request, true); // get file size form client |
1546 | 1486 | |
1547 | 1487 | if (lFileSize < -1) // if server returns a negative file size, it means the stream file is no longer growing (-1 => error) |
1557 | 1497 | // return the length of the current stream file |
1558 | 1498 | long long Pvr2Wmc::LengthLiveStream(void) |
1559 | 1499 | { |
1560 | if (_insertDurationHeader) // if true, return a fake file 2Mb length to xbmc, this makes xbmc try to determine | |
1561 | return FAKE_TS_LENGTH; // the ts time duration giving us a chance to insert the real duration | |
1562 | 1500 | if (_lastStreamSize > 0) |
1563 | 1501 | return _lastStreamSize; |
1564 | 1502 | return -1; |
1590 | 1528 | } |
1591 | 1529 | |
1592 | 1530 | |
1593 | // this is only called if a recording is actively being recorded, xbmc detects this when the server | |
1594 | // doesn't enter a path in the strStreamURL field during a "GetRecordings" | |
1595 | 1531 | bool Pvr2Wmc::OpenRecordedStream(const PVR_RECORDING &recording) |
1596 | 1532 | { |
1597 | 1533 | if (IsServerDown()) |
1599 | 1535 | |
1600 | 1536 | _lostStream = true; // init |
1601 | 1537 | _readCnt = 0; |
1602 | int _buffTimesCnt = 0; | |
1603 | int _buffTimeFILTER = 0; | |
1538 | _buffTimesCnt = 0; | |
1539 | _buffTimeFILTER = 0; | |
1604 | 1540 | |
1605 | 1541 | // request an active recording stream |
1606 | CStdString request; | |
1607 | request.Format("OpenRecordingStream|%s", recording.strRecordingId); | |
1608 | vector<CStdString> results = _socketClient.GetVector(request, false); // try to open recording stream, get path to stream file | |
1542 | std::string request; | |
1543 | request = string_format("OpenRecordingStream|%s", recording.strRecordingId); | |
1544 | vector<std::string> results = _socketClient.GetVector(request, false); // try to open recording stream, get path to stream file | |
1609 | 1545 | |
1610 | 1546 | if (isServerError(results)) // test if server reported an error |
1611 | 1547 | { |
1616 | 1552 | _streamFileName = results[0]; |
1617 | 1553 | _streamWTV = EndsWith(_streamFileName, "wtv"); // true if stream file is a wtv file |
1618 | 1554 | |
1619 | // hand additional args from server | |
1555 | // handle additional args from server | |
1620 | 1556 | if (results.size() > 1) |
1621 | 1557 | XBMC->Log(LOG_DEBUG, "OpenRecordedStream> rec stream type: %s", results[1].c_str()); // either a 'passive' or 'active' WTV OR a TS file |
1622 | 1558 | |
1625 | 1561 | else |
1626 | 1562 | XBMC->Log(LOG_DEBUG, "OpenRecordedStream> opening stream: %s", _streamFileName.c_str()); |
1627 | 1563 | |
1628 | if (results.size() > 3 && results[3] != "") // get header to set duration of ts file | |
1629 | { | |
1630 | _durationHeader = results[3]; | |
1631 | _insertDurationHeader = true; | |
1632 | } | |
1633 | else | |
1634 | { | |
1635 | _durationHeader = ""; | |
1636 | _insertDurationHeader = false; | |
1637 | } | |
1638 | ||
1639 | 1564 | _streamFile = XBMC->OpenFile(_streamFileName.c_str(), 0); // open the video file for streaming, same handle |
1640 | 1565 | |
1641 | 1566 | if (!_streamFile) // something went wrong |
1642 | 1567 | { |
1643 | CStdString lastError; | |
1568 | std::string lastError; | |
1644 | 1569 | #ifdef TARGET_WINDOWS |
1645 | 1570 | int errorVal = GetLastError(); |
1646 | lastError.Format("Error opening stream file, Win32 error code: %d", errorVal); | |
1571 | lastError = string_format("Error opening stream file, Win32 error code: %d", errorVal); | |
1647 | 1572 | #else |
1648 | lastError.Format("Error opening stream file"); | |
1573 | lastError = "Error opening stream file"; | |
1649 | 1574 | #endif |
1650 | 1575 | XBMC->Log(LOG_ERROR, lastError.c_str()); // log more info on error |
1651 | 1576 | _socketClient.GetBool("StreamStartError|" + _streamFileName, true); // tell server stream did not start |
1685 | 1610 | // Reset count to throttle value |
1686 | 1611 | _signalStatusCount = g_signalThrottle; |
1687 | 1612 | |
1688 | CStdString command; | |
1689 | command.Format("SignalStatus"); | |
1690 | ||
1691 | vector<CStdString> results = _socketClient.GetVector(command, true); // get results from server | |
1613 | std::string command; | |
1614 | command = "SignalStatus"; | |
1615 | ||
1616 | vector<std::string> results = _socketClient.GetVector(command, true); // get results from server | |
1692 | 1617 | |
1693 | 1618 | // strDeviceName, strDeviceStatus, strProvider, strService, strMux |
1694 | 1619 | // iSignal, dVideoBitrate, dAudioBitrate, Error |
1707 | 1632 | snprintf(cachedSignalStatus.strProviderName, sizeof(cachedSignalStatus.strProviderName), "%s", results[2].c_str()); |
1708 | 1633 | snprintf(cachedSignalStatus.strServiceName, sizeof(cachedSignalStatus.strServiceName), "%s", results[3].c_str()); |
1709 | 1634 | snprintf(cachedSignalStatus.strMuxName, sizeof(cachedSignalStatus.strMuxName), "%s", results[4].c_str()); |
1710 | cachedSignalStatus.iSignal = (int)(atoi(results[5]) * 655.35); | |
1635 | cachedSignalStatus.iSignal = (int)(atoi(results[5].c_str()) * 655.35); | |
1711 | 1636 | |
1712 | bool error = atoi(results[8]) == 1; | |
1637 | bool error = atoi(results[8].c_str()) == 1; | |
1713 | 1638 | if (error) |
1714 | 1639 | { |
1715 | 1640 | // Backend indicates it can't provide SignalStatus for this channel |
1727 | 1652 | |
1728 | 1653 | bool Pvr2Wmc::IsTimeShifting() |
1729 | 1654 | { |
1730 | if (_streamFile) // ?not sure if this should be false if playtime is at buffer end) | |
1655 | if (_streamFile) | |
1731 | 1656 | return true; |
1732 | 1657 | else |
1733 | 1658 | return false; |
1734 | 1659 | } |
1735 | 1660 | |
1736 | time_t _buffStart; | |
1737 | time_t _buffEnd; | |
1738 | time_t _buffCurrent; | |
1739 | ||
1740 | // get current playing time from swmc remux, this method also recieves buffer start and buffer end | |
1741 | // to minimize traffic to swmc, since Kodi calls this like crazy, the calls are filtered. The size | |
1742 | // of the filter is passed in from swmc | |
1743 | time_t Pvr2Wmc::GetPlayingTime() | |
1744 | { | |
1745 | if (_streamFile && _buffTimesCnt >= _buffTimeFILTER) // filter so we don't query swmc too much | |
1746 | { | |
1747 | _buffTimesCnt = 0; | |
1748 | int64_t filePos = XBMC->GetFilePosition(_streamFile); // get the current file pos so we can convert to play time | |
1749 | CStdString request; | |
1750 | request.Format("GetBufferTimes|%llu", filePos); | |
1751 | vector<CStdString> results = _socketClient.GetVector(request, false); // have swmc convert file pos to current play time | |
1752 | ||
1753 | if (results.size() > 3) | |
1754 | { | |
1755 | _buffStart = atol(results[0]); | |
1756 | _buffEnd = atol(results[1]); | |
1757 | _buffCurrent = atol(results[2]); | |
1758 | _buffTimeFILTER = atoi(results[3]); // get filter value from swmc | |
1759 | } | |
1760 | } | |
1761 | _buffTimesCnt++; | |
1762 | return _buffCurrent; | |
1763 | } | |
1764 | ||
1765 | time_t Pvr2Wmc::GetBufferTimeStart() | |
1661 | // save the last pos of buffer pointers so that we can filter how often swmc is quered for buff data | |
1662 | time_t _savBuffStart; | |
1663 | int64_t _savBuffEnd; | |
1664 | ||
1665 | ||
1666 | PVR_ERROR Pvr2Wmc::GetStreamTimes(PVR_STREAM_TIMES *strTimes) | |
1766 | 1667 | { |
1767 | 1668 | if (_streamFile) |
1768 | 1669 | { |
1769 | return _buffStart; | |
1770 | } | |
1771 | return 0; | |
1772 | } | |
1773 | ||
1774 | time_t Pvr2Wmc::GetBufferTimeEnd() | |
1775 | { | |
1776 | if (_streamFile) | |
1777 | { | |
1778 | return _buffEnd; | |
1779 | } | |
1780 | return 0; | |
1781 | } | |
1670 | if (_buffTimesCnt >= _buffTimeFILTER) // filter queries to slow down queries to swmc | |
1671 | { | |
1672 | _buffTimesCnt = 0; | |
1673 | vector<std::string> results = _socketClient.GetVector("GetBufferTimes", false); // get buffer status | |
1674 | ||
1675 | if (results.size() < 3) | |
1676 | { | |
1677 | return PVR_ERROR_SERVER_ERROR; | |
1678 | } | |
1679 | ||
1680 | strTimes->startTime = atoll(results[0].c_str()); // get time_t utc of when stream was started | |
1681 | strTimes->ptsStart = 0; // relative to the above time, time when the stream starts (?) | |
1682 | strTimes->ptsBegin = 0; // how far back the buffer data goes, which is always stream start for swmc | |
1683 | strTimes->ptsEnd = atoll(results[1].c_str()) * DVD_TIME_BASE; // get the current length of the live buffer or recording duration (uSec) | |
1684 | _savBuffStart = strTimes->startTime; // save values last found to filter queries | |
1685 | _savBuffEnd = strTimes->ptsEnd; | |
1686 | _buffTimeFILTER = atol(results[2].c_str()); // get filter value from swmc | |
1687 | } | |
1688 | else | |
1689 | { | |
1690 | // if filtering, used saved values | |
1691 | strTimes->startTime = _savBuffStart; | |
1692 | strTimes->ptsStart = 0; | |
1693 | strTimes->ptsBegin = 0; | |
1694 | strTimes->ptsEnd = _savBuffEnd; | |
1695 | _buffTimesCnt++; // increment how many times saved values were used | |
1696 | } | |
1697 | return PVR_ERROR_NO_ERROR; | |
1698 | } | |
1699 | return PVR_ERROR_SERVER_ERROR; | |
1700 | } | |
1701 | ||
1702 | PVR_ERROR Pvr2Wmc::GetRecordingEdl(const PVR_RECORDING &recording, PVR_EDL_ENTRY entries[], int *size) | |
1703 | { | |
1704 | ||
1705 | if (_streamFileName != "") // read the edl for the current stream file | |
1706 | { | |
1707 | // see if edl file for currently streaming recording exists | |
1708 | std::string theEdlFile = _streamFileName; | |
1709 | // swap .wtv extension for .edl | |
1710 | std::string::size_type result = theEdlFile.find_last_of('.'); | |
1711 | if (std::string::npos != result) | |
1712 | theEdlFile.erase(result); | |
1713 | else | |
1714 | { | |
1715 | XBMC->Log(LOG_DEBUG, "File extender error: '%s'", theEdlFile.c_str()); | |
1716 | return PVR_ERROR_FAILED; | |
1717 | } | |
1718 | theEdlFile.append(".edl"); | |
1719 | ||
1720 | XBMC->Log(LOG_DEBUG, "Opening EDL file: '%s'", theEdlFile.c_str()); | |
1721 | ||
1722 | void* fileHandle = XBMC->OpenFile(theEdlFile.c_str(), 0); | |
1723 | if (fileHandle) | |
1724 | { | |
1725 | int index = 0; | |
1726 | char buffer[256]; | |
1727 | while (XBMC->ReadFileString(fileHandle, buffer, 1024)) | |
1728 | { | |
1729 | std::string svals(buffer); | |
1730 | svals = StringUtils::TrimRight(svals, "\r"); // trim windows /r if its there | |
1731 | vector<std::string> vals = split(svals, "\t"); // split on tabs | |
1732 | if (vals.size() == 3) | |
1733 | { | |
1734 | PVR_EDL_ENTRY entry; | |
1735 | entry.start = std::strtod(vals[0].c_str(), null) * 1000; // convert s to ms | |
1736 | entry.end = std::strtod(vals[1].c_str(), null) * 1000; | |
1737 | entry.type = (PVR_EDL_TYPE)atoi(vals[2].c_str()); | |
1738 | entries[index] = entry; | |
1739 | index++; | |
1740 | } | |
1741 | } | |
1742 | if (index > 0) | |
1743 | XBMC->Log(LOG_DEBUG, "EDL data found."); | |
1744 | else | |
1745 | XBMC->Log(LOG_DEBUG, "No EDL data found."); | |
1746 | *size = index; | |
1747 | XBMC->CloseFile(fileHandle); | |
1748 | return PVR_ERROR_NO_ERROR; | |
1749 | } | |
1750 | else | |
1751 | XBMC->Log(LOG_DEBUG, "No EDL file found."); | |
1752 | ||
1753 | } | |
1754 | return PVR_ERROR_FAILED; | |
1755 | } |
19 | 19 | #pragma once |
20 | 20 | |
21 | 21 | #include <vector> |
22 | #include "p8-platform/util/StdString.h" | |
23 | 22 | #include "client.h" |
24 | 23 | #include "Socket.h" |
25 | 24 | |
128 | 127 | |
129 | 128 | // time shifting |
130 | 129 | bool IsTimeShifting(); |
131 | time_t GetPlayingTime(); | |
132 | time_t GetBufferTimeStart(); | |
133 | time_t GetBufferTimeEnd(); | |
130 | PVR_ERROR GetStreamTimes(PVR_STREAM_TIMES*); | |
131 | ||
132 | // comm skip | |
133 | PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY[], int*); | |
134 | 134 | |
135 | 135 | bool CheckErrorOnServer(); |
136 | void TriggerUpdates(std::vector<CStdString> results); | |
137 | void ExtractDriveSpace(std::vector<CStdString> results); | |
136 | void TriggerUpdates(std::vector<std::string> results); | |
137 | void ExtractDriveSpace(std::vector<std::string> results); | |
138 | 138 | |
139 | 139 | private: |
140 | 140 | int _serverBuild; |
141 | CStdString Timer2String(const PVR_TIMER &xTmr); | |
142 | CStdString SeriesTimer2String(const PVR_TIMER &xTmr); | |
143 | CStdString Channel2String(const PVR_CHANNEL &xTmr); | |
141 | std::string Timer2String(const PVR_TIMER &xTmr); | |
142 | std::string SeriesTimer2String(const PVR_TIMER &xTmr); | |
143 | std::string Channel2String(const PVR_CHANNEL &xTmr); | |
144 | 144 | |
145 | 145 | Socket _socketClient; |
146 | 146 | |
151 | 151 | bool _discardSignalStatus; // flag to discard signal status for channels where the backend had an error |
152 | 152 | |
153 | 153 | void* _streamFile; // handle to a streamed file |
154 | CStdString _streamFileName; // the name of the stream file | |
154 | std::string _streamFileName; // the name of the stream file | |
155 | 155 | bool _lostStream; // set to true if stream is lost |
156 | 156 | |
157 | 157 | bool _streamWTV; // if true, stream wtv files |
163 | 163 | long long _initialStreamPosition; // used to set an initial position (multiple clients watching the same live tv buffer) |
164 | 164 | |
165 | 165 | bool _insertDurationHeader; // if true, insert a duration header for active Rec TS file |
166 | CStdString _durationHeader; // the header to insert (received from server) | |
166 | std::string _durationHeader; // the header to insert (received from server) | |
167 | 167 | |
168 | 168 | int _defaultPriority; |
169 | 169 | int _defaultLiftetime; |
17 | 17 | * |
18 | 18 | */ |
19 | 19 | |
20 | #include "p8-platform/util/StdString.h" | |
21 | 20 | #include "util/XMLUtils.h" |
22 | 21 | #include "utilities.h" |
23 | 22 | |
25 | 24 | #include <string> |
26 | 25 | #include <stdio.h> |
27 | 26 | #include <cstdarg> |
28 | #ifdef TARGET_WINDOWS | |
29 | #include <windows.h> | |
30 | #else | |
31 | #include <stdarg.h> | |
32 | #endif | |
33 | 27 | |
34 | 28 | using namespace ADDON; |
35 | 29 | |
36 | 30 | // format related string functions taken from: |
37 | 31 | // http://www.flipcode.com/archives/Safe_sprintf.shtml |
38 | 32 | |
39 | bool Str2Bool(const CStdString str) | |
33 | bool Str2Bool(const std::string& str) | |
40 | 34 | { |
41 | 35 | return str.compare("True") == 0 ? true:false; |
42 | 36 | } |
43 | 37 | |
44 | std::vector<CStdString> split(const CStdString& s, const CStdString& delim, const bool keep_empty) { | |
45 | std::vector<CStdString> result; | |
46 | if (delim.empty()) { | |
47 | result.push_back(s); | |
48 | return result; | |
49 | } | |
50 | CStdString::const_iterator substart = s.begin(), subend; | |
51 | while (true) { | |
52 | subend = search(substart, s.end(), delim.begin(), delim.end()); | |
53 | CStdString temp(substart, subend); | |
54 | if (keep_empty || !temp.empty()) { | |
55 | result.push_back(temp); | |
56 | } | |
57 | if (subend == s.end()) { | |
58 | break; | |
59 | } | |
60 | substart = subend + delim.size(); | |
61 | } | |
62 | return result; | |
63 | } | |
64 | ||
65 | bool EndsWith(CStdString const &fullString, CStdString const &ending) | |
38 | bool EndsWith(std::string const &fullString, std::string const &ending) | |
66 | 39 | { |
67 | 40 | if (fullString.length() >= ending.length()) { |
68 | 41 | return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending)); |
71 | 44 | } |
72 | 45 | } |
73 | 46 | |
74 | bool StartsWith(CStdString const &fullString, CStdString const &starting) | |
47 | bool StartsWith(std::string const &fullString, std::string const &starting) | |
75 | 48 | { |
76 | 49 | if (fullString.length() >= starting.length()) { |
77 | 50 | return (0 == fullString.compare(0, starting.length(), starting)); |
81 | 54 | } |
82 | 55 | |
83 | 56 | // return the directory from the input file path |
84 | CStdString GetDirectoryPath(CStdString const &path) | |
57 | std::string GetDirectoryPath(std::string const &path) | |
85 | 58 | { |
86 | 59 | size_t found = path.find_last_of("/\\"); |
87 | if (found != CStdString::npos) | |
60 | if (found != std::string::npos) | |
88 | 61 | return path.substr(0, found); |
89 | 62 | else |
90 | 63 | return path; |
91 | 64 | } |
92 | 65 | |
93 | bool ReadFileContents(CStdString const &strFileName, CStdString &strContent) | |
66 | bool ReadFileContents(std::string const &strFileName, std::string &strContent) | |
94 | 67 | { |
95 | 68 | void* fileHandle = XBMC->OpenFile(strFileName.c_str(), 0); |
96 | 69 | if (fileHandle) |
104 | 77 | return false; |
105 | 78 | } |
106 | 79 | |
107 | bool WriteFileContents(CStdString const &strFileName, CStdString &strContent) | |
80 | bool WriteFileContents(std::string const &strFileName, std::string &strContent) | |
108 | 81 | { |
109 | 82 | void* fileHandle = XBMC->OpenFileForWrite(strFileName.c_str(), true); |
110 | 83 | if (fileHandle) |
122 | 95 | return rc >= 0; |
123 | 96 | } |
124 | 97 | return false; |
125 | } | |
98 | }⏎ |
20 | 20 | |
21 | 21 | #include <vector> |
22 | 22 | #include <string> |
23 | #include "stdio.h" | |
23 | 24 | |
25 | //std::vector<std::string> split(const std::string& s, const std::string& delim); | |
24 | 26 | |
25 | std::vector<CStdString> split(const CStdString& s, const CStdString& delim, const bool keep_empty = true); | |
27 | bool Str2Bool(const std::string& str); | |
26 | 28 | |
27 | bool Str2Bool(const CStdString str); | |
29 | bool EndsWith(std::string const &fullString, std::string const &ending); | |
30 | bool StartsWith(std::string const &fullString, std::string const &starting); | |
31 | std::string GetDirectoryPath(std::string const &path); | |
32 | bool ReadFileContents(std::string const &strFileName, std::string &strResult); | |
33 | bool WriteFileContents(std::string const &strFileName, std::string &strContent); | |
28 | 34 | |
29 | bool EndsWith(CStdString const &fullString, CStdString const &ending); | |
30 | bool StartsWith(CStdString const &fullString, CStdString const &starting); | |
31 | CStdString GetDirectoryPath(CStdString const &path); | |
32 | bool ReadFileContents(CStdString const &strFileName, CStdString &strResult); | |
33 | bool WriteFileContents(CStdString const &strFileName, CStdString &strContent); |