Imported Upstream version 1.4.4+git20160820
Balint Reczey
7 years ago
35 | 35 | # |
36 | 36 | before_script: |
37 | 37 | - cd $TRAVIS_BUILD_DIR/.. |
38 | - git clone -b Jarvis --depth=1 https://github.com/xbmc/xbmc.git | |
38 | - git clone --depth=1 https://github.com/xbmc/xbmc.git | |
39 | 39 | - cd pvr.wmc && mkdir build && cd build |
40 | - 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 | |
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 | |
41 | 41 | |
42 | 42 | script: make |
3 | 3 | |
4 | 4 | enable_language(CXX) |
5 | 5 | |
6 | find_package(kodi REQUIRED) | |
6 | find_package(Kodi REQUIRED) | |
7 | 7 | find_package(kodiplatform REQUIRED) |
8 | find_package(platform REQUIRED) | |
8 | find_package(p8-platform REQUIRED) | |
9 | 9 | |
10 | 10 | include_directories(${kodiplatform_INCLUDE_DIRS} |
11 | ${platform_INCLUDE_DIRS} | |
11 | ${p8-platform_INCLUDE_DIRS} | |
12 | 12 | ${KODI_INCLUDE_DIR}) |
13 | 13 | |
14 | 14 | add_definitions(-DUSE_DEMUX) |
19 | 19 | src/utilities.cpp) |
20 | 20 | |
21 | 21 | set(DEPLIBS ${kodiplatform_LIBRARIES} |
22 | ${platform_LIBRARIES}) | |
22 | ${p8-platform_LIBRARIES}) | |
23 | 23 | |
24 | 24 | if (WIN32) |
25 | 25 | list(APPEND DEPLIBS ws2_32) |
0 | [![Build Status](https://travis-ci.org/kodi-pvr/pvr.wmc.svg?branch=Jarvis)](https://travis-ci.org/kodi-pvr/pvr.wmc) | |
0 | [![Build Status](https://travis-ci.org/kodi-pvr/pvr.wmc.svg?branch=master)](https://travis-ci.org/kodi-pvr/pvr.wmc) | |
1 | 1 | [![Coverity Scan Build Status](https://scan.coverity.com/projects/5120/badge.svg)](https://scan.coverity.com/projects/5120) |
2 | 2 | |
3 | 3 | # Windows Media Center PVR |
0 | 0 | <?xml version="1.0" encoding="UTF-8"?> |
1 | 1 | <addon |
2 | 2 | id="pvr.wmc" |
3 | version="0.6.15" | |
3 | version="1.4.4" | |
4 | 4 | name="PVR WMC Client" |
5 | 5 | provider-name="KrustyReturns and scarecrow420"> |
6 | 6 | <requires> |
7 | 7 | <c-pluff version="0.1"/> |
8 | <import addon="xbmc.pvr" version="4.1.0"/> | |
9 | <import addon="kodi.guilib" version="5.10.0"/> | |
8 | <import addon="xbmc.pvr" version="5.2.0"/> | |
10 | 9 | </requires> |
11 | 10 | <extension |
12 | 11 | point="xbmc.pvrclient" |
27 | 26 | <summary lang="en_US">PVR WMC Client</summary> |
28 | 27 | <summary lang="es_AR">Cliente PVR WMC</summary> |
29 | 28 | <summary lang="es_ES">Cliente PVR WMC</summary> |
29 | <summary lang="es_MX">Cliente PVR WMC</summary> | |
30 | 30 | <summary lang="fi_FI">PVR WMC asiakas</summary> |
31 | 31 | <summary lang="fr_CA">Client de numériscope pour CMW</summary> |
32 | 32 | <summary lang="fr_FR">Client enregistreur vidéo (PVR) WMC</summary> |
47 | 47 | <summary lang="nl_NL">PVR WMC Cliënt</summary> |
48 | 48 | <summary lang="pl_PL">Klient telewizji dla WMC</summary> |
49 | 49 | <summary lang="pt_BR">Cliente de PVR WMC</summary> |
50 | <summary lang="pt_PT">Cliente PVR WMC</summary> | |
50 | <summary lang="pt_PT">Cliente WMC PVR</summary> | |
51 | 51 | <summary lang="ro_RO">Client PVR WMC </summary> |
52 | 52 | <summary lang="ru_RU">Клиент PVR WMC</summary> |
53 | 53 | <summary lang="sk_SK">PVR WMC klient</summary> |
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> | |
74 | 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> |
75 | 76 | <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> |
76 | 77 | <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> |
90 | 91 | <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> |
91 | 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> |
92 | 93 | <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> |
93 | <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> | |
94 | <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> | |
94 | 95 | <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> |
95 | 96 | <description lang="ru_RU">Редакция @OS@ @ARCHITECTURE@.Клиент PVR для взаимодействия с записью Windows Media Center и сервисом EPG. Благодарности Tomba73 и Hoopsdavis. Особые благодарности DBurckh.</description> |
96 | 97 | <description lang="sk_SK">Klient pre @OS@ @ARCHITECTURE@. PVR klient pre prístup k Windows Media Center nahrávkam a EPG informáciám. Poďakovanie pre Tomba73 a Hoopsdavis. Špeciálne poďakovanie pre DBurckh.</description> |
113 | 114 | <disclaimer lang="en_US">This is experimental software. Use at your own risk.</disclaimer> |
114 | 115 | <disclaimer lang="es_AR">Este software es experimental. Úselo bajo su propio riesgo.</disclaimer> |
115 | 116 | <disclaimer lang="es_ES">Es un programa experimental. Úsalo bajo tu responsabilidad.</disclaimer> |
117 | <disclaimer lang="es_MX">Este es software experimental. Usalo bajo tu propio riesgo.</disclaimer> | |
116 | 118 | <disclaimer lang="fi_FI">Tämä on kokeellista ohjelmistoa. Käytä omalla vastuulla.</disclaimer> |
117 | 119 | <disclaimer lang="fr_CA">Ce logiciel est expérimental. Utilisez à vos propres risques.</disclaimer> |
118 | 120 | <disclaimer lang="fr_FR">Logiciel expérimental. À utiliser à vos risques et périls.</disclaimer> |
0 | 0.6.15 | |
1 | - Updated Language files from Transifex | |
2 | ||
3 | 0.6.14 | |
4 | - Updated Language files from Transifex | |
0 | 1.4.4 | |
1 | - Updated Language files from Transifex | |
2 | ||
3 | 1.4.3 | |
4 | - Updated Language files from Transifex | |
5 | ||
6 | 1.4.2 | |
7 | - Updated Language files from Transifex | |
8 | ||
9 | 1.4.1 | |
10 | - Updated Language files from Transifex | |
11 | ||
12 | 1.4.0 | |
13 | - Cmake: rename find_package kodi to Kodi | |
14 | ||
15 | 1.3.1 | |
16 | - Fix includes | |
17 | ||
18 | 1.3.0 | |
19 | - Updated to PVR addon API v5.2.0 | |
20 | ||
21 | 1.2.1 | |
22 | - Updated to PVR addon API v5.1.1 | |
23 | ||
24 | 1.2.0 | |
25 | - Updated to PVR addon API v5.1.0 | |
26 | ||
27 | 1.1.2 | |
28 | - added support for buffer timeshift calls | |
29 | - added fix for new recordings bug | |
30 | ||
31 | 1.1.1 | |
32 | - Populate Channel UID field on recordings | |
33 | ||
34 | 1.1.0 | |
35 | - Updated to PVR addon API v5.0.0 | |
36 | ||
37 | 1.0.2 | |
38 | - Updated to PVR API v4.2.0 | |
39 | ||
40 | 1.0.1 | |
41 | - Updated Language files from Transifex | |
42 | ||
43 | 1.0.0 | |
44 | - Initial Kodi Krypton version. | |
5 | 45 | |
6 | 46 | 0.6.13 |
7 | 47 | - Updated Language files from Transifex |
194 | 194 | msgctxt "#30142" |
195 | 195 | msgid "Low" |
196 | 196 | msgstr "Ниско" |
197 | ||
198 | msgctxt "#30160" | |
199 | msgid "Not Set" | |
200 | msgstr "Няма поредица" |
81 | 81 | |
82 | 82 | msgctxt "#30016" |
83 | 83 | msgid "Store Resume/Watched status on server" |
84 | msgstr "Uložit čas \"Začít od\" / \"Shlédnuto\" na serveru" | |
84 | msgstr "Uložit čas \"Začít od\" / \"Zhlédnuto\" na serveru" | |
85 | 85 | |
86 | 86 | msgctxt "#30017" |
87 | 87 | msgid "Recorded TV folder not found" |
245 | 245 | |
246 | 246 | msgctxt "#30162" |
247 | 247 | msgid "Keep Until I Watch" |
248 | msgstr "Uchovávat do shlédnutí" | |
248 | msgstr "Uchovávat do zhlédnutí" | |
249 | 249 | |
250 | 250 | msgctxt "#30163" |
251 | 251 | msgid "Keep Until Space Needed" |
183 | 183 | msgid "Delete the entire series" |
184 | 184 | msgstr "Διαγραφή όλης της σειράς" |
185 | 185 | |
186 | msgctxt "#30131" | |
187 | msgid "One time (manual)" | |
188 | msgstr "Μία φορά (χειροποίητα)" | |
189 | ||
186 | 190 | msgctxt "#30140" |
187 | 191 | msgid "Normal" |
188 | 192 | msgstr "Κανονική" |
194 | 198 | msgctxt "#30142" |
195 | 199 | msgid "Low" |
196 | 200 | msgstr "Ελαχ." |
201 | ||
202 | msgctxt "#30151" | |
203 | msgid "New and Rerun Episodes" | |
204 | msgstr "Καινούργια και επανάληψη επεισοδίων" |
14 | 14 | "Content-Transfer-Encoding: 8bit\n" |
15 | 15 | "Language: es_MX\n" |
16 | 16 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
17 | ||
18 | msgctxt "#30000" | |
19 | msgid "Server Hostname or IP" | |
20 | msgstr "Nombre del Servidor o 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 "Mantener la IP en 127.0.0.1, si el servidor esta funcionando en este mismo sistema" | |
25 | ||
26 | msgctxt "#30002" | |
27 | msgid "Port Number" | |
28 | msgstr "Numero de Puerto" | |
29 | ||
30 | msgctxt "#30004" | |
31 | msgid "No video data found on this channel" | |
32 | msgstr "No se encontraron datos de video en este canal " | |
33 | ||
34 | msgctxt "#30005" | |
35 | msgid "Tuner is needed for recording" | |
36 | msgstr "Es nescesario un sintonizador para grabar" | |
37 | ||
38 | msgctxt "#30006" | |
39 | msgid "Recording delete failed, file in use or write protected" | |
40 | msgstr "Fallo la eliminacion de la grabacion, el archivo esta en uso o esta protegido contra escritura" | |
41 | ||
42 | msgctxt "#30007" | |
43 | msgid "Recording delete failed, recorded file doesn't exist" | |
44 | msgstr "Fallo la eliminacion de la grabacion, el archivo grabado no existe" | |
45 | ||
46 | msgctxt "#30008" | |
47 | msgid "Recording file not found" | |
48 | msgstr "Archivo de grabacion no encontrado" | |
49 | ||
50 | msgctxt "#30009" | |
51 | msgid "Alternate channel chosen: " | |
52 | msgstr "Canal alterno elegido:" | |
53 | ||
54 | msgctxt "#30010" | |
55 | msgid "Alternate time chosen: " | |
56 | msgstr "Tiempo alterno elegido:" | |
57 | ||
58 | msgctxt "#30011" | |
59 | msgid "Can't start, tuner is no longer available" | |
60 | msgstr "No se puede iniciar, el sintonizador ya no esta disponible" | |
61 | ||
62 | msgctxt "#30012" | |
63 | msgid "Channel content is protected" | |
64 | msgstr "El contenido del canal esta protegido" | |
17 | 65 | |
18 | 66 | msgctxt "#30101" |
19 | 67 | msgid "Record this episode only" |
85 | 85 | |
86 | 86 | msgctxt "#30017" |
87 | 87 | msgid "Recorded TV folder not found" |
88 | msgstr "Tallennettu TV kansiota ei löydy" | |
88 | msgstr "Tv-ohjelmien tallennuskansiota ei löytynyt" | |
89 | 89 | |
90 | 90 | msgctxt "#30018" |
91 | 91 | msgid "Recorded TV folder cannot be opened" |
92 | msgstr "Tallennettu TV kansiota ei voida avata" | |
92 | msgstr "Tv-ohjelmien tallennuskansiota ei voida avata" | |
93 | 93 | |
94 | 94 | msgctxt "#30019" |
95 | 95 | msgid "ServerWMC version update is available (%s)" |
101 | 101 | |
102 | 102 | msgctxt "#30021" |
103 | 103 | msgid "LiveTV timed-out" |
104 | msgstr "LiveTV aikakatkaisu" | |
104 | msgstr "Tv-lähetyksen aikakatkaisu" | |
105 | ||
106 | msgctxt "#30022" | |
107 | msgid "LiveTV error, exited early" | |
108 | msgstr "Virhe tv-lähetystä toistettaessa, lopetettiin etuajassa" | |
109 | ||
110 | msgctxt "#30023" | |
111 | msgid "Recording stream timed-out" | |
112 | msgstr "Tallennuksen aikakatkaisu" | |
113 | ||
114 | msgctxt "#30024" | |
115 | msgid "Recording stream exited early" | |
116 | msgstr "Tallennus keskeytyi ennenaikaisesti" | |
105 | 117 | |
106 | 118 | msgctxt "#30025" |
107 | 119 | msgid "Use WakeOnLAN to wake up server" |
111 | 123 | msgid "Sending WakeOnLAN to server..." |
112 | 124 | msgstr "Lähetetään WakeOnLan palvelimelle..." |
113 | 125 | |
126 | msgctxt "#30027" | |
127 | msgid "Time drift between client and backend of %s minutes" | |
128 | msgstr "Asiakasohjelman ja taustaosan välinen aikaero %s minuuttia" | |
129 | ||
114 | 130 | msgctxt "#30100" |
115 | 131 | msgid "Recording Preference" |
116 | 132 | msgstr "Tallennusasetukset" |
123 | 139 | msgid "Record the series" |
124 | 140 | msgstr "Tallenna sarjoja" |
125 | 141 | |
142 | msgctxt "#30103" | |
143 | msgid "Show type:" | |
144 | msgstr "Ohjelmatyyppi:" | |
145 | ||
126 | 146 | msgctxt "#30104" |
127 | 147 | msgid "New and rerun" |
128 | 148 | msgstr "Uusi ja uusinta" |
163 | 183 | msgid "Delete the entire series" |
164 | 184 | msgstr "Poista koko sarja" |
165 | 185 | |
186 | msgctxt "#30130" | |
187 | msgid "Created by Repeating Timer" | |
188 | msgstr "Luotu toistuvalla ajastuksella" | |
189 | ||
166 | 190 | msgctxt "#30131" |
167 | 191 | msgid "One time (manual)" |
168 | 192 | msgstr "Kerran (manuaalinen)" |
187 | 187 | msgid "Created by Repeating Timer" |
188 | 188 | msgstr "נוצר ע\"י תזמון חוזר" |
189 | 189 | |
190 | msgctxt "#30131" | |
191 | msgid "One time (manual)" | |
192 | msgstr "פעם אחת (ידני)" | |
193 | ||
190 | 194 | msgctxt "#30132" |
191 | 195 | msgid "One time (guide)" |
192 | 196 | msgstr "חד פעמי (לוח שידורים)" |
193 | 197 | |
198 | msgctxt "#30133" | |
199 | msgid "One time (wishlist)" | |
200 | msgstr "(פעם אחת (רשימת בקשות" | |
201 | ||
194 | 202 | msgctxt "#30134" |
195 | 203 | msgid "Repeating (manual)" |
196 | 204 | msgstr "חוזר (ידני)" |
199 | 207 | msgid "Repeating (guide)" |
200 | 208 | msgstr "חוזר (לוח שידורים)" |
201 | 209 | |
210 | msgctxt "#30136" | |
211 | msgid "Repeating (wishlist)" | |
212 | msgstr "(חזרה (רשימת בקשות" | |
213 | ||
202 | 214 | msgctxt "#30140" |
203 | 215 | msgid "Normal" |
204 | 216 | msgstr "רגיל" |
210 | 222 | msgctxt "#30142" |
211 | 223 | msgid "Low" |
212 | 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 "שמור לשבוע" | |
261 | ||
262 | msgctxt "#30170" | |
263 | msgid "Keep As Many As Possible" | |
264 | msgstr "שמור הרבה ככל האפשר" | |
265 | ||
266 | msgctxt "#30171" | |
267 | msgid "Keep 1 Recording" | |
268 | msgstr "שמור הקלטה" | |
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 הקלטות" |
183 | 183 | msgid "Delete the entire series" |
184 | 184 | msgstr "전체 시리즈 삭제" |
185 | 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 | ||
186 | 214 | msgctxt "#30140" |
187 | 215 | msgid "Normal" |
188 | 216 | msgstr "보통" |
194 | 222 | msgctxt "#30142" |
195 | 223 | msgid "Low" |
196 | 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편 보존" |
15 | 15 | "Language: mn_MN\n" |
16 | 16 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
17 | 17 | |
18 | msgctxt "#30140" | |
19 | msgid "Normal" | |
20 | msgstr "Энгийн" | |
21 | ||
18 | 22 | msgctxt "#30141" |
19 | 23 | msgid "High" |
20 | 24 | msgstr "Өндөр" |
183 | 183 | msgid "Delete the entire series" |
184 | 184 | msgstr "Slett hele serien" |
185 | 185 | |
186 | msgctxt "#30130" | |
187 | msgid "Created by Repeating Timer" | |
188 | msgstr "Opprettet av Gjentangende Ur" | |
189 | ||
190 | msgctxt "#30131" | |
191 | msgid "One time (manual)" | |
192 | msgstr "En gang (manuell)" | |
193 | ||
194 | msgctxt "#30132" | |
195 | msgid "One time (guide)" | |
196 | msgstr "En gang (guide)" | |
197 | ||
198 | msgctxt "#30133" | |
199 | msgid "One time (wishlist)" | |
200 | msgstr "En gang (ønskeliste)" | |
201 | ||
202 | msgctxt "#30134" | |
203 | msgid "Repeating (manual)" | |
204 | msgstr "Gjentagende (manuell)" | |
205 | ||
206 | msgctxt "#30135" | |
207 | msgid "Repeating (guide)" | |
208 | msgstr "Gjentagende (guide)" | |
209 | ||
210 | msgctxt "#30136" | |
211 | msgid "Repeating (wishlist)" | |
212 | msgstr "Gjentagende (ønskeliste)" | |
213 | ||
186 | 214 | msgctxt "#30140" |
187 | 215 | msgid "Normal" |
188 | 216 | msgstr "Normal" |
194 | 222 | msgctxt "#30142" |
195 | 223 | msgid "Low" |
196 | 224 | msgstr "Lav" |
225 | ||
226 | msgctxt "#30150" | |
227 | msgid "New Episodes Only" | |
228 | msgstr "Kun nye episoder" | |
229 | ||
230 | msgctxt "#30151" | |
231 | msgid "New and Rerun Episodes" | |
232 | msgstr "Nye og reprise episoder" | |
233 | ||
234 | msgctxt "#30152" | |
235 | msgid "Live Only" | |
236 | msgstr "Kun direkte" | |
237 | ||
238 | msgctxt "#30160" | |
239 | msgid "Not Set" | |
240 | msgstr "Ikke satt" | |
241 | ||
242 | msgctxt "#30161" | |
243 | msgid "Keep Latest Recordings" | |
244 | msgstr "Behold siste opptak" | |
245 | ||
246 | msgctxt "#30162" | |
247 | msgid "Keep Until I Watch" | |
248 | msgstr "Behold til sett" | |
249 | ||
250 | msgctxt "#30163" | |
251 | msgid "Keep Until Space Needed" | |
252 | msgstr "Behold til plass trengs" | |
253 | ||
254 | msgctxt "#30164" | |
255 | msgid "Keep Until I Delete" | |
256 | msgstr "Behold til jeg sletter" | |
257 | ||
258 | msgctxt "#30165" | |
259 | msgid "Keep For 1 Week" | |
260 | msgstr "Behold i 1 uke" | |
261 | ||
262 | msgctxt "#30170" | |
263 | msgid "Keep As Many As Possible" | |
264 | msgstr "Behold så mange som mulig" | |
265 | ||
266 | msgctxt "#30171" | |
267 | msgid "Keep 1 Recording" | |
268 | msgstr "Behold 1 opptak" | |
269 | ||
270 | msgctxt "#30172" | |
271 | msgid "Keep 2 Recordings" | |
272 | msgstr "Behold 2 opptak" | |
273 | ||
274 | msgctxt "#30173" | |
275 | msgid "Keep 3 Recordings" | |
276 | msgstr "Behold 3 opptak" | |
277 | ||
278 | msgctxt "#30174" | |
279 | msgid "Keep 4 Recordings" | |
280 | msgstr "Behold 4 opptak" | |
281 | ||
282 | msgctxt "#30175" | |
283 | msgid "Keep 5 Recordings" | |
284 | msgstr "Behold 5 opptak" | |
285 | ||
286 | msgctxt "#30176" | |
287 | msgid "Keep 6 Recordings" | |
288 | msgstr "Behold 6 opptak" | |
289 | ||
290 | msgctxt "#30177" | |
291 | msgid "Keep 7 Recordings" | |
292 | msgstr "Behold 7 opptak" | |
293 | ||
294 | msgctxt "#30178" | |
295 | msgid "Keep 10 Recordings" | |
296 | msgstr "Behold 10 opptak" |
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 "Usar o endereço IP 127.0.0.1, se o servidor estiver presente no mesmo sistema" | |
24 | msgstr "Usar o IP 127.0.0.1, se o servidor estiver presente no mesmo sistema" | |
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 "O tempo limite da transmissão esgotou, problema desconhecido" | |
32 | msgstr "Tempo limite da emissão foi atingido por um motivo desconhecido" | |
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 "Para gravar, é necessário um sintonizador" | |
40 | msgstr "Reque um sintonizador para a gravação" | |
41 | 41 | |
42 | 42 | msgctxt "#30006" |
43 | 43 | msgid "Recording delete failed, file in use or write protected" |
49 | 49 | |
50 | 50 | msgctxt "#30008" |
51 | 51 | msgid "Recording file not found" |
52 | msgstr "O ficheiro da gravação não foi encontrado" | |
52 | msgstr "Ficheiro de gravação não encontrado" | |
53 | 53 | |
54 | 54 | msgctxt "#30009" |
55 | 55 | msgid "Alternate channel chosen: " |
56 | msgstr "Foi escolhido um canal alternativo" | |
56 | msgstr "Canal alternativo escolhido:" | |
57 | 57 | |
58 | 58 | msgctxt "#30010" |
59 | 59 | msgid "Alternate time chosen: " |
60 | msgstr "Foi escolhida uma hora alternativa" | |
60 | msgstr "Hora alternativa escolhida:" | |
61 | 61 | |
62 | 62 | msgctxt "#30011" |
63 | 63 | msgid "Can't start, tuner is no longer available" |
64 | msgstr "Não é possível iniciar, o sintonizador já não está disponível" | |
64 | msgstr "Não é possível iniciar, o sintonizador não está disponível" | |
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 "Permitir chamadas SignalStatus" | |
76 | msgstr "Ativar chamadas SignalStatus" | |
77 | 77 | |
78 | 78 | msgctxt "#30015" |
79 | 79 | msgid "Refresh SignalStatus Interval (sec)" |
80 | msgstr "Intervalo de actualização SignalStatus (seg)" | |
80 | msgstr "Intervalo de atualização SignalStatus (seg)" | |
81 | 81 | |
82 | 82 | msgctxt "#30016" |
83 | 83 | msgid "Store Resume/Watched status on server" |
84 | msgstr "Armazenar tempos de visionamento no servidor" | |
84 | msgstr "Guardar tempos de visionamento no servidor" | |
85 | 85 | |
86 | 86 | msgctxt "#30017" |
87 | 87 | msgid "Recorded TV folder not found" |
88 | msgstr "A pasta de gravações de TV não foi encontrada" | |
88 | msgstr "Pasta de gravações não encontrada" | |
89 | 89 | |
90 | 90 | msgctxt "#30018" |
91 | 91 | msgid "Recorded TV folder cannot be opened" |
92 | msgstr "Não é possível abrir a pasta de gravações de TV" | |
92 | msgstr "Não foi possível abrir a pasta de gravações" | |
93 | 93 | |
94 | 94 | msgctxt "#30019" |
95 | 95 | msgid "ServerWMC version update is available (%s)" |
96 | msgstr "Está disponível uma versão actualizada de ServerWMC (%s)" | |
96 | msgstr "Existe uma atualização para ServerWMC (%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 "O tempo limite de LiveTV terminou" | |
104 | msgstr "TV em direto expirada" | |
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 "O tempo limite da gravação expirou" | |
112 | msgstr "A emissão de gravação expirou" | |
113 | 113 | |
114 | 114 | msgctxt "#30024" |
115 | 115 | msgid "Recording stream exited early" |
116 | msgstr "A gravação encerrou antes do tempo" | |
116 | msgstr "A emissão de gravação encerrou antes do tempo" | |
117 | 117 | |
118 | 118 | msgctxt "#30025" |
119 | 119 | msgid "Use WakeOnLAN to wake up server" |
120 | msgstr "Usar WakeOnLan para iniciar o servidor. " | |
120 | msgstr "Usar WakeOnLan para iniciar o servidor" | |
121 | 121 | |
122 | 122 | msgctxt "#30026" |
123 | 123 | msgid "Sending WakeOnLAN to server..." |
124 | msgstr "A enviar pacote WakeOnLan para servidor..." | |
124 | msgstr "A enviar pacote WakeOnLan para o servidor..." | |
125 | 125 | |
126 | 126 | msgctxt "#30027" |
127 | 127 | msgid "Time drift between client and backend of %s minutes" |
128 | msgstr "Desvio de tempo entre o cliente e a backend de %s minutos" | |
128 | msgstr "Desvio de tempo entre o cliente e a estrutura de %s minutos" | |
129 | 129 | |
130 | 130 | msgctxt "#30100" |
131 | 131 | msgid "Recording Preference" |
132 | msgstr "Preferência de Gravação" | |
132 | msgstr "Preferência de gravação" | |
133 | 133 | |
134 | 134 | msgctxt "#30101" |
135 | 135 | msgid "Record this episode only" |
136 | msgstr "Gravar apenas este episódi" | |
136 | msgstr "Gravar apenas este episódio" | |
137 | 137 | |
138 | 138 | msgctxt "#30102" |
139 | 139 | msgid "Record the series" |
145 | 145 | |
146 | 146 | msgctxt "#30104" |
147 | 147 | msgid "New and rerun" |
148 | msgstr "Estreias e reposições" | |
148 | msgstr "Novas e reposições" | |
149 | 149 | |
150 | 150 | msgctxt "#30105" |
151 | 151 | msgid "New only" |
152 | msgstr "Apenas estreias" | |
152 | msgstr "Apenas novas" | |
153 | 153 | |
154 | 154 | msgctxt "#30106" |
155 | 155 | msgid "Live only" |
161 | 161 | |
162 | 162 | msgctxt "#30108" |
163 | 163 | msgid "Any Channel" |
164 | msgstr "Qualquer Canal" | |
164 | msgstr "Qualquer canal" | |
165 | 165 | |
166 | 166 | msgctxt "#30110" |
167 | 167 | msgid "Airtime:" |
173 | 173 | |
174 | 174 | msgctxt "#30120" |
175 | 175 | msgid "Delete Timer" |
176 | msgstr "Apagar Temporizador" | |
176 | msgstr "Apagar temporizador" | |
177 | 177 | |
178 | 178 | msgctxt "#30121" |
179 | 179 | msgid "Delete this episode timer only" |
180 | msgstr "Apagar apenas este temporizador de episódio" | |
180 | msgstr "Apagar apenas este temporizador" | |
181 | 181 | |
182 | 182 | msgctxt "#30122" |
183 | 183 | msgid "Delete the entire series" |
184 | 184 | msgstr "Apagar toda a série" |
185 | 185 | |
186 | msgctxt "#30130" | |
187 | msgid "Created by Repeating Timer" | |
188 | msgstr "Criada por um temporizador recorrente" | |
189 | ||
190 | msgctxt "#30131" | |
191 | msgid "One time (manual)" | |
192 | msgstr "Uma vez (manual)" | |
193 | ||
194 | msgctxt "#30132" | |
195 | msgid "One time (guide)" | |
196 | msgstr "Uma vez (guia)" | |
197 | ||
198 | msgctxt "#30133" | |
199 | msgid "One time (wishlist)" | |
200 | msgstr "Uma vez (lista de desejos)" | |
201 | ||
202 | msgctxt "#30134" | |
203 | msgid "Repeating (manual)" | |
204 | msgstr "Repetição (manual)" | |
205 | ||
206 | msgctxt "#30135" | |
207 | msgid "Repeating (guide)" | |
208 | msgstr "Repetição (guia)" | |
209 | ||
210 | msgctxt "#30136" | |
211 | msgid "Repeating (wishlist)" | |
212 | msgstr "Repetição (lista de desejos)" | |
213 | ||
186 | 214 | msgctxt "#30140" |
187 | 215 | msgid "Normal" |
188 | 216 | msgstr "Normal" |
195 | 223 | msgid "Low" |
196 | 224 | msgstr "Baixa" |
197 | 225 | |
226 | msgctxt "#30150" | |
227 | msgid "New Episodes Only" | |
228 | msgstr "Apenas novos episódios" | |
229 | ||
230 | msgctxt "#30151" | |
231 | msgid "New and Rerun Episodes" | |
232 | msgstr "Reposições e novos episódios" | |
233 | ||
234 | msgctxt "#30152" | |
235 | msgid "Live Only" | |
236 | msgstr "Apenas em direto" | |
237 | ||
238 | msgctxt "#30160" | |
239 | msgid "Not Set" | |
240 | msgstr "Não definido" | |
241 | ||
242 | msgctxt "#30161" | |
243 | msgid "Keep Latest Recordings" | |
244 | msgstr "Manter últimas gravações" | |
245 | ||
246 | msgctxt "#30162" | |
247 | msgid "Keep Until I Watch" | |
248 | msgstr "Manter até serem vistos" | |
249 | ||
250 | msgctxt "#30163" | |
251 | msgid "Keep Until Space Needed" | |
252 | msgstr "Manter até que seja necessário espaço" | |
253 | ||
254 | msgctxt "#30164" | |
255 | msgid "Keep Until I Delete" | |
256 | msgstr "Manter até eu que os apague" | |
257 | ||
258 | msgctxt "#30165" | |
259 | msgid "Keep For 1 Week" | |
260 | msgstr "Manter por 1 semana" | |
261 | ||
262 | msgctxt "#30170" | |
263 | msgid "Keep As Many As Possible" | |
264 | msgstr "Manter o máximo de tempo possível" | |
265 | ||
198 | 266 | msgctxt "#30171" |
199 | 267 | msgid "Keep 1 Recording" |
200 | 268 | msgstr "Manter 1 gravação" |
183 | 183 | msgid "Delete the entire series" |
184 | 184 | msgstr "Odstrániť časovač pre celú sériu" |
185 | 185 | |
186 | msgctxt "#30130" | |
187 | msgid "Created by Repeating Timer" | |
188 | msgstr "Vytvorené opakujúcim sa časovačom" | |
189 | ||
190 | msgctxt "#30131" | |
191 | msgid "One time (manual)" | |
192 | msgstr "Iba raz (ručne)" | |
193 | ||
194 | msgctxt "#30132" | |
195 | msgid "One time (guide)" | |
196 | msgstr "Iba raz (TV program)" | |
197 | ||
198 | msgctxt "#30133" | |
199 | msgid "One time (wishlist)" | |
200 | msgstr "Iba raz (zoznam želaní)" | |
201 | ||
202 | msgctxt "#30134" | |
203 | msgid "Repeating (manual)" | |
204 | msgstr "Opakovanie (ručne)" | |
205 | ||
206 | msgctxt "#30135" | |
207 | msgid "Repeating (guide)" | |
208 | msgstr "Opakovanie (TV program)" | |
209 | ||
210 | msgctxt "#30136" | |
211 | msgid "Repeating (wishlist)" | |
212 | msgstr "Opakovanie (zoznam želaní)" | |
213 | ||
186 | 214 | msgctxt "#30140" |
187 | 215 | msgid "Normal" |
188 | 216 | msgstr "Normálny" |
195 | 223 | msgid "Low" |
196 | 224 | msgstr "Nízka" |
197 | 225 | |
226 | msgctxt "#30150" | |
227 | msgid "New Episodes Only" | |
228 | msgstr "Len nové epizódy" | |
229 | ||
230 | msgctxt "#30151" | |
231 | msgid "New and Rerun Episodes" | |
232 | msgstr "Nové a reprízované epizódy" | |
233 | ||
198 | 234 | msgctxt "#30152" |
199 | 235 | msgid "Live Only" |
200 | 236 | msgstr "Iba naživo" |
206 | 242 | msgctxt "#30161" |
207 | 243 | msgid "Keep Latest Recordings" |
208 | 244 | msgstr "Ponechať najnovšie nahrávky" |
245 | ||
246 | msgctxt "#30162" | |
247 | msgid "Keep Until I Watch" | |
248 | msgstr "Ponechať, dokiaľ si to nepozriem" | |
249 | ||
250 | msgctxt "#30163" | |
251 | msgid "Keep Until Space Needed" | |
252 | msgstr "Ponechať, dokiaľ nebude potrebné miesto" | |
253 | ||
254 | msgctxt "#30164" | |
255 | msgid "Keep Until I Delete" | |
256 | msgstr "Ponechať, dokiaľ to nevymažem" | |
257 | ||
258 | msgctxt "#30165" | |
259 | msgid "Keep For 1 Week" | |
260 | msgstr "Ponechať 1 týždeň" | |
261 | ||
262 | msgctxt "#30170" | |
263 | msgid "Keep As Many As Possible" | |
264 | msgstr "Ponechať toľko, koľko sa dá" | |
265 | ||
266 | msgctxt "#30171" | |
267 | msgid "Keep 1 Recording" | |
268 | msgstr "Ponechať 1 nahrávku" | |
269 | ||
270 | msgctxt "#30172" | |
271 | msgid "Keep 2 Recordings" | |
272 | msgstr "Ponechať 2 nahrávky" | |
273 | ||
274 | msgctxt "#30173" | |
275 | msgid "Keep 3 Recordings" | |
276 | msgstr "Ponechať 3 nahrávky" | |
277 | ||
278 | msgctxt "#30174" | |
279 | msgid "Keep 4 Recordings" | |
280 | msgstr "Ponechať 4 nahrávky" | |
281 | ||
282 | msgctxt "#30175" | |
283 | msgid "Keep 5 Recordings" | |
284 | msgstr "Ponechať 5 nahrávok" | |
285 | ||
286 | msgctxt "#30176" | |
287 | msgid "Keep 6 Recordings" | |
288 | msgstr "Ponechať 6 nahrávok" | |
289 | ||
290 | msgctxt "#30177" | |
291 | msgid "Keep 7 Recordings" | |
292 | msgstr "Ponechať 7 nahrávok" | |
293 | ||
294 | msgctxt "#30178" | |
295 | msgid "Keep 10 Recordings" | |
296 | msgstr "Ponechať 10 nahrávok" |
194 | 194 | msgctxt "#30142" |
195 | 195 | msgid "Low" |
196 | 196 | msgstr "Düşük" |
197 | ||
198 | msgctxt "#30150" | |
199 | msgid "New Episodes Only" | |
200 | msgstr "Sadece Yeni Bölümler" |
17 | 17 | * |
18 | 18 | */ |
19 | 19 | |
20 | #include "kodi/libXBMC_addon.h" | |
20 | #include "libXBMC_addon.h" | |
21 | 21 | #include <string> |
22 | #include "platform/os.h" | |
22 | #include "p8-platform/os.h" | |
23 | 23 | #include "client.h" |
24 | 24 | #include "Socket.h" |
25 | 25 | |
26 | 26 | #include "utilities.h" |
27 | #include "platform/util/timeutils.h" | |
28 | #include "platform/threads/mutex.h" | |
27 | #include "p8-platform/util/timeutils.h" | |
28 | #include "p8-platform/threads/mutex.h" | |
29 | 29 | |
30 | 30 | using namespace std; |
31 | 31 | using namespace ADDON; |
32 | 32 | |
33 | PLATFORM::CMutex m_mutex; | |
33 | P8PLATFORM::CMutex m_mutex; | |
34 | 34 | |
35 | 35 | /* Master defines for client control */ |
36 | 36 | //#define RECEIVE_TIMEOUT 6 //sec |
592 | 592 | int maxAttempts = 3; |
593 | 593 | int sleepAttemptsMs = 1000; |
594 | 594 | |
595 | PLATFORM::CLockObject lock(m_mutex); // only process one request at a time | |
595 | P8PLATFORM::CLockObject lock(m_mutex); // only process one request at a time | |
596 | 596 | |
597 | 597 | int code; |
598 | 598 | std::vector<CStdString> reponses; |
18 | 18 | */ |
19 | 19 | |
20 | 20 | #include "client.h" |
21 | #include "kodi/xbmc_pvr_dll.h" | |
22 | #include "kodi/libKODI_guilib.h" | |
21 | #include "xbmc_pvr_dll.h" | |
23 | 22 | #include "pvr2wmc.h" |
24 | 23 | #include "utilities.h" |
25 | #include "platform/util/util.h" | |
24 | #include "p8-platform/util/util.h" | |
26 | 25 | |
27 | 26 | using namespace std; |
28 | 27 | using namespace ADDON; |
66 | 65 | |
67 | 66 | CHelper_libXBMC_addon *XBMC = NULL; |
68 | 67 | CHelper_libXBMC_pvr *PVR = NULL; |
69 | CHelper_libKODI_guilib *GUI = NULL; | |
70 | 68 | |
71 | 69 | #define LOCALHOST "127.0.0.1" |
72 | 70 | |
173 | 171 | return ADDON_STATUS_PERMANENT_FAILURE; |
174 | 172 | } |
175 | 173 | |
176 | // register gui | |
177 | GUI = new CHelper_libKODI_guilib; | |
178 | if (!GUI->RegisterMe(hdl)) | |
179 | { | |
180 | SAFE_DELETE(GUI); | |
181 | SAFE_DELETE(XBMC); | |
182 | return ADDON_STATUS_PERMANENT_FAILURE; | |
183 | } | |
184 | ||
185 | 174 | // register as pvr |
186 | 175 | PVR = new CHelper_libXBMC_pvr; |
187 | 176 | if (!PVR->RegisterMe(hdl)) |
188 | 177 | { |
189 | 178 | SAFE_DELETE(PVR); |
190 | SAFE_DELETE(GUI); | |
191 | 179 | SAFE_DELETE(XBMC); |
192 | 180 | return ADDON_STATUS_PERMANENT_FAILURE; |
193 | 181 | } |
206 | 194 | { |
207 | 195 | SAFE_DELETE(_wmc); |
208 | 196 | SAFE_DELETE(PVR); |
209 | SAFE_DELETE(GUI); | |
210 | 197 | SAFE_DELETE(XBMC); |
211 | 198 | _CurStatus = ADDON_STATUS_LOST_CONNECTION; |
212 | 199 | } |
239 | 226 | if (_wmc) |
240 | 227 | _wmc->UnLoading(); |
241 | 228 | SAFE_DELETE(PVR); |
242 | SAFE_DELETE(GUI); | |
243 | 229 | _bCreated = false; |
244 | 230 | _CurStatus = ADDON_STATUS_UNKNOWN; |
245 | 231 | } |
285 | 271 | { |
286 | 272 | } |
287 | 273 | |
288 | void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) | |
289 | { | |
290 | } | |
291 | ||
292 | 274 | /*********************************************************** |
293 | 275 | * PVR Client AddOn specific public library functions |
294 | 276 | ***********************************************************/ |
295 | 277 | |
278 | void OnSystemSleep() | |
279 | { | |
280 | } | |
281 | ||
282 | void OnSystemWake() | |
283 | { | |
284 | } | |
285 | ||
286 | void OnPowerSavingActivated() | |
287 | { | |
288 | } | |
289 | ||
290 | void OnPowerSavingDeactivated() | |
291 | { | |
292 | } | |
293 | ||
296 | 294 | const char* GetPVRAPIVersion(void) |
297 | 295 | { |
298 | 296 | static const char *strApiVersion = XBMC_PVR_API_VERSION; |
307 | 305 | |
308 | 306 | const char* GetGUIAPIVersion(void) |
309 | 307 | { |
310 | return KODI_GUILIB_API_VERSION; | |
308 | return ""; // GUI API not used | |
311 | 309 | } |
312 | 310 | |
313 | 311 | const char* GetMininumGUIAPIVersion(void) |
314 | 312 | { |
315 | return KODI_GUILIB_MIN_API_VERSION; | |
313 | return ""; // GUI API not used | |
316 | 314 | } |
317 | 315 | |
318 | 316 | PVR_ERROR GetAddonCapabilities(PVR_ADDON_CAPABILITIES* pCapabilities) |
376 | 374 | return PVR_ERROR_SERVER_ERROR; |
377 | 375 | } |
378 | 376 | |
379 | int GetCurrentClientChannel(void) | |
380 | { | |
381 | return _currentChannel.iUniqueId; | |
382 | } | |
383 | ||
384 | 377 | PVR_ERROR GetStreamProperties(PVR_STREAM_PROPERTIES* pProperties) |
385 | 378 | { |
386 | 379 | return PVR_ERROR_NOT_IMPLEMENTED; |
687 | 680 | PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_MENUHOOK_DATA &item) |
688 | 681 | { |
689 | 682 | return PVR_ERROR_NOT_IMPLEMENTED; |
683 | } | |
684 | ||
685 | bool IsTimeshifting(void) | |
686 | { | |
687 | if (_wmc) | |
688 | return _wmc->IsTimeShifting(); | |
689 | else | |
690 | return false; | |
691 | } | |
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; | |
690 | 712 | } |
691 | 713 | |
692 | 714 | /** UNUSED API FUNCTIONS */ |
704 | 726 | const char * GetLiveStreamURL(const PVR_CHANNEL &channel) { return ""; } |
705 | 727 | bool SeekTime(int,bool,double*) { return false; } |
706 | 728 | void SetSpeed(int) {}; |
707 | bool IsTimeshifting(void) { return false; } | |
729 | bool IsRealTimeStream(void) { return true; } | |
708 | 730 | PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY[], int*) { return PVR_ERROR_NOT_IMPLEMENTED; }; |
709 | time_t GetPlayingTime() { return 0; } | |
710 | time_t GetBufferTimeStart() { return 0; } | |
711 | time_t GetBufferTimeEnd() { return 0; } | |
712 | 731 | PVR_ERROR UndeleteRecording(const PVR_RECORDING& recording) { return PVR_ERROR_NOT_IMPLEMENTED; } |
713 | 732 | PVR_ERROR DeleteAllRecordingsFromTrash() { return PVR_ERROR_NOT_IMPLEMENTED; } |
733 | PVR_ERROR SetEPGTimeFrame(int) { return PVR_ERROR_NOT_IMPLEMENTED; } | |
714 | 734 | |
715 | 735 | } |
18 | 18 | */ |
19 | 19 | #pragma once |
20 | 20 | |
21 | #include "kodi/libXBMC_addon.h" | |
22 | #include "kodi/libXBMC_pvr.h" | |
23 | #include "kodi/libKODI_guilib.h" | |
24 | #include "platform/util/StdString.h" | |
21 | #include "libXBMC_addon.h" | |
22 | #include "libXBMC_pvr.h" | |
23 | #include "libKODI_guilib.h" | |
24 | #include "p8-platform/util/StdString.h" | |
25 | 25 | |
26 | 26 | #include "clientversion.h" |
27 | 27 | |
37 | 37 | extern bool g_bEnableMultiResume; |
38 | 38 | extern ADDON::CHelper_libXBMC_addon *XBMC; |
39 | 39 | extern CHelper_libXBMC_pvr *PVR; |
40 | extern CHelper_libKODI_guilib *GUI; | |
41 | 40 | extern CStdString g_strServerMAC; |
42 | 41 | extern bool g_bWakeOnLAN; |
43 | 42 | extern CStdString g_AddonDataCustom; |
20 | 20 | |
21 | 21 | inline CStdString PVRWMC_GetClientVersion() |
22 | 22 | { |
23 | return "0.6.9"; // ALSO CHANGE IN REV NUMBER in 'pvr.wmc/addon.xml.in' | |
23 | return "1.3.0"; // ALSO CHANGE IN REV NUMBER in 'pvr.wmc/addon.xml.in' | |
24 | 24 | } |
17 | 17 | * |
18 | 18 | */ |
19 | 19 | |
20 | #include "kodi/util/XMLUtils.h" | |
20 | #include "util/XMLUtils.h" | |
21 | 21 | #include "pvr2wmc.h" |
22 | 22 | #include "utilities.h" |
23 | #include "platform/util/timeutils.h" | |
23 | #include "p8-platform/util/timeutils.h" | |
24 | 24 | |
25 | 25 | #include <memory> |
26 | 26 | |
27 | 27 | using namespace std; |
28 | 28 | using namespace ADDON; |
29 | using namespace PLATFORM; | |
29 | using namespace P8PLATFORM; | |
30 | 30 | |
31 | 31 | #define null NULL |
32 | 32 | |
37 | 37 | |
38 | 38 | int64_t _lastRecordingUpdateTime; // the time of the last recording display update |
39 | 39 | |
40 | int _buffTimesCnt; // filter how often we do buffer status reads | |
41 | int _buffTimeFILTER; | |
40 | 42 | |
41 | 43 | Pvr2Wmc::Pvr2Wmc(void) |
42 | 44 | { |
1069 | 1071 | } |
1070 | 1072 | |
1071 | 1073 | // check time since last time Recordings were updated, update if it has been awhile |
1072 | if ( _lastRecordingUpdateTime != 0 && PLATFORM::GetTimeMs() > _lastRecordingUpdateTime + 120000) | |
1074 | if ( _lastRecordingUpdateTime != 0 && P8PLATFORM::GetTimeMs() > _lastRecordingUpdateTime + 120000) | |
1073 | 1075 | { |
1074 | 1076 | PVR->TriggerRecordingUpdate(); |
1075 | 1077 | } |
1141 | 1143 | xRec.iEpgEventId = atoi(v[18].c_str()); |
1142 | 1144 | } |
1143 | 1145 | |
1146 | // Kodi PVR API 5.0.0 adds EPG ID field | |
1147 | if (v.size() > 18) | |
1148 | { | |
1149 | xRec.iChannelUid = atoi(v[17].c_str()); | |
1150 | } | |
1151 | else | |
1152 | { | |
1153 | xRec.iChannelUid = PVR_CHANNEL_INVALID_UID; | |
1154 | } | |
1155 | ||
1156 | /* TODO: PVR API 5.1.0: Implement this */ | |
1157 | xRec.channelType = PVR_RECORDING_CHANNEL_TYPE_UNKNOWN; | |
1158 | ||
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 | ||
1144 | 1176 | PVR->TransferRecordingEntry(handle, &xRec); |
1145 | 1177 | } |
1146 | 1178 | |
1147 | _lastRecordingUpdateTime = PLATFORM::GetTimeMs(); | |
1179 | _lastRecordingUpdateTime = P8PLATFORM::GetTimeMs(); | |
1148 | 1180 | |
1149 | 1181 | return PVR_ERROR_NO_ERROR; |
1150 | 1182 | } |
1259 | 1291 | |
1260 | 1292 | _lostStream = true; // init |
1261 | 1293 | _readCnt = 0; |
1294 | int _buffTimesCnt = 0; | |
1295 | int _buffTimeFILTER = 0; | |
1262 | 1296 | |
1263 | 1297 | CloseLiveStream(false); // close current stream (if any) |
1264 | 1298 | |
1565 | 1599 | |
1566 | 1600 | _lostStream = true; // init |
1567 | 1601 | _readCnt = 0; |
1602 | int _buffTimesCnt = 0; | |
1603 | int _buffTimeFILTER = 0; | |
1568 | 1604 | |
1569 | 1605 | // request an active recording stream |
1570 | 1606 | CStdString request; |
1672 | 1708 | snprintf(cachedSignalStatus.strServiceName, sizeof(cachedSignalStatus.strServiceName), "%s", results[3].c_str()); |
1673 | 1709 | snprintf(cachedSignalStatus.strMuxName, sizeof(cachedSignalStatus.strMuxName), "%s", results[4].c_str()); |
1674 | 1710 | cachedSignalStatus.iSignal = (int)(atoi(results[5]) * 655.35); |
1675 | cachedSignalStatus.dVideoBitrate = atof(results[6]); | |
1676 | cachedSignalStatus.dAudioBitrate = atof(results[7]); | |
1677 | 1711 | |
1678 | 1712 | bool error = atoi(results[8]) == 1; |
1679 | 1713 | if (error) |
1689 | 1723 | signalStatus = cachedSignalStatus; |
1690 | 1724 | return PVR_ERROR_NO_ERROR; |
1691 | 1725 | } |
1726 | ||
1727 | ||
1728 | bool Pvr2Wmc::IsTimeShifting() | |
1729 | { | |
1730 | if (_streamFile) // ?not sure if this should be false if playtime is at buffer end) | |
1731 | return true; | |
1732 | else | |
1733 | return false; | |
1734 | } | |
1735 | ||
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() | |
1766 | { | |
1767 | if (_streamFile) | |
1768 | { | |
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 | } |
19 | 19 | #pragma once |
20 | 20 | |
21 | 21 | #include <vector> |
22 | #include "platform/util/StdString.h" | |
22 | #include "p8-platform/util/StdString.h" | |
23 | 23 | #include "client.h" |
24 | 24 | #include "Socket.h" |
25 | 25 | |
125 | 125 | long long LengthLiveStream(void); |
126 | 126 | long long ActualFileSize(int count); |
127 | 127 | PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS &signalStatus); |
128 | ||
128 | ||
129 | // time shifting | |
130 | bool IsTimeShifting(); | |
131 | time_t GetPlayingTime(); | |
132 | time_t GetBufferTimeStart(); | |
133 | time_t GetBufferTimeEnd(); | |
134 | ||
129 | 135 | bool CheckErrorOnServer(); |
130 | 136 | void TriggerUpdates(std::vector<CStdString> results); |
131 | 137 | void ExtractDriveSpace(std::vector<CStdString> results); |
17 | 17 | * |
18 | 18 | */ |
19 | 19 | |
20 | #include "platform/util/StdString.h" | |
21 | #include "kodi/util/XMLUtils.h" | |
20 | #include "p8-platform/util/StdString.h" | |
21 | #include "util/XMLUtils.h" | |
22 | 22 | #include "utilities.h" |
23 | 23 | |
24 | 24 | #include "client.h" |
80 | 80 | } |
81 | 81 | } |
82 | 82 | |
83 | // return the directory from the input file path | |
84 | CStdString GetDirectoryPath(CStdString const &path) | |
85 | { | |
86 | size_t found = path.find_last_of("/\\"); | |
87 | if (found != CStdString::npos) | |
88 | return path.substr(0, found); | |
89 | else | |
90 | return path; | |
91 | } | |
92 | ||
83 | 93 | bool ReadFileContents(CStdString const &strFileName, CStdString &strContent) |
84 | 94 | { |
85 | 95 | void* fileHandle = XBMC->OpenFile(strFileName.c_str(), 0); |
28 | 28 | |
29 | 29 | bool EndsWith(CStdString const &fullString, CStdString const &ending); |
30 | 30 | bool StartsWith(CStdString const &fullString, CStdString const &starting); |
31 | CStdString GetDirectoryPath(CStdString const &path); | |
31 | 32 | bool ReadFileContents(CStdString const &strFileName, CStdString &strResult); |
32 | 33 | bool WriteFileContents(CStdString const &strFileName, CStdString &strContent); |