diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/Makefile.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/Makefile.am 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/Makefile.am 2014-01-04 10:28:19.000000000 +0000 @@ -14,6 +14,8 @@ pvr.njoy \ pvr.vuplus \ pvr.argustv \ + pvr.dvblink \ + pvr.wmc \ $(ADDON_MYTHTV_SUBDIRS) \ $(ADDON_IPTVSIMPLE_SUBDIRS) diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/Makefile.include.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/Makefile.include.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/Makefile.include.am 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/Makefile.include.am 2014-01-04 10:28:12.000000000 +0000 @@ -2,7 +2,7 @@ # Makefile include for XBMC PVR add-ons # -INCLUDES = -I. @FFMPEG_INCLUDES@ -I$(abs_top_srcdir)/xbmc -I$(abs_top_srcdir)/lib @HOST_INCLUDES@ +INCLUDES = -I. -I$(abs_top_srcdir)/xbmc -I$(abs_top_srcdir)/lib @HOST_INCLUDES@ WARNINGS = -Wall -Wextra -Wno-missing-field-initializers -Woverloaded-virtual -Wno-parentheses DEFINES = @ARCH_DEFINES@ -DUSE_DEMUX -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS AM_CXXFLAGS = -g -O2 -fPIC $(WARNINGS) $(DEFINES) @HOST_CXXFLAGS@ @@ -36,9 +36,7 @@ mkdir -m 755 -p $(DESTDIR)@LIBDIR@/$(ADDONNAME) mkdir -m 755 -p $(DESTDIR)@DATADIR@/$(ADDONNAME) cp -f @BINPREFIX@$(ADDONBINNAME)@BIN_EXT@ $(DESTDIR)@LIBDIR@/$(ADDONNAME) ; chmod 655 $(DESTDIR)@LIBDIR@/$(ADDONNAME)/@BINPREFIX@$(ADDONBINNAME)@BIN_EXT@ - cp -r -f @abs_top_srcdir@/addons/$(ADDONNAME)/addon/* $(DESTDIR)@DATADIR@/$(ADDONNAME) - cp -r -f @abs_top_builddir@/addons/$(ADDONNAME)/addon/* $(DESTDIR)@DATADIR@/$(ADDONNAME) - chmod -R o+rx $(DESTDIR)@DATADIR@/$(ADDONNAME) + cp -r -f @abs_top_srcdir@/addons/$(ADDONNAME)/addon/* $(DESTDIR)@DATADIR@/$(ADDONNAME) ; chmod -R o+rx $(DESTDIR)@DATADIR@/$(ADDONNAME) endif all: @BUILD_TYPE@ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/addon.xml.in xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/addon.xml.in --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/addon.xml.in 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/addon.xml.in 2014-05-04 06:40:42.000000000 +0000 @@ -1,110 +1,162 @@ - + XBMC voorprogram vir die ARGUS TV PVR http://www.argus-tv.com// XBMC frontend for the ARGUS TV PVR http://www.argus-tv.com// + XBMC клиент за ARGUS TV ПВР http://www.argus-tv.com// + Interfície de l'XBMC per l'ARGUS TV PVR http://www.argus-tv.com// Rozhraní XBMC pro ARGUS TV PVR http://www.argus-tv.com// + Blaen XBMC ar gyfer ARGUS TV PVR http://www.argus-tv.com// XBMC frontend til ARGUS TV PVR http://www.argus-tv.com// - XBMC frontend für ARGUS TV PVR http://www.argus-tv.com// + XBMC Oberfläche für ARGUS TV PVR http://www.argus-tv.com// Frontend του XBMC για το ARGUS TV PVR http://www.argus-tv.com/ XBMC frontend for the ARGUS TV PVR http://www.argus-tv.com// + XBMC frontend for the ARGUS TV PVR http://www.argus-tv.com// Frontend de XBMC para ARGUS TV PVR http://www.argus-tv.com// Frontend de XBMC para ARGUS TV PVR http://www.argus-tv.com// + XBMC esi ARGUS TV PVRile http://www.argus-tv.com// XBMC Interface logicielle pour l'enregistreur vidéo ARGUS TV http://www.argus-tv.com// + Frontal XBMC pour le numériscope ARGUS TV http://www.argus-tv.com/ Interface de XBMC para o PRV de ARGUS TV http://www.argus-tv.com// ממשק קדמי של XBMC ל ARGUS TV PVR http://www.argus-tv.com// + XBMC pozadinski softver za ARGUS TV PVR http://www.argus-tv.com// XBMC ARGUS TV előtér-kiszolgáló http://www.argus-tv.com// + Frontend XBMC untuk ARGUS TV PVR http://www.argus-tv.com// Frontend XBMC di ARGUS TV PVR http://www.argus-tv.com// ARGUS TV PVR 用 XBMC フロントエンド http://www.argus-tv.com// ARGUS TV PVR을 위한 XBMC 프론트엔드 http://www.argus-tv.com// XBMC sąsaja su ARGUS TV PVR http://www.argus-tv.com// + XBMC galasistēma ARGUS TV PVR http://www.argus-tv.com// XBMC интерфејс за ARGUS TV PVR http://www.argus-tv.com// + Bahagian hadapan XBMC untuk PVR ARGUS TV http://www.argus-tv.com// XBMC frontend voor het ARGUS-TV PVR http://www.argus-tv.com// - Interfejs XBMC dla ARGUS TV PVR http://www.argus-tv.com// + XBMC sitt frontend for ARGUS TV PVR http://www.argus-tv.com// + Klient XBMC dla ARGUS TV PVR http://www.argus-tv.com// Frontend XBMC para ARGUS TV PVR http://www.argus-tv.com// Frontend do XBMC para o PVR ARGUS TV http://www.argus-tv.com// Frontend XBMC pentru PVR-ul ARGUS TV http://www.argus-tv.com/ Интерфейс XBMC для ARGUS TV PVR http://www.argus-tv.com// XBMC rozhranie pre ARGUS TV PVR http://www.argus-tv.com// XBMC-jev vmesnik za ARGUS TV PVR http://www.argus-tv.com// + XBMC frontend për ARGUS TV PVR http://www.argus-tv.com & XBMC frontend för ARGUS TV PVR http://www.argus-tv.com/ - XBMC的ARGUS TV PVR前端 http://www.argus-tv.com// + ARGUS TV PVR http://www.argus-tv.com// உடைய XBMC பயனர் இணைப்பு + ARGUS TV PVR http://www.argus-tv.com// için XBMC başlangıcı + Накладка XBMC для ARGUS TV PVR http://www.argus-tv.com// + Giao tiếp XBMC cho ARGUS TV PVR http://www.argus-tv.com/ + XBMC 的 ARGUS TV PVR 前端 http://www.argus-tv.com// + ARGUS TV PVR 'http://www.argus-tv.com//' 可使用的XBMC前端 ARGUS TV PVR voorprogram. Ondersteun stroom van Lewendige TV & Opnames, luister na Radio kanale, EPG en skedules. ARGUS TV PVR frontend. Supports streaming of Live TV & Recordings, listening to Radio channels, EPG and schedules. + ARGUS TV ПВР клиент. Поддържа стрийминг и записване на телевизия, слушане на радио канали, електронен програмен справочник и разписания. + Interfície per l'ARGUS TV PVR. Suporta fluxes de TV en directe i enregistraments, escolta de canals de ràdio, EPG i horaris. Rozhraní ARGUS TV PVR. Podporuje proudové vysílání živého vysílání a nahrávek, poslech kanálů rádia, EPG, a časovače. + ARGUS TV PVR. Mae'n cynnal ffrydio Teledu Byw a Recordiadau, gwrando ar sianeli Radio ac Amserlen Rhaglenni. ARGUS TV PVR frontend'en understøtter streaming af direkte TV og optagelser, lytning til radiokanaler, EPG og tidsplaner. - ARGUS TV PVR frontend. Unterstützt Streaming von TV & Aufnahmen, Abspielen von Radiokanälen, EPG und Aufnahmepläne. + ARGUS TV PVR Oberfläche. Unterstützt Live TV & Aufnahmen, Radiokanäle, EPG und Aufnahmepläne. Frontend για το ARGUS TV PVR. Υποστηρίζει ροές Live TV & Εγγραφές, ακρόαση Ραδιοφώνου, EPG και προγραμματισμό. ARGUS TV PVR frontend. Supports streaming of Live TV & Recordings, listening to Radio channels, EPG and schedules. + ARGUS TV PVR frontend. Supports streaming of Live TV & Recordings, listening to Radio channels, EPG and schedules. Frontend de ARGUS TV PVR. Soporta transmisiones de TV en Vivo y Grabaciones, escuchar canales de Radio, Guía Electrónica de Programas (EPG) y temporizadores. Frontend de ARGUS TV PVR. Soporta transmisiones de TV en Vivo y Grabaciones, escuchar canales de Radio, Guía Electrónica de Programas (EPG) y temporizadores. + ARGUS TV PVR esi. Toetab telekanalite striimimist ja salvestamist, raadio kuulamist ja elektroonilist saatekava. Interface logicielle pour l'enregistreur vidéo ARGUS TV. Supporte la lecture en continu de télévision et son enregistrement, l'écoute de radios, les guides de programmes et les minuteries. - Interface do PVR de ARGUS TV. Soporta transmisión de TV ao vivo e Gravacións, escoita de canles de radio, EPG e programacións. + Frontal de numériscope pour ARGUS TV, prenant en charge les télés en direct & les enregistrements, l'écoute de chaînes radio, le GÉP et les horaires. + Interface do PVR de ARGUS TV. Soporta transmisión de TV ao vivo e Gravacións, escoita de canles de radio, Guía e programacións. ממשק קידמי של ARGOS TV PVR. תומך בהצגת שידורי טלויזיה חיים והקלטות רשימות של תחנות רדיו לוחות שידורים ותזמוני הקלטות. + ARGUS TV PVR pozadinski softver. Podržava stremanje televizije i snimanje, slušanje radio programa, EPG i zakazano snimanje. ARGUS TV PVR előtér-kiszolgáló. Élő adások, felvételek és rádió csatornák sugárzásának támogatása EPG-vel és időzítéssel. + Frontend PVR ARGUS TV. Mendukung pengaliran TV dan Rekaman langsung, mendengarkan kanal radio, EPG dan jadwal. Frontend ARGUS TV PVR. Supporta lo streaming e la registrazione di Live TV, l'ascolto dei canali radio, la guida ai programmi e gli orari. ARGUS TV PVR フロントエンドです。テレビ放送のストリーミング、録画、ラジオチャンネルの視聴、EPG、録画予約をサポートしています。 ARGUS TV PVR 프론트엔드. 라이브 TV 스트리밍과 녹화, 라디오 청취, EPG와 예약 지원. ARGUS TV PVR frontend. Palaiko transliaciją ir įrašus iš Live TV. Klausykite radijo kanalus ir derinkite EPG tvarkaraščius. + ARGUS TV PVR galasistēma. Atbalsta tiešraides TV un ierakstu straumēšanu, radio kanālu klausīšanos, EPG un plānotāju. ARGUS TV PVR интерфејс. Подржува стриминг на Live TV & Снимки, слушање на радио канали, EPG и планирања. + Bahagian hadapan PVR ARGUS TV; menyokong penstirman TV Langsung & Rakaman, mendengar saluran Radio, EPG dan jadual. ARGUS TV PVR frontend. Ondersteunt het bekijken van Live TV en opnames, het beluisteren van radio zenders, het tonen van de EPG en het inplannen/beheren van nieuwe opnames (Timers). - Interfejs ARGUS TV PVR. Obsługuje strumieniowe przesyłanie TV na żywo oraz nagrań, słuchanie kanałów radiowych, EPG i harmonogramy. + ARGUS TV PVR frontend. Støtter visning av direkte TV og opptak, lytting til radiokanaler, EPG og tidsopptak. + Klient ARGUS TV PVR. Wspiera strumieniowanie kanałów telewizyjnych, nagrywanie, planowanie nagrań oraz funkcje przewodnika TV. Frontend ARGUS TV PVR. Suporta transmissão de TV em directo e Gravações, audição de estações de Rádio, EPG e agendamentos. Frontend do PVR ARGUS TV. Suporta streaming de TV Ao Vivo & Gravações, canais de Rádio, EPG e agendamento. Frontend PVR ARGUS TV. Suportă difuzare în flux pentru televiziune în direct și pentru înregistrări, ascultarea canalelor radio, EPG și planificări. Интерфейс для ARGUS TV PVR. Поддерживает просмотр потокового ТВ и видеозаписей, прослушивание радиоканалов и работу с электронным телегидом и расписаниями. ARGUS TV PVR rozhranie. Podporuje streamovanie živého TV vysielania a nahrávok, počúvanie rozhlasových kanálov, EPG a plánovače. Vmesnik za ARGUS TV PVR; podpira pretakanje televizije v živo & posnetkov, poslušanje radia, EPG in časovnike. + ARGUS TV PVR frontend. Përkrahën transmetimin e Live TV's & Rregjistrime, dëgjimin të radio-kanaleve, EPG'së dhe orarin. ARGUS TV PVR frontend. Stödjer strömmning av direktsänd TV & inspelningar, lyssna på radiokanaler, EPG och schemaläggning. - ARGUS TV PVR前端支持直播电视和节目录制、收听广播频道、电子节目表及计划任务功能。 + ARGUS TV PVR முன்நிலை. லைவ் டிவி & பதிவுகளின் ஸ்ட்ரீமிங் செய்யவும், ரேடியோ சேனல்கள் கேட்கவும் மற்றும் EPG, துணைபுரிகிறது. + Накладка для ARGUS TV. Підтримує потокове Live TV і запис, прослуховування радіо каналів, телегід та планування. + Giao tiếp PVR cho ARGUS TV. Hỗ trợ trực tuyến của Live TV và Recordings, nghe Đài phát thanh (Radio), EPG và lịch trình (Schedules). + ARGUS TV PVR 前端。支持直播电视和录像流媒体、收听电台、电子节目单及计划任务功能。 + ARGUS TV PVR前端。支援的串流媒體包括有:電視直播和節目錄影,收聽廣播頻道,電子節目表和時間表。 Hierdie is onstabiele sagteware! Die outeurs is op geen manier verantwoordelik vir gefaalde opnames, inkorrekte tydhouers, gemorsde ure, of enige ander ongewensde effekte. This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. - Això és programari inestable! Els autors no són en absolut responsables d'enregistraments fallist, temporitzadors incorrectes, hores tudades, o qualsevol altra efecte indesitjable... + Тази програма е нестабилна! Авторите не носят отговорност за неуспешно записване, некоректни броячи, пропиляното време и други нежелани ефекти. + Això és programari inestable! Els autors no són de cap manera responsables dels enregistraments que han fallat, temporitzadors incorrectes, hores perdudes, o qualsevols altres efectes indesitjables.. Tento software není stabilní. Autoři nejsou žádným způsobem zodpovědní za selhání při nahrávání, neplatné časovače, ztracený čas, či jakékoliv jiné nežádoucí události... + Mae hwn yn feddalwedd ansad! Nid yw'r awduron yn gyfrifol mewn unrhyw ffordd am fethu recordio, amseru gwallus, oriau wedi eu gwastraffu nac effeithiau anymunol eraill. Dette er ustabil software! Ophavsmændene er på ingen måde ansvarlige for mislykkede optagelser, fejlagtige timere, spildte timer, eller andre uønskede konsekvenser. - Diese Software ist noch in der Entwicklung! Die Autoren sind nicht für fehlgeschlagene Aufnahmen, falsche Timer, verschwendete Zeit oder andere ungewollte Effekte verantwortlich. + Dies ist instabile Software! Die Autoren sind in keiner Weise verantwortlich für fehlgeschlagene Aufnahmen, falsche Timer, verschwendete Zeit oder andere ungewünschte Effekte. Ασταθές πρόγραμμα! Οι δημιουργοί δεν είναι σε καμία περίπτωση υπεύθυνοι για αποτυχημένες εγγραφές, λανθασμένους χρονοδιακόπτες, χαμένες ώρες, ή κάθε είδους ανεπιθύμητα αποτελέσματα.. This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. + This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. ¡Este software es aún inestable! Los autores no son responsables en forma alguna por grabaciones fallidas, temporizaciones incorrectas, tiempo perdido o ningún otro efecto no deseado. ¡Este software es inestable! Los autores no se responsabilizan por grabaciones fallidas, temporizadores incorrectos, horas perdidas, o cualquier otro efecto no deseado.. ¡Esto es software inestable! Los autores no son de ninguna manera responsables por grabaciones fallidas, temporizadores incorrectos, horas perdidas o cualquier otro efecto no deseado... + See on ebastabiilne tarkvara! Autorid ei ole kuidagi moodi vastutavad nurjunud salvestiste, ebaõige aegrelee, raisatud tundide ega muude soovimatute asjade eest. Tämä on epävakaa ohjelma! Ohjelman kirjoittavat eivät vastaa millään tavalla epäonnistuneista nauhoituksista, ajastimen väärästä toiminnasta, hukatusta ajasta tai muista ei-halutuista tapahtumista. Logiciel en cours d'élaboration ! Les auteurs ne sont en aucun cas responsables de l'échec des enregistrements, minuteries défectueuses, temps perdu ou autres effets indésirables.. + Ce logiciel est instable! Les auteurs ne sont aucunement responsables des enregistrements défaillants, des minuteries erronées, des heures perdues ou tout autre effet indésirable. Este é software non estable, os autores non se fan responsábeis dos erros na gravacións, temporizadores incorrectos, e outros efectos non desexados. זוהי תוכנה לא יציבה! היוצרים אינם אחראים לכשלון בהקלטה, תזמונים לא נכונים, שעות מבוזבזות או כל השפעות בלתי רצויות אחרות. + Ovo je nestabilan softver! Autori nisu ni na koji način odgovorani za neuspjelo snimanje, netočna zakazana snimanja, izgubjene sate, ili bilo koje druge neželjene učinke .. Ez nem stabil szoftver! A készítők nem vállalnak felelősséget, a hibás felvételért, rossz időzítésért, elvesztegetett időért... + Ini merupakan software yang tidak stabil! Penulis tidak bertanggung jawab untuk rekaman gagal, timer salah, waktu terbuang, atau efek tak diinginkan lainnya... Þetta er óstöðugur hugbúnaður! Höfundarnir eru á engann hátt ábyrgir fyrir misheppnuðum upptökum, röngum upptökutímum, klukkustundum sem að fóru í súginn eða nokkrum öðrum óæskilegum áhrifum. Questo software è instabile! Gli autori non sono in alcun modo responsabili per registrazioni fallite, timers incorretti, ore perse, o qualsiasi altro effetto indesiderato. これは不安定なソフトウェアです!本プログラムの作者は、録画の失敗、正確に作動しなかったタイマー、無駄にした時間、その他あらゆる好ましくない結果について責任を負わないものとします。 + ეს არის არასტაბილური პროგრამული უზრუნველყოფა! ავტორები არ არიან პასუხისმგებელი შეცდომებზე, არასწორ EPG-ზე, დაკარგულ დროზე ან სხვა ხარვეზებზე 이 소프트웨어는 불안정합니다! 제작자는 녹화 실패, 부정확한 타이머, 시간 낭비 및 기타 예상하지 못한 결과에 대해 책임지지 않습니다.. Tai yra nestabili programinė įranga! Autorius jokiu būdu neatsakingas už nepavykusius įrašus, neteisingus laikmačius, iššvaistytas valandas, ar nutikus kitiems nepageidaujamiems poveikiams ...[COLOR=red](xbmc.lt siūlo/rekomenduoja testuojant šį priedą persijungti į Anglų [orinali] kalbą)[/COLOR] + Šī ir nestabila programmatūra! Autori nav nekādā vaidā atbildīgi par nesanākušiem ierakstiem, nepareiziem taimeriem, iztērētām stundām vai jebkādiem citiem nevēlamiem efektiem.. Ова е нестабилен софтвер! Авторите на ниту еден начин не одговараат за неуспешни снимки, неточни тајмери, потрошени часови, или било кои други несакани ефекти. + Ini merupakan perisian tidak stabil! Pengarang tidak bertanggungjawab atas kegagalan rakaman, pemasa tidak betul, masa yang dibazirkan, atau apa jua kesan yang tidak dikehendaki.. Deze software is niet 100% stabiel! De auteurs zijn op geen enkele wijze aansprakelijk voor mislukte opnames, verspilde tijd, of enig ander ongewild neveneffect.. Dette er ustabil programvare! Skaperen har ikke på noen måte ansvar for feilede opptak, feile timere, bortkastede timer, eller andre uønskede effekter.. - To oprogramowanie jest niestabilne! Autorzy w żaden sposób nie odpowiadają za nieudane nagrania, źle działające wyłączniki czasowe, stracone godziny czy też jakiekolwiek inne niepożądane efekty. + Oprogramowanie nadal jest w fazie rozwoju i jest niestabilne! Autorzy w żaden sposób nie są odpowiedzialni za błędne nagrania, błędy planowaniu nagrań, zmarnowany czas ani jakiekolwiek inne niepożądane efekty. Este software é instável! Os autores não são de forma alguma responsáveis por gravações falhadas, temporizadores incorrectos, horas desperdiçadas, ou qualquer outro tipo de efeitos indesejáveis.. Este é um software instável! Os autores não são responsáveis por falhas nas gravações, agendamentos incorretos, horas desperdiçadas, ou quaisquer outros efeitos indesejáveis. Acesta nu este o aplicație definitivă! Autorii nu sunt în nici un fel responsabili pentru înregistrări eșuate, cronometre incorecte, ore pierdute, sau orice alte efecte nedorite... Это нестабильная программа! Авторы не несут ответственности за неудачные записи, неверные таймеры, потраченное время и прочие нежелательные эффекты. Tento softvér nie je stabilný! Autori nenesú žiadnu zodpovednosť za chybné nahrávky vysielania, nesprávne časovače alebo iné neželané udalosti spôsobené týmto softvérom.. To je nestabilna programska oprema! Avtorji niso odgovorni za neuspela snemanja, nepravilne časovnike, zapravljen čas in katerikoli drug neželen učinek... + Ky program nuk është ende stabil! Autorët së këtij programi nuk janë në as një menyr përgjegjës për rregistrime të gabuara, timer të pasaktë, kohë të humbur ose efekte të tillë të padëshirueshëm. + Овај софтвер је нестабилан! Аутори ни на који начин нису одговорни за неуспела снимања, неисправна заказана снимања, изгубљене сате или друге нежељене ефекте. Detta är ostabil mjukvara! Upphovsmännen är inte ansvariga för misslyckade inspelningar, inkorrekta timers, bortslösade timmar, eller några andra oönskade effekter.. - 这是不稳定版的软件!作者不对录制失败、错误定时造成时间浪费或其它不良影响负责。 + இந்த நிலையற்ற மென்பொருள்! தோல்வியடைந்தது பதிவுகள், தவறான டைமர்கள், வீணாகி மணி, அல்லது வேறு எந்த விரும்பத்தகாத விளைவுகலுக்கு இதன் ஆசிரியர்கள் பொறுப்பு இல்லை. + Ин нармафзори ноустувор аст! Муаллифон барои вайрониҳои сабт, вақтсанҷҳои нодуруст, соатҳои бефоида ва дигар таъсирҳои номатлуб ҷавобгар намебошанд. + Bu stabil olmayan program! Yapımcılar hatalı kayıtlardan, bozuk sürelerden, harcanan vakitten veya herhangi bir olumsuz etkiden dolayı sorumlu tutulamaz. + Це нестабільна програма! Автори не несуть відповідальності за попсуті записи, неправильні таймери, втрачений час та інші небажані ефекти. + Đây là phần mềm không ổn định! Các tác giả sẽ không chịu trách nhiệm nào với các bản ghi thất bại, bị đặt giờ sai, giờ lãng phí, hoặc các tác dụng không mong muốn khác.. + 这是不稳定版的软件!作者不对录像失败、错误定时造成时间浪费或其它不良影响负责。 + 這是測試版軟體!其原創作者並無法對於以下情況負責,包含:錄影失敗,不正確的定時設定,多餘時數,或任何產生的其它不良影響... @OS@ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/changelog.txt xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/changelog.txt --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/changelog.txt 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/changelog.txt 2014-05-04 06:40:42.000000000 +0000 @@ -1,5 +1,35 @@ -v1.6.166 (13-03-2013) +v1.9.176 (22-04-2014) +- improved timer conflicts detection +- fix threads on OS X +v1.9.175 (17-03-2014) +- Updated language files from Transifex +v1.9.174 (03-03-2014) +- Updated language files from Transifex +v1.9.173 (30-01-2014) +- added service events monitor +v1.9.172 (23-12-2013) +- base new timers on templates retrieved from ARGUS TV server +v1.9.171 (11-12-2013) +- removed redundant notification +v1.9.170 (28-09-2013) +- add timeshift buffer functions +v1.8.170 (23-10-2013) +- Fixes deleting of recordings (regression) +- Improves load time of recordings +v1.8.169 (28-09-2013) +- Fixes playing recordings on Windows +- Migrated all UNC share name handling to single method +v1.8.168 (12-09-2013) +- Minimum ARGUS TV version 2.1 required +- Switched to integer ID's +v1.8.167 (29-08-2013) +- Fixed Live-TV XBMC Gotham +v1.8.166 (08-06-2013) +- sync with PVR API v1.8.0 +v1.7.166 (13-03-2013) - Fixed error when adding timers with " in their title +v1.7.165 (07-03-2013) +- Bump after PVR API version bump v1.6.165 (19-01-2013) - Do not disable the add-on when it can not connect to the ARGUS-TV server. v1.6.164 (18-01-2013) diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Afrikaans/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Afrikaans/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Afrikaans/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Afrikaans/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Afrikaans (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/af/)\n" +"Language-Team: Afrikaans (http://www.transifex.com/projects/p/xbmc-main/language/af/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Albanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Albanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Albanian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Albanian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,41 @@ +# XBMC Media Center language file +# Addon Name: ARGUS TV client +# Addon id: pvr.argustv +# Addon Provider: Fred Hoogduin, Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Albanian (http://www.transifex.com/projects/p/xbmc-main/language/sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "ARGUS TV Hostname" +msgstr "ARGUS TV Hostname" + +msgctxt "#30001" +msgid "ARGUS TV webserver port" +msgstr "ARGUS TV porti i webserver'it" + +msgctxt "#30002" +msgid "Include Radio" +msgstr "Inkludo Radionë" + +msgctxt "#30003" +msgid "Connect timeout (s)" +msgstr "Timeout i lidhjes (s)" + +msgctxt "#30005" +msgid "Password" +msgstr "Fjalkalim" + +msgctxt "#30006" +msgid "Delay after tuning (ms)" +msgstr "Vonesë pas tuning (ms)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Amharic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Amharic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Amharic/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Amharic/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,22 +1,25 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Amharic (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/am/)\n" +"Language-Team: Amharic (http://www.transifex.com/projects/p/xbmc-main/language/am/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: am\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +msgctxt "#30002" +msgid "Include Radio" +msgstr "ሬዲዮ ማካተቻ" + msgctxt "#30005" msgid "Password" msgstr "የመግቢያ ቃል" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Arabic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Arabic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Arabic/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Arabic/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Arabic (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ar/)\n" +"Language-Team: Arabic (http://www.transifex.com/projects/p/xbmc-main/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Basque/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Basque/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Basque/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Basque/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Basque (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/eu/)\n" +"Language-Team: Basque (http://www.transifex.com/projects/p/xbmc-main/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Belarusian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Belarusian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Belarusian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Belarusian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Belarusian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/be/)\n" +"Language-Team: Belarusian (http://www.transifex.com/projects/p/xbmc-main/language/be/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Bosnian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Bosnian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Bosnian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Bosnian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Bosnian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/bs/)\n" +"Language-Team: Bosnian (http://www.transifex.com/projects/p/xbmc-main/language/bs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Bulgarian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Bulgarian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Bulgarian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Bulgarian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,22 +1,45 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Bulgarian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/bg/)\n" +"Language-Team: Bulgarian (http://www.transifex.com/projects/p/xbmc-main/language/bg/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bg\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "ARGUS TV Hostname" +msgstr "ARGUS TV хост" + +msgctxt "#30001" +msgid "ARGUS TV webserver port" +msgstr "Порт на уеб сървъра за ARGUS TV" + +msgctxt "#30002" +msgid "Include Radio" +msgstr "Включи радиото" + +msgctxt "#30003" +msgid "Connect timeout (s)" +msgstr "Таймаут при свързване (с)" + +msgctxt "#30004" +msgid "Windows user account" +msgstr "Windows потребителски профил" + msgctxt "#30005" msgid "Password" msgstr "Парола" + +msgctxt "#30006" +msgid "Delay after tuning (ms)" +msgstr "Забавяне след настройката (мс)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Burmese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Burmese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Burmese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Burmese/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: ARGUS TV client +# Addon id: pvr.argustv +# Addon Provider: Fred Hoogduin, Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Burmese (http://www.transifex.com/projects/p/xbmc-main/language/my/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30002" +msgid "Include Radio" +msgstr "ရေဒီယိုအပါအဝင်" + +msgctxt "#30003" +msgid "Connect timeout (s)" +msgstr "ချိတ်ဆက်မှု့အချိန်ပြည့်သွားပါပြီ။" + +msgctxt "#30005" +msgid "Password" +msgstr "စကားဝှက်" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Catalan/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Catalan/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Catalan/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Catalan/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,22 +1,29 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Catalan (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ca/)\n" +"Language-Team: Catalan (http://www.transifex.com/projects/p/xbmc-main/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "ARGUS TV Hostname" +msgstr "Nom de màquina de l'ARGUS TV" + +msgctxt "#30001" +msgid "ARGUS TV webserver port" +msgstr "Port del servidor web de l'ARGUS TV" + msgctxt "#30002" msgid "Include Radio" msgstr "Inclou ràdio" @@ -32,3 +39,7 @@ msgctxt "#30005" msgid "Password" msgstr "Contrasenya" + +msgctxt "#30006" +msgid "Delay after tuning (ms)" +msgstr "Retard després de sintonitzar un canal (ms)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Chinese (Simple)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Chinese (Simple)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Chinese (Simple)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Chinese (Simple)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Chinese (Simple) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/zh/)\n" +"Language-Team: Chinese (Simple) (http://www.transifex.com/projects/p/xbmc-main/language/zh/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,11 +18,11 @@ msgctxt "#30000" msgid "ARGUS TV Hostname" -msgstr "ARGUS TV主机名" +msgstr "ARGUS TV 主机名" msgctxt "#30001" msgid "ARGUS TV webserver port" -msgstr "ARGUS TV web服务器端口" +msgstr "ARGUS TV web 服务器端口" msgctxt "#30002" msgid "Include Radio" @@ -35,7 +34,7 @@ msgctxt "#30004" msgid "Windows user account" -msgstr "Windows用户帐号" +msgstr "Windows 用户帐号" msgctxt "#30005" msgid "Password" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Chinese (Traditional)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Chinese (Traditional)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Chinese (Traditional)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Chinese (Traditional)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,22 +1,45 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Chinese (Traditional) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/zh_TW/)\n" +"Language-Team: Chinese (Traditional) (http://www.transifex.com/projects/p/xbmc-main/language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0;\n" +msgctxt "#30000" +msgid "ARGUS TV Hostname" +msgstr "ARGUS TV主機名稱" + +msgctxt "#30001" +msgid "ARGUS TV webserver port" +msgstr "ARGUS TV 網絡服務器端口" + +msgctxt "#30002" +msgid "Include Radio" +msgstr "包含收音機" + +msgctxt "#30003" +msgid "Connect timeout (s)" +msgstr "連接超時(秒)" + +msgctxt "#30004" +msgid "Windows user account" +msgstr "視窗使用帳戶" + msgctxt "#30005" msgid "Password" msgstr "密碼" + +msgctxt "#30006" +msgid "Delay after tuning (ms)" +msgstr "在調頻後延遲 (毫秒)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Croatian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Croatian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Croatian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Croatian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,22 +1,45 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Croatian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/hr/)\n" +"Language-Team: Croatian (http://www.transifex.com/projects/p/xbmc-main/language/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +msgctxt "#30000" +msgid "ARGUS TV Hostname" +msgstr "ARGUS TV naziv računala" + +msgctxt "#30001" +msgid "ARGUS TV webserver port" +msgstr "ARGUS TV ulaz web poslužitelja" + +msgctxt "#30002" +msgid "Include Radio" +msgstr "Uključujući radio" + +msgctxt "#30003" +msgid "Connect timeout (s)" +msgstr "Istek vremena (sekunde)" + +msgctxt "#30004" +msgid "Windows user account" +msgstr "Windows korinički račun" + msgctxt "#30005" msgid "Password" -msgstr "Zaporka" +msgstr "Lozinka" + +msgctxt "#30006" +msgid "Delay after tuning (ms)" +msgstr "Odgda nakon pronalaska kanala (ms)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Czech/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Czech/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Czech/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Czech/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Czech (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/cs/)\n" +"Language-Team: Czech (http://www.transifex.com/projects/p/xbmc-main/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Danish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Danish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Danish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Danish/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Danish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/da/)\n" +"Language-Team: Danish (http://www.transifex.com/projects/p/xbmc-main/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Dutch/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Dutch/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Dutch/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Dutch/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Dutch (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/nl/)\n" +"Language-Team: Dutch (http://www.transifex.com/projects/p/xbmc-main/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/English/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/English/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/English/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/English/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: English (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/en/)\n" +"Language-Team: English (http://www.transifex.com/projects/p/xbmc-main/language/en/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/English (Australia)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/English (Australia)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/English (Australia)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/English (Australia)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: ARGUS TV client +# Addon id: pvr.argustv +# Addon Provider: Fred Hoogduin, Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (Australia) (http://www.transifex.com/projects/p/xbmc-main/language/en_AU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30005" +msgid "Password" +msgstr "Password" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/English (New Zealand)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/English (New Zealand)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/English (New Zealand)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/English (New Zealand)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,45 @@ +# XBMC Media Center language file +# Addon Name: ARGUS TV client +# Addon id: pvr.argustv +# Addon Provider: Fred Hoogduin, Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (New Zealand) (http://www.transifex.com/projects/p/xbmc-main/language/en_NZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_NZ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "ARGUS TV Hostname" +msgstr "ARGUS TV Hostname" + +msgctxt "#30001" +msgid "ARGUS TV webserver port" +msgstr "ARGUS TV webserver port" + +msgctxt "#30002" +msgid "Include Radio" +msgstr "Include Radio" + +msgctxt "#30003" +msgid "Connect timeout (s)" +msgstr "Connect timeout (s)" + +msgctxt "#30004" +msgid "Windows user account" +msgstr "Windows user account" + +msgctxt "#30005" +msgid "Password" +msgstr "Password" + +msgctxt "#30006" +msgid "Delay after tuning (ms)" +msgstr "Delay after tuning (ms)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/English (US)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/English (US)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/English (US)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/English (US)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: ARGUS TV client +# Addon id: pvr.argustv +# Addon Provider: Fred Hoogduin, Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (US) (http://www.transifex.com/projects/p/xbmc-main/language/en_US/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_US\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30005" +msgid "Password" +msgstr "Password" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Esperanto/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Esperanto/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Esperanto/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Esperanto/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Esperanto (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/eo/)\n" +"Language-Team: Esperanto (http://www.transifex.com/projects/p/xbmc-main/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Estonian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Estonian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Estonian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Estonian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,22 +1,45 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Estonian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/et/)\n" +"Language-Team: Estonian (http://www.transifex.com/projects/p/xbmc-main/language/et/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: et\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "ARGUS TV Hostname" +msgstr "ARGUS TV hosti nimi" + +msgctxt "#30001" +msgid "ARGUS TV webserver port" +msgstr "ARGUS TV veebiserveri port" + +msgctxt "#30002" +msgid "Include Radio" +msgstr "Hõlma raadio" + +msgctxt "#30003" +msgid "Connect timeout (s)" +msgstr "Ühenduse aegumine (s)" + +msgctxt "#30004" +msgid "Windows user account" +msgstr "Windowsi kasutajakonto" + msgctxt "#30005" msgid "Password" msgstr "Salasõna" + +msgctxt "#30006" +msgid "Delay after tuning (ms)" +msgstr "Viivitus peale häälestust (ms)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Faroese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Faroese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Faroese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Faroese/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: ARGUS TV client +# Addon id: pvr.argustv +# Addon Provider: Fred Hoogduin, Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Faroese (http://www.transifex.com/projects/p/xbmc-main/language/fo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30005" +msgid "Password" +msgstr "Loyniorð" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Finnish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Finnish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Finnish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Finnish/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Finnish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fi/)\n" +"Language-Team: Finnish (http://www.transifex.com/projects/p/xbmc-main/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/French/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/French/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/French/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/French/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: French (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fr/)\n" +"Language-Team: French (http://www.transifex.com/projects/p/xbmc-main/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/French (Canada)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/French (Canada)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/French (Canada)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/French (Canada)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,45 @@ +# XBMC Media Center language file +# Addon Name: ARGUS TV client +# Addon id: pvr.argustv +# Addon Provider: Fred Hoogduin, Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: French (Canada) (http://www.transifex.com/projects/p/xbmc-main/language/fr_CA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_CA\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "ARGUS TV Hostname" +msgstr "Nom d'hôte ARGUS TV" + +msgctxt "#30001" +msgid "ARGUS TV webserver port" +msgstr "Port de serveur Web ARGUS TV" + +msgctxt "#30002" +msgid "Include Radio" +msgstr "Inclure la radio" + +msgctxt "#30003" +msgid "Connect timeout (s)" +msgstr "Délai d'attente de connexion (s)" + +msgctxt "#30004" +msgid "Windows user account" +msgstr "Compte utilisateur Windows" + +msgctxt "#30005" +msgid "Password" +msgstr "Mot de passe" + +msgctxt "#30006" +msgid "Delay after tuning (ms)" +msgstr "Délai après syntonisation (ms)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Galician/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Galician/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Galician/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Galician/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Galician (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/gl/)\n" +"Language-Team: Galician (http://www.transifex.com/projects/p/xbmc-main/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Georgian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Georgian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Georgian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Georgian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: ARGUS TV client +# Addon id: pvr.argustv +# Addon Provider: Fred Hoogduin, Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Georgian (http://www.transifex.com/projects/p/xbmc-main/language/ka/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ka\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30002" +msgid "Include Radio" +msgstr "რადიოს ჩათვლით" + +msgctxt "#30003" +msgid "Connect timeout (s)" +msgstr "შეერთების დაყოვნება(ები)" + +msgctxt "#30005" +msgid "Password" +msgstr "პაროლი" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/German/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/German/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/German/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/German/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: German (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/de/)\n" +"Language-Team: German (http://www.transifex.com/projects/p/xbmc-main/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -23,15 +22,15 @@ msgctxt "#30001" msgid "ARGUS TV webserver port" -msgstr "ARGUS TV Web-Server Port" +msgstr "ARGUS TV Webserver Port" msgctxt "#30002" msgid "Include Radio" -msgstr "Zeige Radiokanäle" +msgstr "Schließe Radiokanäle ein" msgctxt "#30003" msgid "Connect timeout (s)" -msgstr "Verbindungszeitüberlauf (s)" +msgstr "Verbindungs-Timeout (s)" msgctxt "#30004" msgid "Windows user account" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Greek/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Greek/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Greek/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Greek/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Greek (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/el/)\n" +"Language-Team: Greek (http://www.transifex.com/projects/p/xbmc-main/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Haitian (Haitian Creole)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Haitian (Haitian Creole)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Haitian (Haitian Creole)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Haitian (Haitian Creole)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Haitian (Haitian Creole) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ht/)\n" +"Language-Team: Haitian (Haitian Creole) (http://www.transifex.com/projects/p/xbmc-main/language/ht/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Hebrew/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Hebrew/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Hebrew/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Hebrew/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hebrew (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/he/)\n" +"Language-Team: Hebrew (http://www.transifex.com/projects/p/xbmc-main/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Hungarian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Hungarian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Hungarian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Hungarian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hungarian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/hu/)\n" +"Language-Team: Hungarian (http://www.transifex.com/projects/p/xbmc-main/language/hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Icelandic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Icelandic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Icelandic/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Icelandic/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Icelandic (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/is/)\n" +"Language-Team: Icelandic (http://www.transifex.com/projects/p/xbmc-main/language/is/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Indonesian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Indonesian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Indonesian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Indonesian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,22 +1,45 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Indonesian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/id/)\n" +"Language-Team: Indonesian (http://www.transifex.com/projects/p/xbmc-main/language/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: id\n" "Plural-Forms: nplurals=1; plural=0;\n" +msgctxt "#30000" +msgid "ARGUS TV Hostname" +msgstr "Hostname ARGUS TV" + +msgctxt "#30001" +msgid "ARGUS TV webserver port" +msgstr "Port server web ARGUS TV" + +msgctxt "#30002" +msgid "Include Radio" +msgstr "Mencakup Radio" + +msgctxt "#30003" +msgid "Connect timeout (s)" +msgstr "Timeout koneksi (s)" + +msgctxt "#30004" +msgid "Windows user account" +msgstr "Akun pengguna WIndows" + msgctxt "#30005" msgid "Password" msgstr "Password" + +msgctxt "#30006" +msgid "Delay after tuning (ms)" +msgstr "Jeda setelah penyetelan (ms)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Italian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Italian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Italian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Italian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Italian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/it/)\n" +"Language-Team: Italian (http://www.transifex.com/projects/p/xbmc-main/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Japanese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Japanese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Japanese/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Japanese/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Japanese (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ja/)\n" +"Language-Team: Japanese (http://www.transifex.com/projects/p/xbmc-main/language/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Korean/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Korean/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Korean/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Korean/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Korean (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ko/)\n" +"Language-Team: Korean (http://www.transifex.com/projects/p/xbmc-main/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Latvian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Latvian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Latvian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Latvian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: ARGUS TV client +# Addon id: pvr.argustv +# Addon Provider: Fred Hoogduin, Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Latvian (http://www.transifex.com/projects/p/xbmc-main/language/lv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +msgctxt "#30000" +msgid "ARGUS TV Hostname" +msgstr "ARGUS TV saimniekvārds" + +msgctxt "#30002" +msgid "Include Radio" +msgstr "Iekļaut radio" + +msgctxt "#30005" +msgid "Password" +msgstr "Parole" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Lithuanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Lithuanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Lithuanian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Lithuanian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Lithuanian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/lt/)\n" +"Language-Team: Lithuanian (http://www.transifex.com/projects/p/xbmc-main/language/lt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Macedonian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Macedonian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Macedonian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Macedonian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Macedonian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/mk/)\n" +"Language-Team: Macedonian (http://www.transifex.com/projects/p/xbmc-main/language/mk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Malay/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Malay/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Malay/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Malay/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,45 @@ +# XBMC Media Center language file +# Addon Name: ARGUS TV client +# Addon id: pvr.argustv +# Addon Provider: Fred Hoogduin, Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Malay (http://www.transifex.com/projects/p/xbmc-main/language/ms/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "ARGUS TV Hostname" +msgstr "Nama hos ARGUS TV" + +msgctxt "#30001" +msgid "ARGUS TV webserver port" +msgstr "Port pelayan sesawang ARGUS TV" + +msgctxt "#30002" +msgid "Include Radio" +msgstr "Sertakan Radio" + +msgctxt "#30003" +msgid "Connect timeout (s)" +msgstr "Had masa tamat sambung" + +msgctxt "#30004" +msgid "Windows user account" +msgstr "Akaun pengguna Windows" + +msgctxt "#30005" +msgid "Password" +msgstr "Kata Laluan" + +msgctxt "#30006" +msgid "Delay after tuning (ms)" +msgstr "Lengahan selepas penalaan (ms)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Maltese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Maltese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Maltese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Maltese/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: ARGUS TV client +# Addon id: pvr.argustv +# Addon Provider: Fred Hoogduin, Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Maltese (http://www.transifex.com/projects/p/xbmc-main/language/mt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mt\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);\n" + +msgctxt "#30005" +msgid "Password" +msgstr "Sigriet" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Maori/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Maori/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Maori/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Maori/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: ARGUS TV client +# Addon id: pvr.argustv +# Addon Provider: Fred Hoogduin, Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Maori (http://www.transifex.com/projects/p/xbmc-main/language/mi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mi\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30005" +msgid "Password" +msgstr "Kupuhipa" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Norwegian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Norwegian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Norwegian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Norwegian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,45 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Norwegian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/no/)\n" +"Language-Team: Norwegian (http://www.transifex.com/projects/p/xbmc-main/language/no/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: no\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "ARGUS TV Hostname" +msgstr "ARGUS TV vertsnavn" + +msgctxt "#30001" +msgid "ARGUS TV webserver port" +msgstr "ARGUS TV webtjener-port" + msgctxt "#30002" msgid "Include Radio" msgstr "Inkluder radio" +msgctxt "#30003" +msgid "Connect timeout (s)" +msgstr "Tilkobling tidsavbrudd(er)" + +msgctxt "#30004" +msgid "Windows user account" +msgstr "Windows brukerkonto" + msgctxt "#30005" msgid "Password" msgstr "Passord" + +msgctxt "#30006" +msgid "Delay after tuning (ms)" +msgstr "Forsinkelse etter lasting (i millisekunder)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Persian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Persian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Persian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Persian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Persian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fa/)\n" +"Language-Team: Persian (http://www.transifex.com/projects/p/xbmc-main/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Persian (Iran)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Persian (Iran)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Persian (Iran)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Persian (Iran)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: ARGUS TV client +# Addon id: pvr.argustv +# Addon Provider: Fred Hoogduin, Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Persian (Iran) (http://www.transifex.com/projects/p/xbmc-main/language/fa_IR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa_IR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30005" +msgid "Password" +msgstr "رمز عبور" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Polish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Polish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Polish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Polish/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Polish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pl/)\n" +"Language-Team: Polish (http://www.transifex.com/projects/p/xbmc-main/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,11 +18,11 @@ msgctxt "#30000" msgid "ARGUS TV Hostname" -msgstr "Nazwa hosta ARGUS TV" +msgstr "Nazwa hosta" msgctxt "#30001" msgid "ARGUS TV webserver port" -msgstr "Port serwera ARGUS TV" +msgstr "Port serwera" msgctxt "#30002" msgid "Include Radio" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Portuguese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Portuguese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Portuguese/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Portuguese/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Portuguese (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pt/)\n" +"Language-Team: Portuguese (http://www.transifex.com/projects/p/xbmc-main/language/pt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Portuguese (Brazil)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Portuguese (Brazil)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Portuguese (Brazil)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Portuguese (Brazil)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pt_BR/)\n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/xbmc-main/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Romanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Romanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Romanian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Romanian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Romanian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ro/)\n" +"Language-Team: Romanian (http://www.transifex.com/projects/p/xbmc-main/language/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Russian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Russian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Russian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Russian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Russian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ru/)\n" +"Language-Team: Russian (http://www.transifex.com/projects/p/xbmc-main/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -31,7 +30,7 @@ msgctxt "#30003" msgid "Connect timeout (s)" -msgstr "Тайм-ауты подключения" +msgstr "Тайм-ауты подключения (с.)" msgctxt "#30004" msgid "Windows user account" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Serbian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Serbian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Serbian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Serbian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,22 +1,41 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Serbian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sr/)\n" +"Language-Team: Serbian (http://www.transifex.com/projects/p/xbmc-main/language/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +msgctxt "#30000" +msgid "ARGUS TV Hostname" +msgstr "ARGUS TV име домаћина" + +msgctxt "#30001" +msgid "ARGUS TV webserver port" +msgstr "ARGUS TV порт сервера" + +msgctxt "#30002" +msgid "Include Radio" +msgstr "Укључи радио" + +msgctxt "#30003" +msgid "Connect timeout (s)" +msgstr "Истек времена за повезивање (с)" + +msgctxt "#30004" +msgid "Windows user account" +msgstr "Windows кориснички налог" + msgctxt "#30005" msgid "Password" -msgstr "Lozinka" +msgstr "Лозинка" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Serbian (Cyrillic)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Serbian (Cyrillic)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Serbian (Cyrillic)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Serbian (Cyrillic)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Serbian (Cyrillic) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sr_RS/)\n" +"Language-Team: Serbian (Cyrillic) (http://www.transifex.com/projects/p/xbmc-main/language/sr_RS/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Slovak/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Slovak/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Slovak/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Slovak/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Slovak (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sk/)\n" +"Language-Team: Slovak (http://www.transifex.com/projects/p/xbmc-main/language/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Slovenian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Slovenian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Slovenian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Slovenian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Slovenian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sl/)\n" +"Language-Team: Slovenian (http://www.transifex.com/projects/p/xbmc-main/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -31,7 +30,7 @@ msgctxt "#30003" msgid "Connect timeout (s)" -msgstr "Najdaljši čas povezave (s)" +msgstr "Čas preteka povezovanja (s)" msgctxt "#30004" msgid "Windows user account" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Spanish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Spanish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Spanish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Spanish/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es/)\n" +"Language-Team: Spanish (http://www.transifex.com/projects/p/xbmc-main/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Spanish (Argentina)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Spanish (Argentina)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Spanish (Argentina)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Spanish (Argentina)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es_AR/)\n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/xbmc-main/language/es_AR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Spanish (Mexico)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Spanish (Mexico)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Spanish (Mexico)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Spanish (Mexico)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es_MX/)\n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/xbmc-main/language/es_MX/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Swedish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Swedish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Swedish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Swedish/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Swedish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sv/)\n" +"Language-Team: Swedish (http://www.transifex.com/projects/p/xbmc-main/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Tajik/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Tajik/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Tajik/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Tajik/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: ARGUS TV client +# Addon id: pvr.argustv +# Addon Provider: Fred Hoogduin, Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Tajik (http://www.transifex.com/projects/p/xbmc-main/language/tg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30005" +msgid "Password" +msgstr "Парол" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Tamil (India)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Tamil (India)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Tamil (India)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Tamil (India)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,45 @@ +# XBMC Media Center language file +# Addon Name: ARGUS TV client +# Addon id: pvr.argustv +# Addon Provider: Fred Hoogduin, Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Tamil (India) (http://www.transifex.com/projects/p/xbmc-main/language/ta_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "ARGUS TV Hostname" +msgstr "ARGUS தொலைகாட்சி புரவன்பெயர் " + +msgctxt "#30001" +msgid "ARGUS TV webserver port" +msgstr "ARGUS தொலைகாட்சி இணைய வழங்கன் துறை" + +msgctxt "#30002" +msgid "Include Radio" +msgstr "வானொலி உள்ளடக்கு" + +msgctxt "#30003" +msgid "Connect timeout (s)" +msgstr "இணைப்பு காலாவதி (நொடி)" + +msgctxt "#30004" +msgid "Windows user account" +msgstr "சாளரம் பயனர் விவரங்கள்" + +msgctxt "#30005" +msgid "Password" +msgstr "அடையாளச் சொல்" + +msgctxt "#30006" +msgid "Delay after tuning (ms)" +msgstr "இசைவாக்கத்திற்கு பின்னுள்ள தாமதம் (ms)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Telugu/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Telugu/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Telugu/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Telugu/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: ARGUS TV client +# Addon id: pvr.argustv +# Addon Provider: Fred Hoogduin, Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Telugu (http://www.transifex.com/projects/p/xbmc-main/language/te/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: te\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30005" +msgid "Password" +msgstr "సంకేతపదం" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Thai/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Thai/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Thai/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Thai/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Thai (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/th/)\n" +"Language-Team: Thai (http://www.transifex.com/projects/p/xbmc-main/language/th/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Turkish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Turkish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Turkish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Turkish/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,22 +1,45 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Turkish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/tr/)\n" +"Language-Team: Turkish (http://www.transifex.com/projects/p/xbmc-main/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=1; plural=0;\n" +msgctxt "#30000" +msgid "ARGUS TV Hostname" +msgstr "ARGUS TV sunucu adı" + +msgctxt "#30001" +msgid "ARGUS TV webserver port" +msgstr "ARGUS TV web sunucusu portu" + +msgctxt "#30002" +msgid "Include Radio" +msgstr "Radyoları içe aktar" + +msgctxt "#30003" +msgid "Connect timeout (s)" +msgstr "Bağlantı süresi doldu (s)" + +msgctxt "#30004" +msgid "Windows user account" +msgstr "Windows kullanıcı hesabı" + msgctxt "#30005" msgid "Password" msgstr "Parola" + +msgctxt "#30006" +msgid "Delay after tuning (ms)" +msgstr "Gecikme zamanı (ms)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Ukrainian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Ukrainian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Ukrainian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Ukrainian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,22 +1,45 @@ # XBMC Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv -# Addon version: 1.6.163 # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Ukrainian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/uk/)\n" +"Language-Team: Ukrainian (http://www.transifex.com/projects/p/xbmc-main/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +msgctxt "#30000" +msgid "ARGUS TV Hostname" +msgstr "Сервер ARGUS TV" + +msgctxt "#30001" +msgid "ARGUS TV webserver port" +msgstr "Порт веб-сервера ARGUS TV" + +msgctxt "#30002" +msgid "Include Radio" +msgstr "Додати радіо" + +msgctxt "#30003" +msgid "Connect timeout (s)" +msgstr "Затримка зв’язку (с) " + +msgctxt "#30004" +msgid "Windows user account" +msgstr "Рахунок користувача Windows" + msgctxt "#30005" msgid "Password" msgstr "Пароль" + +msgctxt "#30006" +msgid "Delay after tuning (ms)" +msgstr "Затримка після регулювання (мс)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Uzbek/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Uzbek/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Uzbek/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Uzbek/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: ARGUS TV client +# Addon id: pvr.argustv +# Addon Provider: Fred Hoogduin, Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Uzbek (http://www.transifex.com/projects/p/xbmc-main/language/uz/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uz\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30005" +msgid "Password" +msgstr "Maxfiy so'z" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Vietnamese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Vietnamese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Vietnamese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Vietnamese/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,45 @@ +# XBMC Media Center language file +# Addon Name: ARGUS TV client +# Addon id: pvr.argustv +# Addon Provider: Fred Hoogduin, Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Vietnamese (http://www.transifex.com/projects/p/xbmc-main/language/vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "ARGUS TV Hostname" +msgstr "ARGUS TV Hostname" + +msgctxt "#30001" +msgid "ARGUS TV webserver port" +msgstr "ARGUS TV webserver port" + +msgctxt "#30002" +msgid "Include Radio" +msgstr "Bao gồm Đài phát thanh" + +msgctxt "#30003" +msgid "Connect timeout (s)" +msgstr "Thời gian chờ kết nối (s)" + +msgctxt "#30004" +msgid "Windows user account" +msgstr "Tài khoản người dùng Windows" + +msgctxt "#30005" +msgid "Password" +msgstr "Mật khẩu" + +msgctxt "#30006" +msgid "Delay after tuning (ms)" +msgstr "Trì hoãn sau khi điều chỉnh (ms)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Vietnamese (Viet Nam)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Vietnamese (Viet Nam)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Vietnamese (Viet Nam)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Vietnamese (Viet Nam)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: ARGUS TV client +# Addon id: pvr.argustv +# Addon Provider: Fred Hoogduin, Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/projects/p/xbmc-main/language/vi_VN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi_VN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30004" +msgid "Windows user account" +msgstr "Tài khoản người dùng Window" + +msgctxt "#30005" +msgid "Password" +msgstr "Mật khẩu" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Welsh/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Welsh/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/addon/resources/language/Welsh/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/addon/resources/language/Welsh/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,45 @@ +# XBMC Media Center language file +# Addon Name: ARGUS TV client +# Addon id: pvr.argustv +# Addon Provider: Fred Hoogduin, Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Welsh (http://www.transifex.com/projects/p/xbmc-main/language/cy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" + +msgctxt "#30000" +msgid "ARGUS TV Hostname" +msgstr "Enw gwesteiwr ARGUS TV" + +msgctxt "#30001" +msgid "ARGUS TV webserver port" +msgstr "Porth gweinydd gwe ARGUS TV" + +msgctxt "#30002" +msgid "Include Radio" +msgstr "Cynnwys Radio" + +msgctxt "#30003" +msgid "Connect timeout (s)" +msgstr "Amser allan cysylltu (e)" + +msgctxt "#30004" +msgid "Windows user account" +msgstr "Cyfrif defnyddiwr Windows" + +msgctxt "#30005" +msgid "Password" +msgstr "Cyfrinair" + +msgctxt "#30006" +msgid "Delay after tuning (ms)" +msgstr "Oedi ar ôl tiwnio (me)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/Makefile.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/Makefile.am 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/Makefile.am 2014-03-04 10:06:12.000000000 +0000 @@ -10,11 +10,11 @@ LIBNAME = libargustv-addon lib_LTLIBRARIES = libargustv-addon.la -LIBS = @abs_top_builddir@/lib/jsoncpp/libjsoncpp.la +LIBS = @abs_top_srcdir@/lib/jsoncpp/libjsoncpp.la include ../Makefile.include.am -INCLUDES+=-I$(srcdir)/src -I$(srcdir)/src/lib/filesystem -I@abs_top_srcdir@/lib/jsoncpp/include +INCLUDES+=-Isrc -Isrc/lib/filesystem -I@abs_top_srcdir@/lib/jsoncpp/include libargustv_addon_la_SOURCES = src/activerecording.cpp \ src/channel.cpp \ @@ -23,10 +23,10 @@ src/argustvrpc.cpp \ src/guideprogram.cpp \ src/KeepAliveThread.cpp \ + src/EventsThread.cpp \ src/pvrclient-argustv.cpp \ src/recording.cpp \ src/recordinggroup.cpp \ - src/recordingsummary.cpp \ src/tools.cpp \ src/upcomingrecording.cpp \ src/uri.cpp \ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/project/VS2010Express/pvr.argustv.vcxproj xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/project/VS2010Express/pvr.argustv.vcxproj --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/project/VS2010Express/pvr.argustv.vcxproj 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/project/VS2010Express/pvr.argustv.vcxproj 2014-03-04 10:06:12.000000000 +0000 @@ -84,6 +84,7 @@ + @@ -92,7 +93,6 @@ - @@ -104,6 +104,7 @@ + @@ -112,7 +113,6 @@ - diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/project/VS2010Express/pvr.argustv.vcxproj.filters xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/project/VS2010Express/pvr.argustv.vcxproj.filters --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/project/VS2010Express/pvr.argustv.vcxproj.filters 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/project/VS2010Express/pvr.argustv.vcxproj.filters 2014-03-04 10:06:12.000000000 +0000 @@ -45,9 +45,6 @@ Source Files - - Source Files - Source Files @@ -75,6 +72,9 @@ Source Files + + Source Files + @@ -101,9 +101,6 @@ Header Files - - Header Files - Header Files @@ -131,5 +128,8 @@ Header Files + + Header Files + \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/argustvrpc.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/argustvrpc.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/argustvrpc.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/argustvrpc.cpp 2014-05-04 06:40:42.000000000 +0000 @@ -189,44 +189,6 @@ } /* - * \brief Retrieve the TV channels that are in the guide - */ - int RequestGuideChannelList() - { - Json::Value root; - int retval = E_FAILED; - - retval = ArgusTVJSONRPC("ArgusTV/Guide/Channels/Television", "", root); - - if(retval >= 0) - { - if( root.type() == Json::arrayValue) - { - int size = root.size(); - - // parse channel list - for ( int index =0; index < size; ++index ) - { - std::string name = root[index]["Name"].asString(); - XBMC->Log(LOG_DEBUG, "Found channel %i: %s\n", index, name.c_str()); - } - return size; - } - else - { - XBMC->Log(LOG_DEBUG, "Unknown response format. Expected Json::arrayValue\n"); - return -1; - } - } - else - { - XBMC->Log(LOG_DEBUG, "RequestChannelList failed. Return value: %i\n", retval); - } - - return retval; - } - - /* * \brief Get the logo for a channel * \param channelGUID GUID of the channel */ @@ -261,7 +223,6 @@ char command[512]; snprintf(command, 512, "ArgusTV/Scheduler/ChannelLogo/%s/100/100/false/%d-%02d-%02d", channelGUID.c_str(), - //snprintf(command, 512, "ArgusTV/Scheduler/ChannelLogo/%s/100/100/false/2011-01-01", channelGUID.c_str(), modificationtime->tm_year + 1900, modificationtime->tm_mon + 1, modificationtime->tm_mday); long http_response; @@ -297,7 +258,7 @@ } /* - * \brief Get the list with channel groups from 4TR + * \brief Get the list with channel groups from ARGUS * \param channelType The channel type (Television or Radio) */ int RequestChannelGroups(enum ChannelType channelType, Json::Value& response) @@ -335,7 +296,7 @@ } /* - * \brief Get the list with channels for the given channel group from 4TR + * \brief Get the list with channels for the given channel group from ARGUS * \param channelGroupId GUID of the channel group */ int RequestChannelGroupMembers(const std::string& channelGroupId, Json::Value& response) @@ -367,7 +328,7 @@ } /* - * \brief Get the list with TV channel groups from 4TR + * \brief Get the list with TV channel groups from ARGUS */ int RequestTVChannelGroups(Json::Value& response) { @@ -375,7 +336,7 @@ } /* - * \brief Get the list with Radio channel groups from 4TR + * \brief Get the list with Radio channel groups from ARGUS */ int RequestRadioChannelGroups(Json::Value& response) { @@ -383,7 +344,7 @@ } /* - * \brief Get the list with channels from 4TR + * \brief Get the list with channels from ARGUS * \param channelType The channel type (Television or Radio) */ int GetChannelList(enum ChannelType channelType, Json::Value& response) @@ -420,25 +381,6 @@ return retval; } -#if FALSE - /** - * \brief Fetch the Logo for the given channel id - * \param channel_id String containing the 4TR channel_id - * \param filename filename returned here - */ - int GetChannelLogo(const std::string& channel_id, std::string& filename) - { - char command[512]; - - snprintf(command, 512, "ArgusTV/Scheduler/ChannelLogo/%s/100/100/false/2011-01-01", channel_id.c_str()); - - filename = _tempnam(NULL, "atvico"); - int retval = ArgusTVRPCToFile(command, "", filename); - - return retval; - } -#endif - /* * \brief Ping core service. * \param requestedApiVersion The API version the client needs, pass in Constants.ArgusTVRestApiVersion. @@ -763,25 +705,25 @@ return retval; } - int GetRecordingsForTitleUsingPOSTData(const std::string& title, Json::Value& response) + int GetFullRecordingsForTitle(const std::string& title, Json::Value& response) { - XBMC->Log(LOG_DEBUG, "GetRecordingsForTitleUsingPOSTData(\"%s\")", title.c_str()); - std::string command = "ArgusTV/Control/GetRecordingsForProgramTitle/Television?includeNonExisting=false"; - std::string arguments = "\"" + title + "\""; + XBMC->Log(LOG_DEBUG, "GetFullRecordingsForTitle(\"%s\")", title.c_str()); + std::string command = "ArgusTV/Control/GetFullRecordings/Television?includeNonExisting=false"; + Json::Value jsArgument; + jsArgument["ScheduleId"] = Json::nullValue; + jsArgument["ProgramTitle"] = title; + jsArgument["Category"] = Json::nullValue; + jsArgument["ChannelId"] = Json::nullValue; + Json::FastWriter writer; + std::string arguments = writer.write(jsArgument); int retval = ArgusTV::ArgusTVJSONRPC(command, arguments, response); if (retval < 0) { - XBMC->Log(LOG_NOTICE, "GetRecordingsForTitleUsingPOSTData remote call failed."); + XBMC->Log(LOG_NOTICE, "GetFullRecordingsForTitle remote call failed. (%d)", retval); } - return retval; - } - int GetRecordingsForTitle(const std::string& title, Json::Value& response) - { - XBMC->Log(LOG_DEBUG, "GetRecordingsForTitle"); - - return GetRecordingsForTitleUsingPOSTData(title, response); + return retval; } int GetRecordingById(const std::string& id, Json::Value& response) @@ -1119,6 +1061,33 @@ return retval; } + /** + * \brief Retrieve an empty schedule from the server + */ + int GetEmptySchedule(Json::Value& response) + { + int retval = -1; + XBMC->Log(LOG_DEBUG, "GetEmptySchedule"); + + retval = ArgusTVJSONRPC("ArgusTV/Scheduler/EmptySchedule/0/82", "", response); + + if(retval >= 0) + { + if( response.type() != Json::objectValue) + { + XBMC->Log(LOG_DEBUG, "Unknown response format. Expected Json::objectValue\n"); + return -1; + } + } + else + { + XBMC->Log(LOG_DEBUG, "GetEmptySchedule failed. Return value: %i\n", retval); + } + + return retval; + } + + /** * \brief Add a xbmc timer as a one time schedule */ @@ -1130,26 +1099,51 @@ struct tm* convert = localtime(&starttime); struct tm tm_start = *convert; - // Format: ArgusTV/Scheduler/SaveSchedule - // argument: {"ChannelType":0,"IsActive":true,"IsOneTime":true,"KeepUntilMode":0,"KeepUntilValue":null, - // "LastModifiedTime":"\/Date(1297889326000+0100)\/","Name":"Astro TV","PostRecordSeconds":null, - // "PreRecordSeconds":null,"ProcessingCommands":[],"RecordingFileFormatId":null, - // "Rules":[{"Arguments":["Astro TV"],"Type":"TitleEquals"},{"Arguments":["2011-02-17T00:00:00+01:00"],"Type":"OnDate"},{"Arguments":["00:45:00"],"Type":"AroundTime"},{"Arguments":["ed49a4ef-5777-40c4-80b8-715e4c87f1a6"],"Type":"Channels"}], - // "ScheduleId":"00000000-0000-0000-0000-000000000000","SchedulePriority":0,"ScheduleType":82,"Version":0} + // Get empty schedule from the server + Json::Value newSchedule; + if (ArgusTV::GetEmptySchedule(newSchedule) < 0) return retval; - time_t now = time(NULL); - std::string modifiedtime = TimeTToWCFDate(mktime(localtime(&now))); + // Fill relevant members CStdString modifiedtitle = title; modifiedtitle.Replace("\"", "\\\""); - char arguments[1024]; - snprintf( arguments, sizeof(arguments), - "{\"ChannelType\":0,\"IsActive\":true,\"IsOneTime\":true,\"KeepUntilMode\":\"%i\",\"KeepUntilValue\":\"%i\",\"LastModifiedTime\":\"%s\",\"Name\":\"%s\",\"PostRecordSeconds\":%i,\"PreRecordSeconds\":%i,\"ProcessingCommands\":[],\"RecordingFileFormatId\":null,\"Rules\":[{\"Arguments\":[\"%s\"],\"Type\":\"TitleEquals\"},{\"Arguments\":[\"%i-%02i-%02iT00:00:00\"],\"Type\":\"OnDate\"},{\"Arguments\":[\"%02i:%02i:%02i\"],\"Type\":\"AroundTime\"},{\"Arguments\":[\"%s\"],\"Type\":\"Channels\"}],\"ScheduleId\":\"00000000-0000-0000-0000-000000000000\",\"SchedulePriority\":0,\"ScheduleType\":82,\"Version\":0}", - lifetimeToKeepUntilMode(lifetime), lifetimeToKeepUntilValue(lifetime), modifiedtime.c_str(), modifiedtitle.c_str(), postrecordseconds, prerecordseconds, modifiedtitle.c_str(), - tm_start.tm_year + 1900, tm_start.tm_mon + 1, tm_start.tm_mday, - tm_start.tm_hour, tm_start.tm_min, tm_start.tm_sec, - channelid.c_str()); - retval = ArgusTVJSONRPC("ArgusTV/Scheduler/SaveSchedule", arguments, response); + newSchedule["KeepUntilMode"] = Json::Value(lifetimeToKeepUntilMode(lifetime)); + newSchedule["KeepUntilValue"] = Json::Value(lifetimeToKeepUntilValue(lifetime)); + newSchedule["Name"] = Json::Value(modifiedtitle.c_str()); + newSchedule["PostRecordSeconds"] = Json::Value(postrecordseconds); + newSchedule["PreRecordSeconds"] = Json::Value(prerecordseconds); + + Json::Value rule(Json::objectValue); + rule["Arguments"] = Json::arrayValue; + rule["Arguments"].append(Json::Value(modifiedtitle.c_str())); + rule["Type"] = Json::Value("TitleEquals"); + newSchedule["Rules"].append(rule); + + char formatbuffer[256]; + rule = Json::objectValue; + rule["Arguments"] = Json::arrayValue; + snprintf(formatbuffer, sizeof(formatbuffer), "%i-%02i-%02iT00:00:00", tm_start.tm_year + 1900, tm_start.tm_mon + 1, tm_start.tm_mday); + rule["Arguments"].append(Json::Value(formatbuffer)); + rule["Type"] = Json::Value("OnDate"); + newSchedule["Rules"].append(rule); + + rule = Json::objectValue; + rule["Arguments"] = Json::arrayValue; + snprintf(formatbuffer, sizeof(formatbuffer), "%02i:%02i:%02i", tm_start.tm_hour, tm_start.tm_min, tm_start.tm_sec); + rule["Arguments"].append(Json::Value(formatbuffer)); + rule["Type"] = Json::Value("AroundTime"); + newSchedule["Rules"].append(rule); + + rule = Json::objectValue; + rule["Arguments"] = Json::arrayValue; + rule["Arguments"].append(Json::Value(channelid.c_str())); + rule["Type"] = Json::Value("Channels"); + newSchedule["Rules"].append(rule); + + Json::FastWriter writer; + std::string tmparguments = writer.write(newSchedule); + + retval = ArgusTVJSONRPC("ArgusTV/Scheduler/SaveSchedule", tmparguments.c_str(), response); if(retval >= 0) { @@ -1184,26 +1178,44 @@ recordingduration /= 60; int duration_hrs = recordingduration; - // Format: ArgusTV/Scheduler/SaveSchedule - // argument: {"ChannelType":0,"IsActive":true,"IsOneTime":true,"KeepUntilMode":0,"KeepUntilValue":null, - // "LastModifiedTime":"\/Date(1307645182000+0100)\/","Name":"XBMC (manual) - blup","PostRecordSeconds":600, - // "PreRecordSeconds":120,"ProcessingCommands":[],"RecordingFileFormatId":null, - // "Rules":[{"Arguments":["2011-06-11T22:10:00", "01:13:00"],"Type":"ManualSchedule"},{"Arguments":["6a14caaf-5e39-4750-b7b7-eae8c741c094"],"Type":"Channels"}], - // "ScheduleId":"00000000-0000-0000-0000-000000000000","SchedulePriority":0,"ScheduleType":82,"Version":0} + // Get empty schedule from the server + Json::Value newSchedule; + if (ArgusTV::GetEmptySchedule(newSchedule) < 0) return retval; - time_t now = time(NULL); - std::string modifiedtime = TimeTToWCFDate(mktime(localtime(&now))); - char arguments[1024]; - snprintf( arguments, sizeof(arguments), - "{\"ChannelType\":0,\"IsActive\":true,\"IsOneTime\":true,\"KeepUntilMode\":\"%i\",\"KeepUntilValue\":\"%i\",\"LastModifiedTime\":\"%s\",\"Name\":\"%s (manual)\",\"PostRecordSeconds\":%i,\"PreRecordSeconds\":%i,\"ProcessingCommands\":[],\"RecordingFileFormatId\":null," - "\"Rules\":[{\"Arguments\":[\"%i-%02i-%02iT%02i:%02i:%02i\", \"%02i:%02i:%02i\"],\"Type\":\"ManualSchedule\"},{\"Arguments\":[\"%s\"],\"Type\":\"Channels\"}],\"ScheduleId\":\"00000000-0000-0000-0000-000000000000\",\"SchedulePriority\":0,\"ScheduleType\":82,\"Version\":0}", - lifetimeToKeepUntilMode(lifetime), lifetimeToKeepUntilValue(lifetime), modifiedtime.c_str(), title.c_str(), postrecordseconds, prerecordseconds, + // Fill relevant members + CStdString modifiedtitle = title; + modifiedtitle.Replace("\"", "\\\""); + + newSchedule["IsOneTime"] = Json::Value(true); + newSchedule["KeepUntilMode"] = Json::Value(lifetimeToKeepUntilMode(lifetime)); + newSchedule["KeepUntilValue"] = Json::Value(lifetimeToKeepUntilValue(lifetime)); + newSchedule["Name"] = Json::Value(modifiedtitle.c_str()); + newSchedule["PostRecordSeconds"] = Json::Value(postrecordseconds); + newSchedule["PreRecordSeconds"] = Json::Value(prerecordseconds); + + Json::Value rule(Json::objectValue); + char formatbuffer[256]; + rule["Arguments"] = Json::arrayValue; + snprintf(formatbuffer, sizeof(formatbuffer), "%i-%02i-%02iT%02i:%02i:%02i", tm_start.tm_year + 1900, tm_start.tm_mon + 1, tm_start.tm_mday, - tm_start.tm_hour, tm_start.tm_min, tm_start.tm_sec, - duration_hrs, duration_min, duration_sec, - channelid.c_str()); + tm_start.tm_hour, tm_start.tm_min, tm_start.tm_sec); + rule["Arguments"].append(Json::Value(formatbuffer)); + snprintf(formatbuffer, sizeof(formatbuffer), "%02i:%02i:%02i", + duration_hrs, duration_min, duration_sec); + rule["Arguments"].append(Json::Value(formatbuffer)); + rule["Type"] = Json::Value("ManualSchedule"); + newSchedule["Rules"].append(rule); + + rule = Json::objectValue; + rule["Arguments"] = Json::arrayValue; + rule["Arguments"].append(Json::Value(channelid.c_str())); + rule["Type"] = Json::Value("Channels"); + newSchedule["Rules"].append(rule); + + Json::FastWriter writer; + std::string tmparguments = writer.write(newSchedule); - retval = ArgusTVJSONRPC("ArgusTV/Scheduler/SaveSchedule", arguments, response); + retval = ArgusTVJSONRPC("ArgusTV/Scheduler/SaveSchedule", tmparguments, response); if(retval >= 0) { @@ -1280,8 +1292,118 @@ return retval; } + /* + * \brief Subscribe to ARGUS TV service events + */ + int SubscribeServiceEvents(int eventGroups, Json::Value& response) + { + XBMC->Log(LOG_DEBUG, "SubscribeServiceEvents"); + int retval = E_FAILED; + + char command[256]; + snprintf(command, 256, "ArgusTV/Core/SubscribeServiceEvents/%d" , eventGroups); + retval = ArgusTVJSONRPC(command, "", response); + + if(retval >= 0) + { + if (response.type() != Json::stringValue) + { + retval = E_FAILED; + XBMC->Log(LOG_NOTICE, "SubscribeServiceEvents did not return a Json::stringValue [%d].", response.type()); + } + } + else + { + XBMC->Log(LOG_ERROR, "SubscribeServiceEvents remote call failed."); + } + return retval; + } + + /* + * \brief Unsubscribe from ARGUS TV service events + */ + int UnsubscribeServiceEvents(const std::string& monitorId) + { + XBMC->Log(LOG_DEBUG, "UnsubscribeServiceEvents from %s", monitorId.c_str()); + int retval = E_FAILED; + + char command[256]; + snprintf(command, 256, "ArgusTV/Core/UnsubscribeServiceEvents/%s" , monitorId.c_str()); + std::string dummy; + retval = ArgusTVRPC(command, "", dummy); + + if (retval < 0) + { + XBMC->Log(LOG_ERROR, "UnsubscribeServiceEvents remote call failed."); + } + return retval; + } + + /* + * \brief Retrieve the ARGUS TV service events + */ + int GetServiceEvents(const std::string& monitorId, Json::Value& response) + { + XBMC->Log(LOG_DEBUG, "GetServiceEvents"); + int retval = E_FAILED; + + char command[256]; + snprintf(command, 256, "ArgusTV/Core/GetServiceEvents/%s" , monitorId.c_str()); + retval = ArgusTVJSONRPC(command, "", response); + + if(retval >= 0) + { + if (response.type() != Json::objectValue) + { + retval = E_FAILED; + XBMC->Log(LOG_NOTICE, "GetServiceEvents did not return a Json::objectValue [%d].", response.type()); + } + } + else + { + XBMC->Log(LOG_ERROR, "GetServiceEvents remote call failed."); + } + return retval; + } + + + /** + * \brief Get the upcoming recordings for a given schedule + */ + int GetUpcomingRecordingsForSchedule(const std::string& scheduleid, Json::Value& response) + { + int retval = -1; + + XBMC->Log(LOG_DEBUG, "GetUpcomingRecordingsForSchedule"); + + char command[256]; + snprintf(command, 256, "ArgusTV/Control/UpcomingRecordingsForSchedule/%s?includeCancelled=true" , scheduleid.c_str()); + + retval = ArgusTVJSONRPC(command, "", response); + + if (retval < 0) + { + XBMC->Log(LOG_DEBUG, "GetUpcomingRecordingsForSchedule failed. Return value: %i\n", retval); + } + else + { + if( response.type() == Json::arrayValue) + { + int size = response.size(); + return size; + } + else + { + XBMC->Log(LOG_DEBUG, "Unknown response format %d. Expected Json::arrayValue\n", response.type()); + return -1; + } + } + + return retval; + } + /** - * \brief Convert a XBMC Lifetime value to the 4TR keepUntilMode setting + * \brief Convert a XBMC Lifetime value to the ARGUS keepUntilMode setting * \param lifetime the XBMC lifetime value (in days) */ int lifetimeToKeepUntilMode(int lifetime) @@ -1296,7 +1418,7 @@ } /** - * \brief Convert a XBMC Lifetime value to the 4TR keepUntilValue setting + * \brief Convert a XBMC Lifetime value to the ARGUS keepUntilValue setting * \param lifetime the XBMC lifetime value (in days) */ int lifetimeToKeepUntilValue(int lifetime) @@ -1365,56 +1487,6 @@ return wcfdate; } - // transform [\\nascat\qrecordings\NCIS\2012-05-15_20-30_SBS 6_NCIS.ts] - // into [smb://user:password@nascat/qrecordings/NCIS/2012-05-15_20-30_SBS 6_NCIS.ts] - std::string ToCIFS(std::string& UNCName) - { - std::string CIFSname = UNCName; - std::string SMBPrefix = "smb://"; - if (g_szUser.length() > 0) - { - SMBPrefix += g_szUser; - if (g_szPass.length() > 0) - { - SMBPrefix += ":" + g_szPass; - } - } - else - { - SMBPrefix += "Guest"; - } - SMBPrefix += "@"; - size_t found; - while ((found = CIFSname.find("\\")) != std::string::npos) - { - CIFSname.replace(found, 1, "/"); - } - CIFSname.erase(0,2); - CIFSname.insert(0, SMBPrefix); - return CIFSname; - } - - - // transform [smb://user:password@nascat/qrecordings/NCIS/2012-05-15_20-30_SBS 6_NCIS.ts] - // into [\\nascat\qrecordings\NCIS\2012-05-15_20-30_SBS 6_NCIS.ts] - std::string ToUNC(std::string& CIFSName) - { - std::string UNCname = CIFSName; - - UNCname.erase(0,6); - size_t found = UNCname.find("@"); - if (found != std::string::npos) { - UNCname.erase(0, found+1); - } - - while ((found = UNCname.find("/")) != std::string::npos) - { - UNCname.replace(found, 1, "\\"); - } - UNCname.insert(0, "\\\\"); - return UNCname; - } - } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/argustvrpc.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/argustvrpc.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/argustvrpc.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/argustvrpc.h 2014-05-04 06:40:42.000000000 +0000 @@ -21,9 +21,9 @@ #include #include -#define ATV_2_0_1 (52) -#define ATV_REST_MINIMUM_API_VERSION ATV_2_0_1 -#define ATV_REST_MAXIMUM_API_VERSION ATV_2_0_1 +#define ATV_2_2_0 (60) +#define ATV_REST_MINIMUM_API_VERSION ATV_2_2_0 +#define ATV_REST_MAXIMUM_API_VERSION ATV_2_2_0 #define E_SUCCESS 0 #define E_FAILED -1 @@ -83,13 +83,21 @@ NotSupported = 99 }; + enum ServiceEventGroups { + SystemEvents = 0x01, + GuideEvents = 0x02, + ScheduleEvents = 0x04, + RecordingEvents = 0x08, + AllEvents = 0x0F + }; + /** * \brief Do some internal housekeeping at the start */ void Initialize(void); /** - * \brief Send a REST command to 4TR and return the JSON response string + * \brief Send a REST command to ARGUS and return the JSON response string * \param command The command string url (starting from "ArgusTV/") * \param json_response Reference to a std::string used to store the json response string * \return 0 on ok, -1 on a failure @@ -97,7 +105,7 @@ int ArgusTVRPC(const std::string& command, const std::string& arguments, std::string& json_response); /** - * \brief Send a REST command to 4TR and return the JSON response + * \brief Send a REST command to ARGUS and return the JSON response * \param command The command string url (starting from "ArgusTV/") * \param json_response Reference to a Json::Value used to store the parsed Json value * \return 0 on ok, -1 on a failure @@ -105,7 +113,7 @@ int ArgusTVJSONRPC(const std::string& command, const std::string& arguments, Json::Value& json_response); /** - * \brief Send a REST command to 4TR, write the response to a file and return the filename + * \brief Send a REST command to ARGUS, write the response to a file and return the filename * \param command The command string url (starting from "ArgusTV/") * \param newfilename Reference to a std::string used to store the output file name * \param htt_presponse Reference to a long used to store the HTTP response code @@ -182,7 +190,7 @@ /** * \brief Fetch the EPG data for the given guidechannel id - * \param guidechannel_id String containing the 4TR guidechannel_id (not the channel_id) + * \param guidechannel_id String containing the ARGUS guidechannel_id (not the channel_id) * \param epg_start Start from this date * \param epg_stop Until this date */ @@ -195,11 +203,11 @@ int GetRecordingGroupByTitle(Json::Value& response); /** - * \brief Fetch the data for all recordings for a given title + * \brief Fetch the detailed data for all recordings for a given title * \param title Program title of recording * \param response Reference to a std::string used to store the json response string */ - int GetRecordingsForTitle(const std::string& title, Json::Value& response); + int GetFullRecordingsForTitle(const std::string& title, Json::Value& response); /** * \brief Fetch the detailed information of a recorded show @@ -289,6 +297,11 @@ int CancelUpcomingProgram(const std::string& scheduleid, const std::string& channelid, const time_t starttime, const std::string& upcomingprogramid); /** + * \brief Retrieve an empty schedule from the server + */ + int GetEmptySchedule(Json::Value& response); + + /** * \brief Add a xbmc timer as a one time schedule */ int AddOneTimeSchedule(const std::string& channelid, const time_t starttime, const std::string& title, int prerecordseconds, int postrecordseconds, int lifetime, Json::Value& response); @@ -308,18 +321,23 @@ */ int GetUpcomingProgramsForSchedule(const Json::Value& schedule, Json::Value& response); + /** + * \brief Get the upcoming recordings for a given schedule + */ + int GetUpcomingRecordingsForSchedule(const std::string& scheduleid, Json::Value& response); + /* - * \brief Get the list with TV channel groups from 4TR + * \brief Get the list with TV channel groups from ARGUS */ int RequestTVChannelGroups(Json::Value& response); - /* - * \brief Get the list with Radio channel groups from 4TR + /* + * \brief Get the list with Radio channel groups from ARGUS */ int RequestRadioChannelGroups(Json::Value& response); /* - * \brief Get the list with channels for the given channel group from 4TR + * \brief Get the list with channels for the given channel group from ARGUS * \param channelGroupId GUID of the channel group */ int RequestChannelGroupMembers(const std::string& channelGroupId, Json::Value& response); @@ -331,19 +349,32 @@ std::string GetChannelLogo(const std::string& channelGUID); /* - * \brief Convert a XBMC Lifetime value to the 4TR keepUntilMode setting + * \brief Subscribe to ARGUS TV service events + */ + int SubscribeServiceEvents(int eventGroups, Json::Value& response); + + /* + * \brief Unsubscribe from ARGUS TV service events + */ + int UnsubscribeServiceEvents(const std::string& monitorId); + + /* + * \brief Retrieve the ARGUS TV service events + */ + int GetServiceEvents(const std::string& monitorId, Json::Value& response); + + /* + * \brief Convert a XBMC Lifetime value to the ARGUS keepUntilMode setting * \param lifetime the XBMC lifetime value (in days) */ int lifetimeToKeepUntilMode(int lifetime); /* - * \brief Convert a XBMC Lifetime value to the 4TR keepUntilValue setting + * \brief Convert a XBMC Lifetime value to the ARGUS keepUntilValue setting * \param lifetime the XBMC lifetime value (in days) */ int lifetimeToKeepUntilValue(int lifetime); time_t WCFDateToTimeT(const std::string& wcfdate, int& offset); std::string TimeTToWCFDate(const time_t thetime); - std::string ToCIFS(std::string& UNCName); - std::string ToUNC(std::string& CIFSName); } //namespace ArgusTV diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/channel.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/channel.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/channel.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/channel.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -44,18 +44,9 @@ name = data["DisplayName"].asString(); type = (ArgusTV::ChannelType) data["ChannelType"].asInt(); lcn = data["LogicalChannelNumber"].asInt(); - // Useless for XBMC: a unique id as 128 bit GUID string. XBMC accepts only integers here... + id = data["Id"].asInt(); guid = data["ChannelId"].asString(); guidechannelid = data["GuideChannelId"].asString(); - // Not needed... - //["BroadcastStart"] //string - //["BroadcastStop"] //string - //["DefaultPostRecordSeconds"] //int - //["DefaultPreRecordSeconds"] //int - //["Sequence"] //int =0 - //["Version"] //int =0 - //["VisibleInGuide"] //boolean =true - return true; } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/channel.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/channel.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/channel.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/channel.h 2014-01-04 10:28:12.000000000 +0000 @@ -44,6 +44,5 @@ int LCN(void) const { return lcn; } ArgusTV::ChannelType Type(void) const { return type; } int ID(void) const { return id; } - void SetID(int new_id) { id = new_id; } const std::string& GuideChannelID(void) const { return guidechannelid; }; }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/client.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/client.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/client.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/client.cpp 2014-01-04 10:28:19.000000000 +0000 @@ -285,6 +285,11 @@ } +void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ + (void) flag; (void) sender; (void) message; (void) data; +} + /*********************************************************** * PVR Client AddOn specific public library functions ***********************************************************/ @@ -301,6 +306,18 @@ return strMinApiVersion; } +const char* GetGUIAPIVersion(void) +{ + static const char *strGuiApiVersion = XBMC_GUI_API_VERSION; + return strGuiApiVersion; +} + +const char* GetMininumGUIAPIVersion(void) +{ + static const char *strMinGuiApiVersion = XBMC_GUI_MIN_API_VERSION; + return strMinGuiApiVersion; +} + //-- GetAddonCapabilities ----------------------------------------------------- // Tell XBMC our requirements //----------------------------------------------------------------------------- @@ -372,9 +389,10 @@ return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook) +PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_MENUHOOK_DATA &item) { NOTUSED(menuhook); + NOTUSED(item); return PVR_ERROR_NOT_IMPLEMENTED; } @@ -627,7 +645,11 @@ void DemuxAbort(void) {} void DemuxReset(void) {} void DemuxFlush(void) {} +PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY[], int*) { return PVR_ERROR_NOT_IMPLEMENTED; }; unsigned int GetChannelSwitchDelay(void) { return 0; } bool SeekTime(int,bool,double*) { return false; } void SetSpeed(int) {}; +time_t GetPlayingTime() { return 0; } +time_t GetBufferTimeStart() { return 0; } +time_t GetBufferTimeEnd() { return 0; } } //end extern "C" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/client.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/client.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/client.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/client.h 2014-01-04 10:28:12.000000000 +0000 @@ -26,6 +26,7 @@ #include "platform/util/StdString.h" #include "libXBMC_addon.h" #include "libXBMC_pvr.h" +#include "libXBMC_gui.h" #define DEFAULT_HOST "127.0.0.1" #define DEFAULT_PORT 49943 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/epg.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/epg.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/epg.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/epg.h 2014-01-04 10:28:12.000000000 +0000 @@ -23,6 +23,7 @@ #define __EPG_H #include +#include "xbmc_addon_types.h" #include "libXBMC_addon.h" #include "libXBMC_pvr.h" #include diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/EventsThread.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/EventsThread.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/EventsThread.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/EventsThread.cpp 2014-03-04 10:06:12.000000000 +0000 @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2014 Fred Hoogduin + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + + +#include "client.h" //for XBMC->Log +#include "argustvrpc.h" +#include "EventsThread.h" + +using namespace ADDON; + +CEventsThread::CEventsThread(void) +{ + XBMC->Log(LOG_DEBUG, "CEventsThread:: constructor"); +} + + +CEventsThread::~CEventsThread(void) +{ + XBMC->Log(LOG_DEBUG, "CEventsThread:: destructor"); + if (m_subscribed) + { + int retval = ArgusTV::UnsubscribeServiceEvents(m_monitorId); + if (retval < 0) + { + XBMC->Log(LOG_NOTICE, "CEventsThread:: unsubscribe from events failed"); + } + } +} + +void CEventsThread::Connect() +{ + XBMC->Log(LOG_DEBUG, "CEventsThread::Connect"); + // Subscribe to service events + Json::Value response; + int retval = ArgusTV::SubscribeServiceEvents(ArgusTV::AllEvents, response); + if (retval >= 0) + { + m_monitorId = response.asString(); + m_subscribed = true; + XBMC->Log(LOG_DEBUG, "CEventsThread:: monitorId = %s", m_monitorId.c_str()); + } + else + { + m_subscribed = false; + XBMC->Log(LOG_NOTICE, "CEventsThread:: subscribe to events failed"); + } +} + +void *CEventsThread::Process() +{ + XBMC->Log(LOG_DEBUG, "CEventsThread:: thread started"); + while (!IsStopped() && m_subscribed) + { + // Get service events + Json::Value response; + int retval = ArgusTV::GetServiceEvents(m_monitorId, response); + if (retval >= 0) + { + if (response["Expired"].asBool()) + { + // refresh subscription + Connect(); + } + else + { + // Process service events + Json::Value events = response["Events"]; + if (events.size() > 0u) HandleEvents(events); + } + } + // The new PLATFORM:: thread library has a problem with stopping a thread that is doing a long sleep + for (int i = 0; i < 100; i++) + { + if (Sleep(100)) break; + } + } + XBMC->Log(LOG_DEBUG, "CEventsThread:: thread stopped"); + return NULL; +} + +void CEventsThread::HandleEvents(Json::Value events) +{ + XBMC->Log(LOG_DEBUG, "CEventsThread::HandleEvents"); + int size = events.size(); + bool mustUpdateTimers = false; + bool mustUpdateRecordings = false; + // Aggregate events + for (int i = 0; i < size; i++) + { + Json::Value event = events[i]; + std::string eventName = event["Name"].asString(); + XBMC->Log(LOG_DEBUG, "CEventsThread:: ARGUS TV reports event %s", eventName.c_str()); + if (eventName == "UpcomingRecordingsChanged") + { + XBMC->Log(LOG_DEBUG, "Timers changed"); + mustUpdateTimers = true; + } + else if (eventName == "RecordingStarted" || eventName == "RecordingEnded") + { + XBMC->Log(LOG_DEBUG, "Recordings changed"); + mustUpdateRecordings = true; + } + } + // Handle aggregated events + if (mustUpdateTimers) + { + XBMC->Log(LOG_DEBUG, "CEventsThread:: Timers update triggered"); + PVR->TriggerTimerUpdate(); + } + if (mustUpdateRecordings) + { + XBMC->Log(LOG_DEBUG, "CEventsThread:: Recordings update triggered"); + PVR->TriggerRecordingUpdate(); + } +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/EventsThread.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/EventsThread.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/EventsThread.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/EventsThread.h 2014-03-04 10:06:12.000000000 +0000 @@ -0,0 +1,38 @@ +#pragma once +/* + * Copyright (C) 2014 Fred Hoogduin + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#include "platform/threads/threads.h" + +class CEventsThread : public PLATFORM::CThread +{ +public: + CEventsThread(void); + ~CEventsThread(void); + void Connect(void); +private: + virtual void *Process(void); + + void HandleEvents(Json::Value events); + + bool m_subscribed; + std::string m_monitorId; +}; + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/lib/tsreader/MultiFileReader.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/lib/tsreader/MultiFileReader.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/lib/tsreader/MultiFileReader.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/lib/tsreader/MultiFileReader.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -91,6 +91,30 @@ // long MultiFileReader::OpenFile() { + char * bufferfilename; + m_TSBufferFile.GetFileName(&bufferfilename); + + struct __stat64 stat; + if (XBMC->StatFile(bufferfilename, &stat) != 0) + { + XBMC->Log(LOG_ERROR, "MultiFileReader: can not get stat from buffer file %s.", bufferfilename); + return S_FALSE; + } + + int64_t fileLength = stat.st_size; + XBMC->Log(LOG_DEBUG, "MultiFileReader: buffer file %s, stat.st_size %ld.", bufferfilename, fileLength); + + int retryCount = 0; + if (fileLength == 0) do + { + retryCount++; + XBMC->Log(LOG_DEBUG, "MultiFileReader: buffer file has zero length, closing, waiting 500 ms and re-opening. Try %d.", retryCount); + usleep(500000); + XBMC->StatFile(bufferfilename, &stat); + fileLength = stat.st_size; + } while (fileLength == 0 && retryCount < 20); + XBMC->Log(LOG_DEBUG, "MultiFileReader: buffer file %s, after %d retries stat.st_size returns %ld.", bufferfilename, retryCount, fileLength); + long hr = m_TSBufferFile.OpenFile(); if (RefreshTSBufferFile() == S_FALSE) @@ -451,7 +475,7 @@ m_TSBufferFile.GetFileName(&filename); sFilename = filename; - pos = sFilename.find_last_of(PATH_SEPARATOR_CHAR); + pos = sFilename.find_last_of('/'); path = sFilename.substr(0, pos+1); //name3 = filename1.substr(pos+1); @@ -589,65 +613,16 @@ long MultiFileReader::GetFileLength(const char* pFilename, int64_t &length) { -#if defined(TARGET_WINDOWS) - //USES_CONVERSION; - length = 0; - - // Try to open the file - CStdStringW strWFile = UTF8Util::ConvertUTF8ToUTF16(pFilename); - HANDLE hFile = ::CreateFileW(strWFile, // The filename - (DWORD) GENERIC_READ, // File access - (DWORD) (FILE_SHARE_READ | - FILE_SHARE_WRITE), // Share access - NULL, // Security - (DWORD) OPEN_EXISTING, // Open flags - (DWORD) 0, // More flags - NULL); // Template - if (hFile != INVALID_HANDLE_VALUE) - { - LARGE_INTEGER li; - li.QuadPart = 0; - li.LowPart = ::SetFilePointer(hFile, 0, &li.HighPart, FILE_END); - ::CloseHandle(hFile); - - length = li.QuadPart; - } - else + struct __stat64 stat; + if (XBMC->StatFile(pFilename, &stat) != 0) { - //wchar_t msg[MAX_PATH]; - DWORD dwErr = GetLastError(); - //swprintf((LPWSTR)&msg, L"Failed to open file %s : 0x%x\n", pFilename, dwErr); - //::OutputDebugString(W2T((LPWSTR)&msg)); - XBMC->Log(LOG_ERROR, "Failed to open file %s : 0x%x\n", pFilename, dwErr); - XBMC->QueueNotification(QUEUE_ERROR, "Failed to open file %s", pFilename); - return HRESULT_FROM_WIN32(dwErr); + XBMC->Log(LOG_ERROR, "MultiFileReader::GetFileLength: can not get stat from file %s.", pFilename); + return S_FALSE; } - return S_OK; -#elif defined(TARGET_LINUX) || defined(TARGET_DARWIN) || defined(TARGET_FREEBSD) - //USES_CONVERSION; - length = 0; - - // Try to open the file - void* hFile; - if (((hFile = XBMC->OpenFile(pFilename, 0)) != NULL)) - { - length = XBMC->GetFileLength(hFile); - XBMC->CloseFile(hFile); - } - else - { - XBMC->Log(LOG_ERROR, "Failed to open file %s : 0x%x(%s)\n", pFilename, errno, strerror(errno)); - XBMC->QueueNotification(QUEUE_ERROR, "Failed to open file %s", pFilename); - return S_FALSE; - } - XBMC->Log(LOG_DEBUG, "GetFileLength(%s) == %lli.\n", pFilename, length); + length = stat.st_size; return S_OK; -#else -#error FIXME: Add MultiFileReader::GetFileLenght implementation for your OS. - return S_FALSE; -#endif } int64_t MultiFileReader::GetFileSize() diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/pvrclient-argustv.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/pvrclient-argustv.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/pvrclient-argustv.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/pvrclient-argustv.cpp 2014-05-04 06:40:42.000000000 +0000 @@ -1,4 +1,6 @@ /* + * Copyright (C) 2014 Fred Hoogduin + * based on original work * Copyright (C) 2010 Marcel Groothuis * * This program is free software: you can redistribute it and/or modify @@ -22,7 +24,6 @@ #include "activerecording.h" #include "upcomingrecording.h" #include "recordinggroup.h" -#include "recordingsummary.h" #include "recording.h" #include "epg.h" #include "utils.h" @@ -36,11 +37,11 @@ using namespace std; using namespace ADDON; -#if !defined(TARGET_WINDOWS) using namespace PLATFORM; -#endif #define SIGNALQUALITY_INTERVAL 10 +#define MAXLIFETIME 99 //Based on VDR addon and VDR documentation. 99=Keep forever, 0=can be deleted at any time, 1..98=days to keep + /************************************************************/ /** Class interface */ @@ -53,9 +54,12 @@ m_BackendUTCoffset = 0; m_BackendTime = 0; m_tsreader = NULL; - m_channel_id_offset = 0; m_epg_id_offset = 0; m_iCurrentChannel = -1; + m_keepalive = new CKeepAliveThread(); + m_eventmonitor = new CEventsThread(); + m_TVChannels.clear(); + m_RadioChannels.clear(); // due to lack of static constructors, we initialize manually ArgusTV::Initialize(); #if defined(ATV_DUMPTS) @@ -72,6 +76,11 @@ { CloseLiveStream(); } + delete m_keepalive; + delete m_eventmonitor; + // Free allocated memory for Channels + FreeChannels(m_TVChannels); + FreeChannels(m_RadioChannels); } @@ -118,7 +127,6 @@ usleep(1000000); if (attemps > 3) { - XBMC->QueueNotification(QUEUE_ERROR, "No connection to Argus TV server"); return false; } } @@ -131,6 +139,15 @@ // XBMC->QueueNotification(QUEUE_ERROR, "Share errors: see xbmc.log"); // } + // Start service events monitor + m_eventmonitor->Connect(); + if (!m_eventmonitor->IsRunning()) + { + if(!m_eventmonitor->CreateThread()) + { + XBMC->Log(LOG_ERROR, "Start service monitor thread failed."); + } + } m_bConnected = true; return true; } @@ -141,6 +158,15 @@ XBMC->Log(LOG_INFO, "Disconnect"); + // Stop service events monitor + if (m_eventmonitor->IsRunning()) + { + if (!m_eventmonitor->StopThread()) + { + XBMC->Log(LOG_ERROR, "Stop service monitor thread failed."); + } + } + if (m_bTimeShiftStarted) { //TODO: tell ArgusTV that it should stop streaming @@ -182,64 +208,8 @@ bool isAccessibleByATV = accesibleshare["ShareAccessible"].asBool(); bool isAccessibleByAddon = false; std::string accessMsg = ""; -#if defined(TARGET_WINDOWS) - // Try to open the directory - CStdStringW strWFile = UTF8Util::ConvertUTF8ToUTF16(sharename.c_str()); - HANDLE hFile = ::CreateFileW(strWFile, // The filename - (DWORD) GENERIC_READ, // File access - (DWORD) FILE_SHARE_READ, // Share access - NULL, // Security - (DWORD) OPEN_EXISTING, // Open flags - (DWORD) FILE_FLAG_BACKUP_SEMANTICS, // More flags - NULL); // Template - if (hFile != INVALID_HANDLE_VALUE) - { - (void) CloseHandle(hFile); - isAccessibleByAddon = true; - } - else - { - LPVOID lpMsgBuf; - DWORD dwErr = GetLastError(); - FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - dwErr, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &lpMsgBuf, - 0, NULL ); - accessMsg = (char*) lpMsgBuf; - LocalFree(lpMsgBuf); - } -#elif defined(TARGET_LINUX) || defined(TARGET_DARWIN) || defined(TARGET_FREEBSD) - std::string CIFSname = sharename; - std::string SMBPrefix = "smb://"; - if (g_szUser.length() > 0) - { - SMBPrefix += g_szUser; - if (g_szPass.length() > 0) - { - SMBPrefix += ":" + g_szPass; - } - } - else - { - SMBPrefix += "Guest"; - } - SMBPrefix += "@"; - size_t found; - while ((found = CIFSname.find("\\")) != std::string::npos) - { - CIFSname.replace(found, 1, "/"); - } - CIFSname.erase(0,2); - CIFSname.insert(0, SMBPrefix); + std::string CIFSname = ToCIFS(sharename); isAccessibleByAddon = XBMC->CanOpenDirectory(CIFSname.c_str()); -#else -#error implement for your OS! -#endif // write analysis results to the log if (isAccessibleByATV) { @@ -342,6 +312,7 @@ XBMC->Log(LOG_DEBUG, "->RequestEPGForChannel(%i)", channel.iUniqueId); cChannel* atvchannel = FetchChannel(channel.iUniqueId); + XBMC->Log(LOG_DEBUG, "ARGUS TV channel %p)", atvchannel); struct tm* convert = localtime(&iStart); struct tm tm_start = *convert; @@ -353,6 +324,7 @@ Json::Value response; int retval; + XBMC->Log(LOG_DEBUG, "Getting EPG Data for ARGUS TV channel %s)", atvchannel->GuideChannelID().c_str()); retval = ArgusTV::GetEPGData(atvchannel->GuideChannelID(), tm_start, tm_end, response); if (retval != E_FAILED) @@ -406,25 +378,12 @@ else { XBMC->Log(LOG_ERROR, "Channel (%i) did not return a channel class.", channel.iUniqueId); - XBMC->QueueNotification(QUEUE_ERROR, "GUID to XBMC Channel"); + XBMC->QueueNotification(QUEUE_ERROR, "Can't map XBMC Channel to ARGUS"); } return PVR_ERROR_NO_ERROR; } -bool cPVRClientArgusTV::FetchGuideProgramDetails(std::string Id, cGuideProgram& guideprogram) -{ - bool fRc = false; - Json::Value guideprogramresponse; - - int retval = ArgusTV::GetProgramById(Id, guideprogramresponse); - if (retval >= 0) - { - fRc = guideprogram.Parse(guideprogramresponse); - } - return fRc; -} - /************************************************************/ /** Channel handling */ @@ -475,53 +434,51 @@ } if(retval >= 0) - { + { + if (bRadio) + { + FreeChannels(m_RadioChannels); + m_RadioChannels.clear(); + } + else + { + FreeChannels(m_TVChannels); + m_TVChannels.clear(); + } int size = response.size(); // parse channel list for ( int index = 0; index < size; ++index ) { - cChannel channel; - if( channel.Parse(response[index]) ) + cChannel* channel = new cChannel; + if( channel->Parse(response[index]) ) { PVR_CHANNEL tag; memset(&tag, 0 , sizeof(tag)); - //Hack: assumes that the order of the channel list is fixed. - // We can't use the ARGUS TV channel id's. They are GUID strings (128 bit int). - // But only if it isn't cached yet! - if (FetchChannel(channel.Guid(), false) == NULL) - { - tag.iUniqueId = m_channel_id_offset + 1; - m_channel_id_offset++; - } - else - { - tag.iUniqueId = FetchChannel(channel.Guid())->ID(); - } - strncpy(tag.strChannelName, channel.Name(), sizeof(tag.strChannelName)); - std::string logopath = ArgusTV::GetChannelLogo(channel.Guid()).c_str(); + tag.iUniqueId = channel->ID(); + strncpy(tag.strChannelName, channel->Name(), sizeof(tag.strChannelName)); + std::string logopath = ArgusTV::GetChannelLogo(channel->Guid()).c_str(); strncpy(tag.strIconPath, logopath.c_str(), sizeof(tag.strIconPath)); tag.iEncryptionSystem = (unsigned int) -1; //How to fetch this from ARGUS TV?? - tag.bIsRadio = (channel.Type() == ArgusTV::Radio ? true : false); + tag.bIsRadio = (channel->Type() == ArgusTV::Radio ? true : false); tag.bIsHidden = false; //Use OpenLiveStream to read from the timeshift .ts file or an rtsp stream memset(tag.strStreamURL, 0, sizeof(tag.strStreamURL)); strncpy(tag.strInputFormat, "video/x-mpegts", sizeof(tag.strInputFormat)); - tag.iChannelNumber = channel.LCN(); + tag.iChannelNumber = channel->LCN(); if (!tag.bIsRadio) { - XBMC->Log(LOG_DEBUG, "Found TV channel: %s, Unique id: %d, Backend channel: %d\n", channel.Name(), tag.iUniqueId, tag.iChannelNumber); + m_TVChannels.push_back(channel); + XBMC->Log(LOG_DEBUG, "Found TV channel: %s, Unique id: %d, ARGUS LCN: %d, ARGUS Id: %d, ARGUS GUID: %s\n", + channel->Name(), tag.iUniqueId, tag.iChannelNumber, channel->ID(), channel->Guid().c_str()); } else { - XBMC->Log(LOG_DEBUG, "Found Radio channel: %s, Unique id: %d, Backend channel: %d\n", channel.Name(), tag.iUniqueId, tag.iChannelNumber); - } - channel.SetID(tag.iUniqueId); - if (FetchChannel(channel.Guid(), false) == NULL) - { - m_Channels.push_back(channel); //Local cache... + m_RadioChannels.push_back(channel); + XBMC->Log(LOG_DEBUG, "Found Radio channel: %s, Unique id: %d, ARGUS LCN: %d, ARGUS Id: %d, ARGUS GUID: %s\n", + channel->Name(), tag.iUniqueId, tag.iChannelNumber, channel->ID(), channel->Guid().c_str()); } PVR->TransferChannelEntry(handle, &tag); } @@ -573,13 +530,14 @@ { std::string name = response[index]["GroupName"].asString(); std::string guid = response[index]["ChannelGroupId"].asString(); + int id = response[index]["Id"].asInt(); if (!bRadio) { - XBMC->Log(LOG_DEBUG, "Found TV channel group %s: %s\n", guid.c_str(), name.c_str()); + XBMC->Log(LOG_DEBUG, "Found TV channel group %s, ARGUS Id: %d, ARGUS GUID: %s\n", name.c_str(), id, guid.c_str()); } else { - XBMC->Log(LOG_DEBUG, "Found Radio channel group %s: %s\n", guid.c_str(), name.c_str()); + XBMC->Log(LOG_DEBUG, "Found Radio channel group %s, ARGUS Id: %d, ARGUS GUID: %s\n", name.c_str(), id, guid.c_str()); } PVR_CHANNEL_GROUP tag; memset(&tag, 0 , sizeof(PVR_CHANNEL_GROUP)); @@ -644,24 +602,18 @@ { std::string channelId = response[index]["ChannelId"].asString(); std::string channelName = response[index]["DisplayName"].asString(); - cChannel* pChannel = FetchChannel(channelId); - if (pChannel == NULL) - { - XBMC->Log(LOG_ERROR, "Unable to translate channel \"%s\" (\"%s\") to XBMC channel number, channel group member skipped.", - channelId.c_str(), channelName.c_str()); - XBMC->QueueNotification(QUEUE_ERROR, "GUID to XBMC Channel"); - continue; - } + int id = response[index]["Id"].asInt(); + int lcn = response[index]["LogicalChannelNumber"].asInt(); PVR_CHANNEL_GROUP_MEMBER tag; memset(&tag,0 , sizeof(PVR_CHANNEL_GROUP_MEMBER)); strncpy(tag.strGroupName, group.strGroupName, sizeof(tag.strGroupName)); - tag.iChannelUniqueId = pChannel->ID(); - tag.iChannelNumber = pChannel->LCN(); + tag.iChannelUniqueId = id; + tag.iChannelNumber = lcn; - XBMC->Log(LOG_DEBUG, "%s - add channel %s (%d) to group '%s' channel number %d", - __FUNCTION__, pChannel->Name(), tag.iChannelUniqueId, tag.strGroupName, tag.iChannelNumber); + XBMC->Log(LOG_DEBUG, "%s - add channel %s (%d) to group '%s' ARGUS LCN: %d, ARGUS Id: %d", + __FUNCTION__, channelName.c_str(), tag.iChannelUniqueId, tag.strGroupName, tag.iChannelNumber, id); PVR->TransferChannelGroupMember(handle, &tag); } @@ -703,6 +655,7 @@ int iNumRecordings = 0; XBMC->Log(LOG_DEBUG, "RequestRecordingsList()"); + int64_t t = GetTimeMs(); retval = ArgusTV::GetRecordingGroupByTitle(recordinggroupresponse); if(retval >= 0) { @@ -714,17 +667,16 @@ if (recordinggroup.Parse(recordinggroupresponse[recordinggroupindex])) { Json::Value recordingsbytitleresponse; - retval = ArgusTV::GetRecordingsForTitle(recordinggroup.ProgramTitle(), recordingsbytitleresponse); + retval = ArgusTV::GetFullRecordingsForTitle(recordinggroup.ProgramTitle(), recordingsbytitleresponse); if (retval >= 0) { - // process list of recording summaries for this group + // process list of recording details for this group int nrOfRecordings = recordingsbytitleresponse.size(); for (int recordingindex = 0; recordingindex < nrOfRecordings; recordingindex++) { cRecording recording; - cRecordingSummary recordingsummary; - if (recordingsummary.Parse(recordingsbytitleresponse[recordingindex]) && FetchRecordingDetails(recordingsummary.RecordingId(), recording)) + if (recording.Parse(recordingsbytitleresponse[recordingindex])) { PVR_RECORDING tag; memset(&tag, 0 , sizeof(tag)); @@ -732,7 +684,7 @@ strncpy(tag.strRecordingId, recording.RecordingId(), sizeof(tag.strRecordingId)); strncpy(tag.strChannelName, recording.ChannelDisplayName(), sizeof(tag.strChannelName)); tag.iLifetime = MAXLIFETIME; //TODO: recording.Lifetime(); - tag.iPriority = 0; //TODO? recording.Priority(); + tag.iPriority = recording.SchedulePriority(); tag.recordingTime = recording.RecordingStartTime(); tag.iDuration = recording.RecordingStopTime() - recording.RecordingStartTime(); strncpy(tag.strPlot, recording.Description(), sizeof(tag.strPlot)); @@ -749,11 +701,7 @@ } strncpy(tag.strTitle, recording.Title(), sizeof(tag.strTitle)); strncpy(tag.strPlotOutline, recording.SubTitle(), sizeof(tag.strPlotOutline)); -#ifdef TARGET_WINDOWS strncpy(tag.strStreamURL, recording.RecordingFileName(), sizeof(tag.strStreamURL)); -#else - strncpy(tag.strStreamURL, recording.CIFSRecordingFileName(), sizeof(tag.strStreamURL)); -#endif PVR->TransferRecordingEntry(handle, &tag); iNumRecordings++; } @@ -762,47 +710,30 @@ } } } + t = GetTimeMs() - t; + XBMC->Log(LOG_INFO, "Retrieving %d recordings took %d milliseconds.", iNumRecordings, t); return PVR_ERROR_NO_ERROR; } -bool cPVRClientArgusTV::FetchRecordingDetails(std::string recordingid, cRecording& recording) -{ - bool fRc = false; - Json::Value recordingresponse; - - cRecordingSummary recordingsummary; - int retval = ArgusTV::GetRecordingById(recordingid, recordingresponse); - if (retval >= 0) - { - if (recordingresponse.type() == Json::objectValue) - { - fRc = recording.Parse(recordingresponse); - } - } - return fRc; -} - PVR_ERROR cPVRClientArgusTV::DeleteRecording(const PVR_RECORDING &recinfo) { PVR_ERROR rc = PVR_ERROR_FAILED; XBMC->Log(LOG_DEBUG, "->DeleteRecording(%s)", recinfo.strRecordingId); + std::string UNCname = ToUNC(recinfo.strStreamURL); - cRecording recording; - if (FetchRecordingDetails(recinfo.strRecordingId, recording)) + XBMC->Log(LOG_DEBUG, "->DeleteRecording(%s == \"%s\")", recinfo.strRecordingId, UNCname.c_str()); + // JSONify the stream_url + Json::Value recordingname (UNCname); + Json::FastWriter writer; + std::string jsonval = writer.write(recordingname); + if (ArgusTV::DeleteRecording(jsonval) >= 0) { - XBMC->Log(LOG_DEBUG, "->DeleteRecording(%s == \"%s\")", recinfo.strRecordingId, recording.RecordingFileName()); - // JSONify the stream_url - Json::Value recordingname (recording.RecordingFileName()); - Json::StyledWriter writer; - std::string jsonval = writer.write(recordingname); - if (ArgusTV::DeleteRecording(jsonval) >= 0) - { - // Trigger XBMC to update it's list - PVR->TriggerRecordingUpdate(); - rc = PVR_ERROR_NO_ERROR; - } + // Trigger XBMC to update it's list + PVR->TriggerRecordingUpdate(); + rc = PVR_ERROR_NO_ERROR; } + return rc; } @@ -816,10 +747,7 @@ { XBMC->Log(LOG_DEBUG, "->SetRecordingLastPlayedPosition(index=%s [%s], %d)", recinfo.strRecordingId, recinfo.strStreamURL, lastplayedposition); - std::string recordingfilename = recinfo.strStreamURL; -#if !defined(TARGET_WINDOWS) - recordingfilename = ArgusTV::ToUNC(recordingfilename); -#endif + std::string recordingfilename = ToUNC(recinfo.strStreamURL); // JSONify the stream_url Json::Value recordingname (recordingfilename); @@ -839,10 +767,7 @@ { XBMC->Log(LOG_DEBUG, "->GetRecordingLastPlayedPosition(index=%s [%s])", recinfo.strRecordingId, recinfo.strStreamURL); - std::string recordingfilename = recinfo.strStreamURL; -#if !defined(TARGET_WINDOWS) - recordingfilename = ArgusTV::ToUNC(recordingfilename); -#endif + std::string recordingfilename = ToUNC(recinfo.strStreamURL); // JSONify the stream_url Json::Value response; @@ -866,10 +791,7 @@ { XBMC->Log(LOG_DEBUG, "->SetRecordingPlayCount(index=%s [%s], %d)", recinfo.strRecordingId, recinfo.strStreamURL, playcount); - std::string recordingfilename = recinfo.strStreamURL; -#if !defined(TARGET_WINDOWS) - recordingfilename = ArgusTV::ToUNC(recordingfilename); -#endif + std::string recordingfilename = ToUNC(recinfo.strStreamURL); // JSONify the stream_url Json::Value recordingname (recordingfilename); @@ -938,16 +860,8 @@ cUpcomingRecording upcomingrecording; if (upcomingrecording.Parse(upcomingRecordingsResponse[i])) { - tag.iClientIndex = iNumberOfTimers; - cChannel* pChannel = FetchChannel(upcomingrecording.ChannelId()); - if (pChannel == NULL) - { - XBMC->Log(LOG_ERROR, "Unable to translate channel \"%s\" (\"%s\") to XBMC channel number, timer skipped.", - upcomingrecording.ChannelId().c_str(), upcomingrecording.ChannelDisplayname().c_str()); - XBMC->QueueNotification(QUEUE_ERROR, "GUID to XBMC Channel"); - continue; - } - tag.iClientChannelUid = pChannel->ID(); + tag.iClientIndex = upcomingrecording.ID(); + tag.iClientChannelUid = upcomingrecording.ChannelID(); tag.startTime = upcomingrecording.StartTime(); tag.endTime = upcomingrecording.StopTime(); @@ -1008,6 +922,8 @@ tag.iGenreSubType = 0; PVR->TransferTimerEntry(handle, &tag); + XBMC->Log(LOG_DEBUG, "Found timer: %s, Unique id: %d, ARGUS ProgramId: %d, ARGUS ChannelId: %d\n", + tag.strTitle, tag.iClientIndex, upcomingrecording.ID(), upcomingrecording.ChannelID()); iNumberOfTimers++; } } @@ -1017,7 +933,7 @@ PVR_ERROR cPVRClientArgusTV::AddTimer(const PVR_TIMER &timerinfo) { - XBMC->Log(LOG_DEBUG, "AddTimer(start @ %d, end @ %d)", timerinfo.startTime, timerinfo.endTime); + XBMC->Log(LOG_DEBUG, "AddTimer(title %s, start @ %d, end @ %d)", timerinfo.strTitle, timerinfo.startTime, timerinfo.endTime); // re-synthesize the ARGUS TV channel GUID cChannel* pChannel = FetchChannel(timerinfo.iClientChannelUid); @@ -1025,14 +941,41 @@ { XBMC->Log(LOG_ERROR, "Unable to translate XBMC channel %d to ARGUS TV channel GUID, timer not added.", timerinfo.iClientChannelUid); - XBMC->QueueNotification(QUEUE_ERROR, "XBMC Channel to GUID"); + XBMC->QueueNotification(QUEUE_ERROR, "Can't map XBMC Channel to ARGUS"); return PVR_ERROR_SERVER_ERROR; } + XBMC->Log(LOG_DEBUG, "%s: XBMC channel %d translated to ARGUS channel %s.", __FUNCTION__, + timerinfo.iClientChannelUid, pChannel->Guid().c_str()); + + // Try to get original EPG data from ARGUS + struct tm* convert = localtime(&timerinfo.startTime); + struct tm tm_start = *convert; + convert = localtime(&timerinfo.endTime); + struct tm tm_end = *convert; + + Json::Value epgResponse; + XBMC->Log(LOG_DEBUG, "%s: Getting EPG Data for ARGUS TV channel %s", __FUNCTION__, pChannel->GuideChannelID().c_str()); + int retval = ArgusTV::GetEPGData(pChannel->GuideChannelID(), tm_start, tm_end, epgResponse); + + std::string programTitle = timerinfo.strTitle; + if (retval >= 0) + { + XBMC->Log(LOG_DEBUG, "%s: Getting EPG Data for ARGUS TV channel %s returned %d entries.", __FUNCTION__, pChannel->GuideChannelID().c_str(), epgResponse.size()); + if (epgResponse.size() > 0) + { + programTitle = epgResponse[0u]["Title"].asString(); + } + } + else + { + XBMC->Log(LOG_DEBUG, "%s: Getting EPG Data for ARGUS TV channel %s failed.", __FUNCTION__, pChannel->GuideChannelID().c_str()); + } + Json::Value addScheduleResponse; time_t starttime = timerinfo.startTime; if (starttime == 0) starttime = time(NULL); - int retval = ArgusTV::AddOneTimeSchedule(pChannel->Guid(), starttime, timerinfo.strTitle, timerinfo.iMarginStart * 60, timerinfo.iMarginEnd * 60, timerinfo.iLifetime, addScheduleResponse); + retval = ArgusTV::AddOneTimeSchedule(pChannel->Guid(), starttime, programTitle, timerinfo.iMarginStart * 60, timerinfo.iMarginEnd * 60, timerinfo.iLifetime, addScheduleResponse); if (retval < 0) { return PVR_ERROR_SERVER_ERROR; @@ -1040,6 +983,10 @@ std::string scheduleid = addScheduleResponse["ScheduleId"].asString(); + XBMC->Log(LOG_DEBUG, "%s: ARGUS one-time schedule added with id %s.", __FUNCTION__, + scheduleid.c_str()); + + // Ok, we created a schedule, but did that lead to an upcoming recording? Json::Value upcomingProgramsResponse; retval = ArgusTV::GetUpcomingProgramsForSchedule(addScheduleResponse, upcomingProgramsResponse); @@ -1074,18 +1021,6 @@ XBMC->Log(LOG_DEBUG, "DeleteTimer()"); - // re-synthesize the ARGUS TV startime, stoptime and channel GUID - time_t starttime = timerinfo.startTime; - time_t stoptime = timerinfo.endTime; - cChannel* pChannel = FetchChannel(timerinfo.iClientChannelUid); - if (pChannel == NULL) - { - XBMC->Log(LOG_ERROR, "Unable to translate XBMC channel %d to ARGUS TV channel GUID, timer not deleted.", - timerinfo.iClientChannelUid); - XBMC->QueueNotification(QUEUE_ERROR, "XBMC Channel to GUID"); - return PVR_ERROR_SERVER_ERROR; - } - // retrieve the currently active recordings int retval = ArgusTV::GetActiveRecordings(activeRecordingsResponse); if (retval < 0) @@ -1109,64 +1044,58 @@ cUpcomingRecording upcomingrecording; if (upcomingrecording.Parse(upcomingProgramsResponse[i])) { - if (upcomingrecording.ChannelId() == pChannel->Guid()) + if (upcomingrecording.ID() == (int) timerinfo.iClientIndex) { - if (upcomingrecording.StartTime() == starttime) + // Okay, we matched the timer to an upcoming program, but is it recording right now? + if (activeRecordingsResponse.size() > 0) { - if (upcomingrecording.StopTime() == stoptime) + // Is the this upcoming program in the list of active recordings? + for (Json::Value::UInt j = 0; j < activeRecordingsResponse.size(); j++) { - // Okay, we matched the timer to an upcoming program, but is it recording right now? - if (activeRecordingsResponse.size() > 0) + cActiveRecording activerecording; + if (activerecording.Parse(activeRecordingsResponse[j])) { - // Is the this upcoming program in the list of active recordings? - for (Json::Value::UInt j = 0; j < activeRecordingsResponse.size(); j++) + if (upcomingrecording.UpcomingProgramId() == activerecording.UpcomingProgramId()) { - cActiveRecording activerecording; - if (activerecording.Parse(activeRecordingsResponse[j])) + // Abort this recording + retval = ArgusTV::AbortActiveRecording(activeRecordingsResponse[j]); + if (retval != 0) { - if (upcomingrecording.UpcomingProgramId() == activerecording.UpcomingProgramId()) - { - // Abort this recording - retval = ArgusTV::AbortActiveRecording(activeRecordingsResponse[j]); - if (retval != 0) - { - XBMC->Log(LOG_ERROR, "Unable to cancel the active recording of \"%s\" on the server. Will try to cancel the program.", upcomingrecording.Title().c_str()); - } - break; - } + XBMC->Log(LOG_ERROR, "Unable to cancel the active recording of \"%s\" on the server. Will try to cancel the program.", upcomingrecording.Title().c_str()); } + break; } } + } + } - Json::Value scheduleResponse; - retval = ArgusTV::GetScheduleById(upcomingrecording.ScheduleId(), scheduleResponse); - std::string schedulename = scheduleResponse["Name"].asString(); + Json::Value scheduleResponse; + retval = ArgusTV::GetScheduleById(upcomingrecording.ScheduleId(), scheduleResponse); + std::string schedulename = scheduleResponse["Name"].asString(); - if (scheduleResponse["IsOneTime"].asBool() == true) - { - retval = ArgusTV::DeleteSchedule(upcomingrecording.ScheduleId()); - if (retval < 0) - { - XBMC->Log(LOG_NOTICE, "Unable to delete schedule %s from server.", schedulename.c_str()); - return PVR_ERROR_SERVER_ERROR; - } - } - else - { - retval = ArgusTV::CancelUpcomingProgram(upcomingrecording.ScheduleId(), upcomingrecording.ChannelId(), - upcomingrecording.StartTime(), upcomingrecording.GuideProgramId()); - if (retval < 0) - { - XBMC->Log(LOG_ERROR, "Unable to cancel upcoming program from server."); - return PVR_ERROR_SERVER_ERROR; - } - } - - // Trigger an update of the PVR timers - PVR->TriggerTimerUpdate(); - return PVR_ERROR_NO_ERROR; + if (scheduleResponse["IsOneTime"].asBool() == true) + { + retval = ArgusTV::DeleteSchedule(upcomingrecording.ScheduleId()); + if (retval < 0) + { + XBMC->Log(LOG_NOTICE, "Unable to delete schedule %s from server.", schedulename.c_str()); + return PVR_ERROR_SERVER_ERROR; + } + } + else + { + retval = ArgusTV::CancelUpcomingProgram(upcomingrecording.ScheduleId(), upcomingrecording.ChannelId(), + upcomingrecording.StartTime(), upcomingrecording.GuideProgramId()); + if (retval < 0) + { + XBMC->Log(LOG_ERROR, "Unable to cancel upcoming program from server."); + return PVR_ERROR_SERVER_ERROR; } } + + // Trigger an update of the PVR timers + PVR->TriggerTimerUpdate(); + return PVR_ERROR_NO_ERROR; } } } @@ -1182,38 +1111,41 @@ /************************************************************/ /** Live stream handling */ -cChannel* cPVRClientArgusTV::FetchChannel(int channel_uid, bool LogError) +cChannel* cPVRClientArgusTV::FetchChannel(int channelid, bool LogError) +{ + cChannel* rc = FetchChannel(m_TVChannels, channelid, false); + if (rc == NULL) rc = FetchChannel(m_RadioChannels, channelid, false); + + if (LogError && rc == NULL) XBMC->Log(LOG_ERROR, "XBMC channel with id %d not found in the channel caches!.", channelid); + return rc; +} + +cChannel* cPVRClientArgusTV::FetchChannel(std::vector m_Channels, int channelid, bool LogError) { // Search for this channel in our local channel list to find the original ChannelID back: - vector::iterator it; + vector::iterator it; for ( it=m_Channels.begin(); it < m_Channels.end(); it++ ) { - if (it->ID() == channel_uid) + if ((*it)->ID() == channelid) { - return &*it; + return *it; } } - if (LogError) XBMC->Log(LOG_ERROR, "XBMC channel with id %d not found in the channel cache!.", channel_uid); + if (LogError) XBMC->Log(LOG_ERROR, "XBMC channel with id %d not found in the channel cache!.", channelid); return NULL; } -cChannel* cPVRClientArgusTV::FetchChannel(std::string channelid, bool LogError) +void cPVRClientArgusTV::FreeChannels(std::vector m_Channels) { // Search for this channel in our local channel list to find the original ChannelID back: - vector::iterator it; + vector::iterator it; for ( it=m_Channels.begin(); it < m_Channels.end(); it++ ) { - if (it->Guid() == channelid) - { - return &*it; - } + SAFE_DELETE(*it); } - - if (LogError) XBMC->Log(LOG_ERROR, "ARGUS TV channel with GUID \"%s\" not found in the channel cache!.", channelid.c_str()); - return NULL; } bool cPVRClientArgusTV::_OpenLiveStream(const PVR_CHANNEL &channelinfo) @@ -1261,32 +1193,7 @@ } } -#if defined(TARGET_LINUX) || defined(TARGET_DARWIN) - // TODO FHo: merge this code and the code that translates names from recordings - std::string CIFSname = filename; - std::string SMBPrefix = "smb://"; - if (g_szUser.length() > 0) - { - SMBPrefix += g_szUser; - if (g_szPass.length() > 0) - { - SMBPrefix += ":" + g_szPass; - } - } - else - { - SMBPrefix += "Guest"; - } - SMBPrefix += "@"; - size_t found; - while ((found = CIFSname.find("\\")) != std::string::npos) - { - CIFSname.replace(found, 1, "/"); - } - CIFSname.erase(0,2); - CIFSname.insert(0, SMBPrefix.c_str()); - filename = CIFSname; -#endif + filename = ToCIFS(filename); if (retval != E_SUCCESS || filename.length() == 0) { @@ -1301,9 +1208,9 @@ XBMC->Log(LOG_INFO, "Live stream file: %s", filename.c_str()); m_bTimeShiftStarted = true; m_iCurrentChannel = channelinfo.iUniqueId; - if (!m_keepalive.IsRunning()) + if (!m_keepalive->IsRunning()) { - if (!m_keepalive.CreateThread()) + if (!m_keepalive->CreateThread()) { XBMC->Log(LOG_ERROR, "Start keepalive thread failed."); } @@ -1337,7 +1244,7 @@ XBMC->Log(LOG_DEBUG, "Open TsReader"); m_tsreader->Open(filename.c_str()); m_tsreader->OnZap(); - XBMC->Log(LOG_DEBUG, "Delaying %ld milliseconds.", (1000 * g_iTuneDelay)); + XBMC->Log(LOG_DEBUG, "Delaying %ld milliseconds.", (g_iTuneDelay)); usleep(1000 * g_iTuneDelay); return true; } @@ -1353,7 +1260,11 @@ bool cPVRClientArgusTV::OpenLiveStream(const PVR_CHANNEL &channelinfo) { - return _OpenLiveStream(channelinfo); + int64_t t = GetTimeMs(); + bool rc = _OpenLiveStream(channelinfo); + t = GetTimeMs() - t; + XBMC->Log(LOG_INFO, "Opening live stream took %d milliseconds.", t); + return rc; } int cPVRClientArgusTV::ReadLiveStream(unsigned char* pBuffer, unsigned int iBufferSize) @@ -1441,9 +1352,9 @@ string result; XBMC->Log(LOG_INFO, "CloseLiveStream"); - if (m_keepalive.IsRunning()) + if (m_keepalive->IsRunning()) { - if (!m_keepalive.StopThread()) + if (!m_keepalive->StopThread()) { XBMC->Log(LOG_ERROR, "Stop keepalive thread failed."); } @@ -1489,7 +1400,7 @@ { // Close existing live stream before opening a new one. // This is slower, but it helps XBMC playback when the streams change types (e.g. SD->HD). - // It also gives a better tuner allocation when using multiple clients with a limited count of tuners. + // It also gives a better tuner allocation when using multiple clients with a limited count of tuners. CloseLiveStream(); } fRc = OpenLiveStream(channelinfo); @@ -1558,19 +1469,8 @@ /** Record stream handling */ bool cPVRClientArgusTV::OpenRecordedStream(const PVR_RECORDING &recinfo) { - XBMC->Log(LOG_DEBUG, "->OpenRecordedStream(index=%s)", recinfo.strRecordingId); - cRecording recording; - if (!FetchRecordingDetails(recinfo.strRecordingId, recording)) - { - XBMC->Log(LOG_ERROR, "Unable to fetch recording details for %s", recinfo.strRecordingId); - return false; - } - -#if TARGET_WINDOWS - const char* recordingName = recording.RecordingFileName(); -#else - const char* recordingName = recording.CIFSRecordingFileName(); -#endif + XBMC->Log(LOG_DEBUG, "->OpenRecordedStream(%s)", recinfo.strStreamURL); + std::string UNCname = ToUNC(recinfo.strStreamURL); if (m_tsreader != NULL) { @@ -1579,7 +1479,7 @@ SAFE_DELETE(m_tsreader); } m_tsreader = new CTsReader(); - if (m_tsreader->Open(recordingName) != S_OK) + if (m_tsreader->Open(UNCname.c_str()) != S_OK) { SAFE_DELETE(m_tsreader); return false; @@ -1673,7 +1573,7 @@ bool cPVRClientArgusTV::CanPauseAndSeek() { - if (m_tsreader) - return true; - return false; + bool rc = (m_tsreader != NULL); + XBMC->Log(LOG_DEBUG, "<-CanPauseAndSeek returns %s", rc ? "true" : "false"); + return rc; } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/pvrclient-argustv.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/pvrclient-argustv.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/pvrclient-argustv.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/pvrclient-argustv.h 2014-05-04 06:40:42.000000000 +0000 @@ -29,6 +29,7 @@ #include "guideprogram.h" #include "KeepAliveThread.h" +#include "EventsThread.h" class CTsReader; @@ -106,11 +107,10 @@ const char* GetLiveStreamURL(const PVR_CHANNEL &channel); private: - cChannel* FetchChannel(int channel_uid, bool LogError = true); - cChannel* FetchChannel(std::string channelid, bool LogError = true); + cChannel* FetchChannel(int channelid, bool LogError = true); + cChannel* FetchChannel(std::vector m_Channels, int channelid, bool LogError = true); + void FreeChannels(std::vector m_Channels); void Close(); - bool FetchRecordingDetails(std::string recordingid, cRecording& recording); - bool FetchGuideProgramDetails(std::string Id, cGuideProgram& guideprogram); bool _OpenLiveStream(const PVR_CHANNEL &channel); int m_iCurrentChannel; @@ -123,12 +123,13 @@ time_t m_BackendUTCoffset; time_t m_BackendTime; - std::vector m_Channels; // Local channel cache list needed for id to guid conversion - int m_channel_id_offset; + std::vector m_TVChannels; // Local TV channel cache list needed for id to guid conversion + std::vector m_RadioChannels; // Local Radio channel cache list needed for id to guid conversion int m_epg_id_offset; int m_signalqualityInterval; CTsReader* m_tsreader; - CKeepAliveThread m_keepalive; + CKeepAliveThread* m_keepalive; + CEventsThread* m_eventmonitor; #if defined(ATV_DUMPTS) char ofn[25]; int ofd; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/recording.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/recording.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/recording.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/recording.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -39,7 +39,7 @@ episodenumbertotal = 0; episodepart = 0; episodeparttotal = 0; - ischanged = false; + isfullywatched = false; ispartofseries = false; ispartialrecording = false; ispremiere = false; @@ -62,12 +62,8 @@ schedulepriority = ArgusTV::Normal; seriesnumber = 0; starrating = 0.0; - starttime = 0; - stoptime = 0; subtitle = ""; - thumbnailfilename = ""; title = ""; - videoaspect = ArgusTV::Unknown; } cRecording::~cRecording(void) @@ -78,6 +74,7 @@ { int offset; std::string t; + id = data["Id"].asInt(); actors = data["Actors"].asString(); category = data["Category"].asString(); channeldisplayname = data["ChannelDisplayName"].asString(); @@ -90,7 +87,7 @@ episodenumbertotal = data["EpisodeNumberTotal"].asInt(); episodepart = data["EpisodePart"].asInt(); episodeparttotal = data["EpisodePartTotal"].asInt(); - ischanged = data["IsChanged"].asBool(); + isfullywatched = data["IsFullyWatched"].asBool(); ispartofseries = data["IsPartOfSeries"].asBool(); ispartialrecording = data["IsPartialRecording"].asBool(); ispremiere = data["IsPremiere"].asBool(); @@ -107,7 +104,8 @@ programstoptime = ArgusTV::WCFDateToTimeT(t, offset); rating = data["Rating"].asString(); recordingfileformatid = data["RecordingFileFormatId"].asString(); - recordingfilename = data["RecordingFileName"].asString(); + t = data["RecordingFileName"].asString(); + recordingfilename = ToCIFS(t); recordingid = data["RecordingId"].asString(); t = data["RecordingStartTime"].asString(); recordingstarttime = ArgusTV::WCFDateToTimeT(t, offset); @@ -118,37 +116,8 @@ schedulepriority = (ArgusTV::SchedulePriority) data["SchedulePriority"].asInt(); seriesnumber = data["SeriesNumber"].asInt(); starrating = data["StarRating"].asDouble(); - t = data["StartTime"].asString(); - starttime = ArgusTV::WCFDateToTimeT(t, offset); - t = data["StopTime"].asString(); - stoptime = ArgusTV::WCFDateToTimeT(t, offset); subtitle = data["SubTitle"].asString(); - thumbnailfilename = data["ThumbnailFileName"].asString(); title = data["Title"].asString(); - videoaspect = (ArgusTV::VideoAspectRatio) data["VideoAspect"].asInt(); - std::string CIFSname = recordingfilename; - std::string SMBPrefix = "smb://"; - if (g_szUser.length() > 0) - { - SMBPrefix += g_szUser; - if (g_szPass.length() > 0) - { - SMBPrefix += ":" + g_szPass; - } - } - else - { - SMBPrefix += "Guest"; - } - SMBPrefix += "@"; - size_t found; - while ((found = CIFSname.find("\\")) != std::string::npos) - { - CIFSname.replace(found, 1, "/"); - } - CIFSname.erase(0,2); - CIFSname.insert(0, SMBPrefix); - cifsrecordingfilename = CIFSname; return true; } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/recording.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/recording.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/recording.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/recording.h 2014-01-04 10:28:12.000000000 +0000 @@ -27,6 +27,7 @@ class cRecording { private: + int id; std::string actors; std::string category; std::string channeldisplayname; @@ -39,7 +40,7 @@ int episodenumbertotal; int episodepart; int episodeparttotal; - bool ischanged; + bool isfullywatched; bool ispartofseries; bool ispartialrecording; bool ispremiere; @@ -54,7 +55,6 @@ std::string rating; std::string recordingfileformatid; std::string recordingfilename; - std::string cifsrecordingfilename; std::string recordingid; time_t recordingstarttime; time_t recordingstoptime; @@ -63,12 +63,8 @@ ArgusTV::SchedulePriority schedulepriority; int seriesnumber; double starrating; - time_t starttime; - time_t stoptime; std::string subtitle; - std::string thumbnailfilename; std::string title; - ArgusTV::VideoAspectRatio videoaspect; public: cRecording(void); virtual ~cRecording(void); @@ -76,7 +72,7 @@ bool Parse(const Json::Value& data); void Transform(bool isgroupmember); - + int Id(void) const { return id; } const char *Actors(void) const { return actors.c_str(); } const char *Category(void) const { return category.c_str(); } const char *ChannelDisplayName(void) const { return channeldisplayname.c_str(); } @@ -89,7 +85,7 @@ int EpisodeNumberTotal(void) const { return episodenumbertotal; } int EpisodePart(void) const { return episodepart; } int EpisodePartTotal(void) const { return episodeparttotal; } - bool IsChanged(void) const { return ischanged; } + bool IsFullyWatched(void) const { return isfullywatched; } bool IsPartOfSeries(void) const { return ispartofseries; } bool IsPartialRecording(void) const { return ispartialrecording; } bool IsPremiere(void) const { return ispremiere; } @@ -104,7 +100,6 @@ const char *Rating(void) const { return rating.c_str(); } const char *RecordingFileFormatId(void) const { return recordingfileformatid.c_str(); } const char *RecordingFileName(void) const { return recordingfilename.c_str(); } - const char *CIFSRecordingFileName(void) const { return cifsrecordingfilename.c_str(); } const char *RecordingId(void) const { return recordingid.c_str(); } time_t RecordingStartTime(void) const { return recordingstarttime; } time_t RecordingStopTime(void) const { return recordingstoptime; } @@ -113,10 +108,6 @@ ArgusTV::SchedulePriority SchedulePriority(void) const { return schedulepriority; } int SeriesNumber(void) const { return seriesnumber; } double StarRating(void) const { return starrating; } - time_t StartTime(void) const { return starttime; } - time_t StopTime(void) const { return stoptime; } const char *SubTitle(void) const { return subtitle.c_str(); } - const char *ThumbnailFileName(void) const { return thumbnailfilename.c_str(); } const char *Title(void) const { return title.c_str(); } - ArgusTV::VideoAspectRatio VideoAspect(void) const { return videoaspect; } }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/recordingsummary.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/recordingsummary.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/recordingsummary.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/recordingsummary.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2011 Fred Hoogduin - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html - * - */ - -#include -#include "utils.h" -#include -#include -#include "recordingsummary.h" - -cRecordingSummary::cRecordingSummary(void) -{ - category = ""; - channeldisplayname = ""; - channelid = ""; - channeltype = ArgusTV::Television; - episodenumber = 0; - episodenumberdisplay = ""; - episodenumbertotal = 0; - episodepart = 0; - episodeparttotal = 0; - ispartofseries = false; - ispartialrecording = false; - ispremiere = false; - isrepeat = false; - keepuntilmode = ArgusTV::UntilSpaceIsNeeded; - keepuntilvalue = 0; - lastwatchedposition = 0; - lastwatchedtime = 0; - programstarttime = 0; - programstoptime = 0; - rating = ""; - recordingfileformatid = ""; - recordingfilename = ""; - recordingid = ""; - recordingstarttime = 0; - recordingstoptime = 0; - scheduleid = ""; - schedulename = ""; - schedulepriority = ArgusTV::Normal; - seriesnumber = 0; - starrating = 0.0; - starttime = 0; - stoptime = 0; - subtitle = ""; - title = ""; - videoaspect = ArgusTV::Unknown; -} - -cRecordingSummary::~cRecordingSummary(void) -{ -} - -bool cRecordingSummary::Parse(const Json::Value& data) -{ - int offset; - std::string t; - category = data["Category"].asString(); - channeldisplayname = data["ChannelDisplayName"].asString(); - channelid = data["ChannelId"].asString(); - channeltype = (ArgusTV::ChannelType) data["ChannelType"].asInt(); - episodenumber = data["EpisodeNumber"].asInt(); - episodenumberdisplay = data["EpisodeNumberDisplay"].asString(); - episodenumbertotal = data["EpisodeNumberTotal"].asInt(); - episodepart = data["EpisodePart"].asInt(); - episodeparttotal = data["EpisodePartTotal"].asInt(); - ispartofseries = data["IsPartOfSeries"].asBool(); - ispartialrecording = data["IsPartialRecording"].asBool(); - ispremiere = data["IsPremiere"].asBool(); - isrepeat = data["IsRepeat"].asBool(); - keepuntilmode = (ArgusTV::KeepUntilMode) data["KeepUntilMode"].asInt(); - keepuntilvalue = data["KeepUntilValue"].asInt(); - lastwatchedposition = data["LastWatchedPosition"].asInt(); - t = data["LastWatchedTime"].asString(); - lastwatchedtime = ArgusTV::WCFDateToTimeT(t, offset); - lastwatchedtime += ((offset/100)*3600); - t = data["ProgramStartTime"].asString(); - programstarttime = ArgusTV::WCFDateToTimeT(t, offset); - programstarttime += ((offset/100)*3600); - t = data["ProgramStopTime"].asString(); - programstoptime = ArgusTV::WCFDateToTimeT(t, offset); - programstoptime += ((offset/100)*3600); - rating = data["Rating"].asString(); - recordingfileformatid = data["RecordingFileFormatId"].asString(); - recordingfilename = data["RecordingFileName"].asString(); - recordingid = data["RecordingId"].asString(); - t = data["RecordingStartTime"].asString(); - recordingstarttime = ArgusTV::WCFDateToTimeT(t, offset); - recordingstarttime += ((offset/100)*3600); - t = data["RecordingStopTime"].asString(); - recordingstoptime = ArgusTV::WCFDateToTimeT(t, offset); - recordingstoptime += ((offset/100)*3600); - scheduleid = data["ScheduleId"].asString(); - schedulename = data["ScheduleName"].asString(); - schedulepriority = (ArgusTV::SchedulePriority) data["SchedulePriority"].asInt(); - seriesnumber = data["SeriesNumber"].asInt(); - starrating = data["StarRating"].asDouble(); - t = data["StartTime"].asString(); - starttime = ArgusTV::WCFDateToTimeT(t, offset); - starttime += ((offset/100)*3600); - t = data["StopTime"].asString(); - stoptime = ArgusTV::WCFDateToTimeT(t, offset); - stoptime += ((offset/100)*3600); - subtitle = data["SubTitle"].asString(); - title = data["Title"].asString(); - videoaspect = (ArgusTV::VideoAspectRatio) data["VideoAspect"].asInt(); - - return true; -} \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/recordingsummary.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/recordingsummary.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/recordingsummary.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/recordingsummary.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,109 +0,0 @@ -#pragma once -/* - * Copyright (C) 2011 Fred Hoogduin - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html - * - */ - -#include "libXBMC_pvr.h" -#include -#include -#include "argustvrpc.h" - -#define MAXLIFETIME 99 //Based on VDR addon and VDR documentation. 99=Keep forever, 0=can be deleted at any time, 1..98=days to keep - -class cRecordingSummary -{ -private: - std::string category; - std::string channeldisplayname; - std::string channelid; - ArgusTV::ChannelType channeltype; - int episodenumber; - std::string episodenumberdisplay; - int episodenumbertotal; - int episodepart; - int episodeparttotal; - bool ispartofseries; - bool ispartialrecording; - bool ispremiere; - bool isrepeat; - ArgusTV::KeepUntilMode keepuntilmode; - int keepuntilvalue; - int lastwatchedposition; - time_t lastwatchedtime; - time_t programstarttime; - time_t programstoptime; - std::string rating; - std::string recordingfileformatid; - std::string recordingfilename; - std::string recordingid; - time_t recordingstarttime; - time_t recordingstoptime; - std::string scheduleid; - std::string schedulename; - ArgusTV::SchedulePriority schedulepriority; - int seriesnumber; - double starrating; - time_t starttime; - time_t stoptime; - std::string subtitle; - std::string title; - ArgusTV::VideoAspectRatio videoaspect; - -public: - cRecordingSummary(void); - virtual ~cRecordingSummary(void); - - bool Parse(const Json::Value& data); - - const char *Category(void) const { return category.c_str(); } - const char *ChannelDisplayName(void) const { return channeldisplayname.c_str(); } - const char *ChannelId(void) const { return channelid.c_str(); } - ArgusTV::ChannelType ChannelType(void) const { return channeltype; }; - int EpisodeNumber(void) const { return episodenumber; } - const char *EpisodeNumberDisplay(void) const { return episodenumberdisplay.c_str(); } - int EpisodeNumberTotal(void) const { return episodenumbertotal; } - int EpisodePart(void) const { return episodepart; } - int EpisodePartTotal(void) const { return episodeparttotal; } - bool IsPartOfSeries(void) const { return ispartofseries; } - bool IsPartialRecording(void) const { return ispartialrecording; } - bool IsPremiere(void) const { return ispremiere; } - bool IsRepeat(void) const { return isrepeat; } - ArgusTV::KeepUntilMode KeepUntilMode(void) const { return keepuntilmode; } - int KeepUntilValue(void) const { return keepuntilvalue; } - int LastWatchedPosition(void) const { return lastwatchedposition; } - time_t LastWatchedTime(void) const { return lastwatchedtime; } - time_t ProgramStartTime(void) const { return programstarttime; } - time_t ProgramStopTime(void) const { return programstoptime; } - const char *Rating(void) const { return rating.c_str(); } - const char *RecordingFileFormatId(void) const { return recordingfileformatid.c_str(); } - const char *RecordingFileName(void) const { return recordingfilename.c_str(); } - const std::string& RecordingId(void) const { return recordingid; } - time_t RecordingStartTime(void) const { return recordingstarttime; } - time_t RecordingStopTime(void) const { return recordingstoptime; } - const char *ScheduleId(void) const { return scheduleid.c_str(); } - const char *ScheduleName(void) const { return schedulename.c_str(); } - ArgusTV::SchedulePriority SchedulePriority(void) const { return schedulepriority; } - int SeriesNumber(void) const { return seriesnumber; } - double StarRating(void) const { return starrating; } - time_t StartTime(void) const { return starttime; } - time_t StopTime(void) const { return stoptime; } - const char *SubTitle(void) const { return subtitle.c_str(); } - const char *Title(void) const { return title.c_str(); } - ArgusTV::VideoAspectRatio VideoAspect(void) const { return videoaspect; } -}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/upcomingrecording.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/upcomingrecording.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/upcomingrecording.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/upcomingrecording.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -36,6 +36,8 @@ iscancelled = false; isallocated = true; isinconflict = true; + id = 0; + ichannelid = 0; } cUpcomingRecording::~cUpcomingRecording(void) @@ -50,6 +52,7 @@ programobject = data["Program"]; date = 0; + id = programobject["Id"].asInt(); t = programobject["StartTime"].asString(); starttime = ArgusTV::WCFDateToTimeT(t, offset); t = programobject["StopTime"].asString(); @@ -66,6 +69,7 @@ channelobject = programobject["Channel"]; channelid = channelobject["ChannelId"].asString(); channeldisplayname = channelobject["DisplayName"].asString(); + ichannelid = channelobject["Id"].asInt(); if (data["CardChannelAllocation"].empty()) isallocated = false; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/upcomingrecording.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/upcomingrecording.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/upcomingrecording.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/upcomingrecording.h 2014-01-04 10:28:12.000000000 +0000 @@ -40,6 +40,9 @@ std::string scheduleid; bool isallocated; bool isinconflict; + int id; + int ichannelid; + public: cUpcomingRecording(void); @@ -47,7 +50,9 @@ bool Parse(const Json::Value& data); + int ID(void) const { return id; } const std::string& ChannelId(void) const { return channelid; } + int ChannelID(void) const { return ichannelid; } const std::string& ChannelDisplayname(void) const { return channeldisplayname; } time_t StartTime(void) const { return starttime; } time_t StopTime(void) const { return stoptime; } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/utils.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/utils.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/utils.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/utils.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -85,6 +85,44 @@ } //namespace Json +// transform [\\nascat\qrecordings\NCIS\2012-05-15_20-30_SBS 6_NCIS.ts] +// into [smb://user:password@nascat/qrecordings/NCIS/2012-05-15_20-30_SBS 6_NCIS.ts] +std::string ToCIFS(std::string& UNCName) +{ + std::string CIFSname = UNCName; + std::string SMBPrefix = "smb://"; + size_t found; + while ((found = CIFSname.find("\\")) != std::string::npos) + { + CIFSname.replace(found, 1, "/"); + } + CIFSname.erase(0,2); + CIFSname.insert(0, SMBPrefix); + return CIFSname; +} + + +// transform [smb://user:password@nascat/qrecordings/NCIS/2012-05-15_20-30_SBS 6_NCIS.ts] +// into [\\nascat\qrecordings\NCIS\2012-05-15_20-30_SBS 6_NCIS.ts] +std::string ToUNC(std::string& CIFSName) +{ + std::string UNCname = CIFSName; + + UNCname.erase(0,6); + size_t found; + while ((found = UNCname.find("/")) != std::string::npos) + { + UNCname.replace(found, 1, "\\"); + } + UNCname.insert(0, "\\\\"); + return UNCname; +} + +std::string ToUNC(const char* CIFSName) +{ + std::string temp = CIFSName; + return ToUNC(temp); +} #if defined(TARGET_WINDOWS) ////////////////////////////////////////////////////////////////////////////// // diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/utils.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/utils.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.argustv/src/utils.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/src/utils.h 2014-01-04 10:28:12.000000000 +0000 @@ -36,6 +36,10 @@ void printValueTree( const Json::Value& value, const std::string& path = "." ); } +std::string ToCIFS(std::string& UNCName); +std::string ToUNC(std::string& CIFSName); +std::string ToUNC(const char* CIFSName); + #if defined(TARGET_WINDOWS) namespace UTF8Util { diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.demo/addon/addon.xml.in xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.demo/addon/addon.xml.in --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.demo/addon/addon.xml.in 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.demo/addon/addon.xml.in 2014-05-04 06:40:42.000000000 +0000 @@ -1,24 +1,162 @@ - + + የ PVR ደንበኛ ናሙና + Демонстрация на ПВР клиента + Client Demo PVR + Ukázkový klient PVR + Dangosydd Rhaglen Rhagleni + Demo PVR Klient + Demo PVR Client + Πελάτης PVR Demo Demo PVR Client + Demo PVR Client + Demo Cliente PVR + Cliente PVR demo + Cliente Demo PVR + Demo PVR klient + PVR Bezeroaren Demoa + Client PVR de démonstration + Client numériscope de démo + Cliente PVR Demo + הדגמה לקוח PVR + Demo PVR klijent + Demo PVR ügyfél + Klien Demo PVR + Client PVR Demo + デモ PVR クライアント + 데모 PVR 클라이언트 + Demo PVR klients + Демо за PVR клиент + Kline PVR Demo + PVR Client သရုပ်ပြမှု့ + Demo PVR cliënt + Demo PVR-klient + Demo klienta PVR + Cliente PVR Demo + Cliente de PVR de Demonstração + Demo client PVR + Демонстрация клиента PVR + Demo PVR Klient + Demo odjemalec PVR + Пробни PVR клијент + Demo PVR Klient + PVR கிளையன் செயல்முறை + Муштарии намоишии PVR + PVR Tanıtım İstemcisi + Демонстраційний клієнт для PVR + Demo PVR + PVR 演示客户端 + 演示PVR客戶端 + የ PVR ደንበኛ ናሙና + Демонстрация на ПВР клиента + Client Demo PVR + Ukázkový klient PVR + Dangosydd Rhaglen Rhagleni + Demo PVR Klient + Demo PVR Client + Πελάτης PVR Demo Demo PVR Client + Demo PVR Client + Demo Cliente PVR + Cliente PVR demo + Cliente Demo PVR + Demo PVR klient + PVR Bezeroaren Demoa + Client PVR de démonstration + Client numériscope de démo + Cliente PVR Demo + הדגמה לקוח PVR + Demo PVR klijent + Demo PVR ügyfél + Demo Klien PVR + Client PVR Demo + デモ PVR クライアント + 데모 PVR 클라이언트 + Demo PVR klients + Демо за PVR клиент + Klien PVR Demo + PVR Client သရုပ်ပြမှု့ + Demo PVR cliënt + Demo PVR-klient + Demo klienta PVR + Cliente PVR Demo + Cliente de PVR de Demonstração + Demo client PVR + Демонстрация клиента PVR + Demo PVR Klient + Demo odjemalec PVR + Пробни PVR клијент + Demo PVR Klient + PVR கிளையன் செயல்முறை + Муштарии намоишии PVR + PVR Tanıtım İstemcisi + Демонстраційний клієнт для PVR + Demo PVR + PVR 演示客户端 + 演示PVR客戶端 + ቁራጭ ይዟል + Просто съдържа междинни файлове + Només conté fragments + Obsahuje pouze pahýly funkcí + Bonyn yn unig + Indeholder kun stumper + Enthält nur Fragmente + Περιέχει μόνο εικονικά κανάλια Just contains stubs + Just contains stubs + Sólo contiene fragmentos + contiene sólo marcadores + Solo contiene talones + Sisaldab ainult juppe + Kodearen puskak ditu + Ne contient que des clips + Ne contient que des fragments + Só contén fragmentos + רק מכיל stubs + Samo sadrži kratke informacije + Csak tesztfunkciókat tartalmaz + Hanya mengandung stub + Contiene solo tronconi + 単なるスタブです + Satur tikai nepabeigtas lietas + некакви записи + Hanya mengandungi stub + stub များသာပါဝင်နေခြင်း + Bevat enkel stubs + Inneholder kun stubber + Tylko symuluje działanie + Só contém fragmentos + Só contém esboços + Contine numai cioturi + Содержит заглушки + Obsahuje len útržky + Vsebuje le fiktivne vsebine + Садржи само назнаке садржаја + Innehåller bara stubbar + செயல் இடங்கள் உள்ளன + Танҳо дорои сарпӯшак мебошад + Sadece taslakları içerir + Не містить нічого + Chỉ chứa phần tử sơ khai + 只包含存根 + 只包含 Stubs @OS@ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.demo/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.demo/Makefile.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.demo/Makefile.am 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.demo/Makefile.am 2014-01-04 10:28:12.000000000 +0000 @@ -10,7 +10,7 @@ LIBNAME = libpvrdemo-addon lib_LTLIBRARIES = libpvrdemo-addon.la -LIBS = @abs_top_builddir@/lib/tinyxml/libtinyxml.la +LIBS = @abs_top_srcdir@/lib/tinyxml/libtinyxml.la include ../Makefile.include.am diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.demo/project/VS2010Express/pvrclient_demo.vcxproj xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.demo/project/VS2010Express/pvrclient_demo.vcxproj --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.demo/project/VS2010Express/pvrclient_demo.vcxproj 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.demo/project/VS2010Express/pvrclient_demo.vcxproj 2014-01-04 10:28:12.000000000 +0000 @@ -54,7 +54,7 @@ Level3 Disabled ..\..\..\..\xbmc;..\..\..\..\lib;..\..\..\..\lib\platform\windows - _WINDLL;_CRT_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;_WINSOCKAPI_;%(PreprocessorDefinitions) + _WINDLL;TARGET_WINDOWS;_CRT_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;_WINSOCKAPI_;%(PreprocessorDefinitions) MultiThreadedDebug @@ -69,7 +69,7 @@ true true ..\..\..\..\xbmc;..\..\..\..\lib;..\..\..\..\lib\platform\windows - _WINDLL;_CRT_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;_WINSOCKAPI_;%(PreprocessorDefinitions) + _WINDLL;TARGET_WINDOWS;_CRT_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;_WINSOCKAPI_;%(PreprocessorDefinitions) MultiThreaded diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.demo/src/client.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.demo/src/client.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.demo/src/client.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.demo/src/client.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -125,6 +125,10 @@ { } +void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ +} + /*********************************************************** * PVR Client AddOn specific public library functions ***********************************************************/ @@ -141,6 +145,18 @@ return strMinApiVersion; } +const char* GetGUIAPIVersion(void) +{ + static const char *strGuiApiVersion = XBMC_GUI_API_VERSION; + return strGuiApiVersion; +} + +const char* GetMininumGUIAPIVersion(void) +{ + static const char *strMinGuiApiVersion = XBMC_GUI_MIN_API_VERSION; + return strMinGuiApiVersion; +} + PVR_ERROR GetAddonCapabilities(PVR_ADDON_CAPABILITIES* pCapabilities) { pCapabilities->bSupportsEPG = true; @@ -289,7 +305,7 @@ /** UNUSED API FUNCTIONS */ PVR_ERROR DialogChannelScan(void) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook) { return PVR_ERROR_NOT_IMPLEMENTED; } +PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_MENUHOOK_DATA &item) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR DeleteChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR RenameChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR MoveChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } @@ -313,6 +329,7 @@ PVR_ERROR SetRecordingPlayCount(const PVR_RECORDING &recording, int count) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR SetRecordingLastPlayedPosition(const PVR_RECORDING &recording, int lastplayedposition) { return PVR_ERROR_NOT_IMPLEMENTED; } int GetRecordingLastPlayedPosition(const PVR_RECORDING &recording) { return -1; } +PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY[], int*) { return PVR_ERROR_NOT_IMPLEMENTED; }; int GetTimersAmount(void) { return -1; } PVR_ERROR GetTimers(ADDON_HANDLE handle) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR AddTimer(const PVR_TIMER &timer) { return PVR_ERROR_NOT_IMPLEMENTED; } @@ -326,4 +343,7 @@ bool CanSeekStream(void) { return false; } bool SeekTime(int,bool,double*) { return false; } void SetSpeed(int) {}; +time_t GetPlayingTime() { return 0; } +time_t GetBufferTimeStart() { return 0; } +time_t GetBufferTimeEnd() { return 0; } } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.demo/src/client.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.demo/src/client.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.demo/src/client.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.demo/src/client.h 2014-01-04 10:28:12.000000000 +0000 @@ -22,6 +22,7 @@ #include "libXBMC_addon.h" #include "libXBMC_pvr.h" +#include "libXBMC_gui.h" extern bool m_bCreated; extern std::string g_strUserPath; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.demo/src/PVRDemoData.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.demo/src/PVRDemoData.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.demo/src/PVRDemoData.cpp 2012-11-21 10:53:40.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.demo/src/PVRDemoData.cpp 2014-01-04 10:28:19.000000000 +0000 @@ -259,7 +259,7 @@ time_t timeNow = time(NULL); struct tm* now = localtime(&timeNow); - int delim = strTmp.Find(':'); + CStdString::size_type delim = strTmp.Find(':'); if (delim != CStdString::npos) { now->tm_hour = (int)strtol(strTmp.Left(delim), NULL, 0); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/addon/addon.xml.in xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/addon/addon.xml.in --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/addon/addon.xml.in 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/addon/addon.xml.in 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,25 @@ + + + + + + + + + PVR Plugin for DVBLink + PVR Plugin for DVBLink from DvbLogic.com; supporting streaming of Live TV & Recordings, EPG, Timers + This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. + @OS@ + + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/addon/changelog.txt xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/addon/changelog.txt --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/addon/changelog.txt 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/addon/changelog.txt 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,70 @@ +[B]Version 1.9.0[/B] +Sync with XBMC PVR API v1.9.0 + +[B]Version 1.7.0[/B] +Fixed: Recordings on DVBLINK 4.5.3 +Fixed: Closing socket file handles +Added: Support for Android +Changed: No longer show errors on failed to receive recordings / timers list. + +[B]Version 1.6.2[/B] +Fixed: Authentication issue on unix / linux based platforms +Added: Refresh Timers and Recordings list every 30 seconds +Changed: Timeshift buffer path now refers to a folder path +Delete timeshift buffer when nolonger needed + +[B]Version 1.6.1[/B] +Added: Timeshift support (Http only) +Added: Information about backend diskspace (System->System Info->PVR Service) +Added: Option for enabling information notifications (Default:disabled) +Updated language files +General code style clean up to be more compliant with XBMC coding style + +[B]Version 1.6.0.11[/B] +Removed wrong danish language from addon description + +[B]Version 1.6.0.10[/B] +Fixed: Timer related crash when addon could not find program information for EPG based timers + +[B]Version 1.6.0.9[/B] +Added: Better notification and logging of status / error information + +[B]Version 1.6.0.8[/B] +Fixed: Not all schedules shown +Fixed: Not able to use username/password (Windows only) + +[B]Version 1.6.0.7[/B] +Builds for all major os: windows,linux and osx +Updated to XBMC Frodo Beta 2 +Updated to newest libdvblinkremote api +Enabled editing of timers +Updated version number to reflect other pvr addons +Removed dependency on libcurl + +[B]0.0.6[/B] +Fixed: Bug where addon did not show channels / EPG when using MCE Recorder + +[B]0.0.5[/B] +Fixed: Bug where dvblink port from setting was not used + +[B]0.0.4[/B] +Fixed: EPG data from when using MCE recorder +Added: Preliminary (Have not been tested) support for transcoding +Changed: Reordered settings + +[B]0.0.3[/B] +Added: Fix for using channel handle instead of client id when stopping channels + +[B]0.0.2[/B] +Added: Scheduling of recordings using EPG based timers +Added: Enabled removal of timers +Added: Listing of recordings (using DVBLink build in recorder) +Added: Playback of recordings (using DVBLink build in recorder) +Added: Enabled removal of recordings (using DVBLink build in recorder) +Fixed: Memory several leaks +Removed: Not yet implemented steaming and timeout options + +[B]0.0.1[/B] +Beta release +Playback of live tv and radio using raw http +Listing of EPG Binary files /tmp/1FTPYs_Qq_/xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/addon/icon.png and /tmp/njK1ftphDV/xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/addon/icon.png differ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/addon/resources/language/Danish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/addon/resources/language/Danish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/addon/resources/language/Danish/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/addon/resources/language/Danish/strings.po 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,138 @@ +# XBMC Media Center language file +msgid "" +msgstr "" +"Project-Id-Version: XBMC-Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: 2012-12-11 20:52+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +msgctxt "#30000" +msgid "General" +msgstr "Generelt" + +msgctxt "#30001" +msgid "Server Address" +msgstr "Server adresse" + +msgctxt "#30002" +msgid "Server Port" +msgstr "Server Port" + +msgctxt "#30003" +msgid "Client name" +msgstr "Klient navn" + +msgctxt "#30004" +msgid "Connection timeout (s)" +msgstr "Forbindelse timeout" + +msgctxt "#30005" +msgid "Username" +msgstr "Brugernavn" + +msgctxt "#30006" +msgid "Password" +msgstr "Kodeord" + +msgctxt "#30100" +msgid "Stream" +msgstr "Stream" + +msgctxt "#30102" +msgid "Stream format" +msgstr "Stream format" + +msgctxt "#30103" +msgid "Height" +msgstr "Højde" + +msgctxt "#30104" +msgid "Width" +msgstr "Brede" + +msgctxt "#30105" +msgid "Bitrate" +msgstr "Bitrate" + +msgctxt "#30106" +msgid "Audio track" +msgstr "Lyd spor" + +msgctxt "#30107" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30108" +msgid "RTP" +msgstr "RTP" + +msgctxt "#30109" +msgid "HLS" +msgstr "HLS" + +msgctxt "#30110" +msgid "ASF" +msgstr "ASF" + +msgctxt "#30111" +msgid "Enable Timeshift" +msgstr "Aktiver timestift" + +msgctxt "#30112" +msgid "Timeshift buffer path" +msgstr "Timeshift buffer sti" + +msgctxt "#30200" +msgid "Advanced" +msgstr "Advanceret" + +msgctxt "#30201" +msgid "Use channel handle instead of client id" +msgstr "Brug kanal handle istedet for klient id" + +msgctxt "#30202" +msgid "Show information messages" +msgstr "Vis infomations beskeder" + +msgctxt "#32001" +msgid "Connected to DVBLink Server '%s'" +msgstr "Forbundet til DVBLink Server '%s'" + +msgctxt "#32002" +msgid "Found '%d' channels" +msgstr "Fundet'%d' kanaler" + +msgctxt "#32003" +msgid "Could not connect to DVBLink Server '%s' (Error code : %d)" +msgstr "Kunne ikke forbinde til DVBLink Server '%s' (Fejl kode : %d)" + +msgctxt "#32004" +msgid "Could not get recordings (Error code : %d)" +msgstr "Kunne ikke hente optagelser (Fejl kode : %d)" + +msgctxt "#32006" +msgid "Could not get timers(Error code : %d)" +msgstr "Kunne ikke hente timers (Fejl kode : %d)" + +msgctxt "#32007" +msgid "Found %d EPG timers" +msgstr "Fundet %d EPG timers" + +msgctxt "#32008" +msgid "Found %d manual timers" +msgstr "Fundet %d manual timers" + +msgctxt "#32009" +msgid "Found %d recordings" +msgstr "Fundet %d optagelser" + +msgctxt "#32010" +msgid "Could not get stream for channel %s (Error code : %d)" +msgstr "Kunne ikke få stream til kanal %s (Fejl kode : %d)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/addon/resources/language/English/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/addon/resources/language/English/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/addon/resources/language/English/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/addon/resources/language/English/strings.po 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,153 @@ +# XBMC Media Center language file +msgid "" +msgstr "" +"Project-Id-Version: XBMC-Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: 2012-12-11 20:52+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#settings labels + +msgctxt "#30000" +msgid "General" +msgstr "" + +msgctxt "#30001" +msgid "Server Address" +msgstr "" + +msgctxt "#30002" +msgid "Server Port" +msgstr "" + +msgctxt "#30003" +msgid "Client name" +msgstr "" + +msgctxt "#30004" +msgid "Connection timeout (s)" +msgstr "" + +msgctxt "#30005" +msgid "Username" +msgstr "" + +msgctxt "#30006" +msgid "Password" +msgstr "" + +#empty strings from id 30007 to 30099 + +msgctxt "#30100" +msgid "Stream" +msgstr "" + +#empty string with id 30101 + +msgctxt "#30102" +msgid "Stream format" +msgstr "" + +msgctxt "#30103" +msgid "Height" +msgstr "" + +msgctxt "#30104" +msgid "Width" +msgstr "" + +msgctxt "#30105" +msgid "Bitrate" +msgstr "" + +msgctxt "#30106" +msgid "Audio track" +msgstr "" + +msgctxt "#30107" +msgid "HTTP" +msgstr "" + +msgctxt "#30108" +msgid "RTP" +msgstr "" + +msgctxt "#30109" +msgid "HLS" +msgstr "" + +msgctxt "#30110" +msgid "ASF" +msgstr "" + +msgctxt "#30111" +msgid "Enable Timeshift" +msgstr "" + +msgctxt "#30112" +msgid "Timeshift buffer path" +msgstr "" + +#empty strings from id 30111 to 30199 + +msgctxt "#30200" +msgid "Advanced" +msgstr "" + +#Messages labels + +msgctxt "#30201" +msgid "Use channel handle instead of client id" +msgstr "" + +msgctxt "#30202" +msgid "Show information messages" +msgstr "" + +#category labels +#empty strings from id 30203 to 32000 + +msgctxt "#32001" +msgid "Connected to DVBLink Server '%s'" +msgstr "" + +msgctxt "#32002" +msgid "Found '%d' channels" +msgstr "" + +msgctxt "#32003" +msgid "Could not connect to DVBLink Server '%s' (Error code : %d)" +msgstr "" + +msgctxt "#32004" +msgid "Could not get recordings (Error code : %d)" +msgstr "" + +#empty string with id 32005 + +msgctxt "#32006" +msgid "Could not get timers(Error code : %d)" +msgstr "" + +msgctxt "#32007" +msgid "Found %d EPG timers" +msgstr "" + +msgctxt "#32008" +msgid "Found %d manual timers" +msgstr "" + +msgctxt "#32009" +msgid "Found %d recordings" +msgstr "" + +msgctxt "#32010" +msgid "Could not get stream for channel %s (Error code : %d)" +msgstr "" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/addon/resources/settings.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/addon/resources/settings.xml --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/addon/resources/settings.xml 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/addon/resources/settings.xml 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/Makefile.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/Makefile.am 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,25 @@ +# +# Makefile for the DVBLink add-on for XBMC PVR +# +# See the README for copyright information and +# how to reach the author. +# + +ADDONBINNAME = XBMC_DVBLink +ADDONNAME = pvr.dvblink +LIBNAME = libdvblink-addon +lib_LTLIBRARIES = libdvblink-addon.la + +LIBS = @abs_top_srcdir@/lib/libdvblinkremote/libdvblinkremote.la + +include ../Makefile.include.am + +INCLUDES+=-Isrc + +libdvblink_addon_la_SOURCES = src/client.cpp \ + src/base64.cpp \ + src/HttpPostClient.cpp \ + src/TimeShiftBuffer.cpp \ + src/DVBLinkClient.cpp +libdvblink_addon_la_LDFLAGS = @TARGET_LDFLAGS@ + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/project/VS2010Express/pvrclient_dvblink.vcxproj xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/project/VS2010Express/pvrclient_dvblink.vcxproj --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/project/VS2010Express/pvrclient_dvblink.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/project/VS2010Express/pvrclient_dvblink.vcxproj 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,120 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {F9F3E7B6-EF4C-4BD8-A921-3DE4C4268945} + pvrclient_dvblink + pvr.dvblink + + + + DynamicLibrary + true + MultiByte + + + DynamicLibrary + false + true + MultiByte + + + + + + + + + + + + + ..\..\addon\ + + + .dll + XBMC_DVBLink_win32 + + + ..\..\addon\ + + + .dll + XBMC_DVBLink_win32 + + + + Level3 + Disabled + ..\..\..\..\xbmc;..\..\..\..\lib;..\..\..\..\lib\platform\windows;../../../../project/BuildDependencies/include; + _WINDLL;TARGET_WINDOWS;TSREADER;_WINSOCKAPI_;_USE_32BIT_TIME_T;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreadedDebug + + + true + ws2_32.lib;kernel32.lib;user32.lib;%(AdditionalDependencies) + $(SolutionDir)$(Configuration)\ + + + false + + + + + Level3 + MaxSpeed + true + true + ..\..\..\..\xbmc;..\..\..\..\lib;..\..\..\..\lib\platform\windows;../../../../project/BuildDependencies/include; + _WINDLL;TARGET_WINDOWS;TSREADER;_WINSOCKAPI_;_USE_32BIT_TIME_T;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + ws2_32.lib;kernel32.lib;user32.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + + + {db826a81-e848-4e39-be17-e779a49e2960} + + + {16a1d446-5415-444e-a7b4-f35b7da7ee8c} + + + {fe4573f6-a794-4ad3-b37f-49e51f1140e6} + + + + + + \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/project/VS2010Express/pvrclient_dvblink.vcxproj.filters xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/project/VS2010Express/pvrclient_dvblink.vcxproj.filters --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/project/VS2010Express/pvrclient_dvblink.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/project/VS2010Express/pvrclient_dvblink.vcxproj.filters 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,51 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/src/base64.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/src/base64.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/src/base64.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/src/base64.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,131 @@ +/* + base64.cpp and base64.h + + Copyright (C) 2004-2008 René Nyffenegger + + This source code is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this source code must not be misrepresented; you must not + claim that you wrote the original source code. If you use this source code + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original source code. + + 3. This notice may not be removed or altered from any source distribution. + + René Nyffenegger rene.nyffenegger@adp-gmbh.ch + + Code modified to meet XBMC stand coding style by Palle Ehmsen (Palle@barcodemadness.com) 2012 +*/ + +#include "base64.h" +#include + +static const std::string BASE64_CHARS = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + + +static inline bool is_base64(unsigned char c) +{ + return (isalnum(c) || (c == '+') || (c == '/')); +} + +std::string base64_encode(char const* bytes_to_encode, unsigned int in_len) +{ + std::string ret; + int i = 0; + int j = 0; + unsigned char char_array_3[3]; + unsigned char char_array_4[4]; + + while (in_len--) + { + char_array_3[i++] = *(bytes_to_encode++); + if (i == 3) + { + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); + char_array_4[3] = char_array_3[2] & 0x3f; + + for (i = 0; (i <4) ; i++) + ret += BASE64_CHARS[char_array_4[i]]; + i = 0; + } + } + + if (i) + { + for (j = i; j < 3; j++) + char_array_3[j] = '\0'; + + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); + char_array_4[3] = char_array_3[2] & 0x3f; + + for (j = 0; (j < i + 1); j++) + ret += BASE64_CHARS[char_array_4[j]]; + + while ((i++ < 3)) + ret += '='; + + } + return ret; +} + +std::string base64_decode(std::string const& encoded_string) +{ + int in_len = encoded_string.size(); + int i = 0; + int j = 0; + int in_ = 0; + unsigned char char_array_4[4], char_array_3[3]; + std::string ret; + + while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) + { + char_array_4[i++] = encoded_string[in_]; in_++; + if (i ==4) + { + for (i = 0; i <4; i++) + char_array_4[i] = BASE64_CHARS.find(char_array_4[i]); + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (i = 0; (i < 3); i++) + ret += char_array_3[i]; + i = 0; + } + } + + if (i) + { + for (j = i; j <4; j++) + char_array_4[j] = 0; + + for (j = 0; j <4; j++) + char_array_4[j] = BASE64_CHARS.find(char_array_4[j]); + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (j = 0; (j < i - 1); j++) + ret += char_array_3[j]; + } + + return ret; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/src/base64.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/src/base64.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/src/base64.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/src/base64.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,4 @@ +#include + +std::string base64_encode(char const* , unsigned int len); +std::string base64_decode(std::string const& s); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/src/client.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/src/client.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/src/client.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/src/client.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,790 @@ +/* + * Copyright (C) 2005-2012 Team XBMC + * http://xbmc.org + + * Copyright (C) 2012 Palle Ehmsen(Barcode Madness) + * http://www.barcodemadness.com + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#include "client.h" +#include "xbmc_pvr_dll.h" +#include "DVBLinkClient.h" +#include "platform/util/util.h" + +using namespace std; +using namespace ADDON; + + +#ifdef TARGET_WINDOWS +#define snprintf _snprintf +#endif + +bool m_bCreated = false; +ADDON_STATUS m_CurStatus = ADDON_STATUS_UNKNOWN; + + +std::string g_strUserPath = ""; +std::string g_strClientPath = ""; + +DVBLinkClient* dvblinkclient = NULL; + +std::string g_szHostname = DEFAULT_HOST; ///< The Host name or IP of the DVBLink Server +long g_lPort = DEFAULT_PORT; ///< The DVBLink Connect Server listening port (default: 8080) +int g_iConnectTimeout = DEFAULT_TIMEOUT; ///< The Socket connection timeout +DVBLINK_STREAMTYPE g_eStreamType = DEFAULT_STREAMTYPE; ///< Stream type used by video stream +std::string g_szClientname = DEFAULT_CLIENTNAME; ///< Name of dvblink client +std::string g_szUsername = DEFAULT_USERNAME; ///< Username +std::string g_szPassword = DEFAULT_PASSWORD; ///< Password +bool g_bUseChlHandle = DEFAULT_USECHLHANDLE; ///< Use channel handle instead of client id +bool g_bShowInfoMSG = DEFAULT_SHOWINFOMSG; ///< Show information messages +int g_iHeight = DEFAULT_HEIGHT; ///< Height of stream when using transcoding +int g_iWidth = DEFAULT_WIDTH; ///< Width of stream when using transcoding +int g_iBitrate = DEFAULT_BITRATE; ///< Bitrate of stream when using transcoding +std::string g_szAudiotrack = DEFAULT_AUDIOTRACK; ///< Audiotrack to include in stream when using transcoding +std::string g_szTimeShiftBufferPath = DEFAULT_TIMESHIFTBUFFERPATH; ///< Path to timeshift buffer +bool g_bUseTimeshift = DEFAULT_USETIMESHIFT; ///< Use timeshift +CHelper_libXBMC_addon *XBMC = NULL; +CHelper_libXBMC_pvr *PVR = NULL; + +extern "C" { + + +ADDON_STATUS ADDON_Create(void* hdl, void* props) +{ + if (!hdl || !props) + return ADDON_STATUS_UNKNOWN; + + PVR_PROPERTIES* pvrprops = (PVR_PROPERTIES*)props; + + XBMC = new CHelper_libXBMC_addon; + if (!XBMC->RegisterMe(hdl)) + { + SAFE_DELETE(XBMC); + return ADDON_STATUS_PERMANENT_FAILURE; + } + + PVR = new CHelper_libXBMC_pvr; + if (!PVR->RegisterMe(hdl)) + { + SAFE_DELETE(PVR); + SAFE_DELETE(XBMC); + return ADDON_STATUS_PERMANENT_FAILURE; + } + + XBMC->Log(LOG_DEBUG, "%s - Creating the PVR DVBlink add-on", __FUNCTION__); + + m_CurStatus = ADDON_STATUS_UNKNOWN; + g_strUserPath = pvrprops->strUserPath; + g_strClientPath = pvrprops->strClientPath; + + char * buffer = (char*) malloc(128); + buffer[0] = 0; + + /* Connection settings */ + /***********************/ + + if (XBMC->GetSetting("host", buffer)) + { + g_szHostname = buffer; + } + else + { + /* If setting is unknown fallback to defaults */ + XBMC->Log(LOG_ERROR, "Couldn't get 'host' setting, falling back to '127.0.0.1' as default"); + g_szHostname = DEFAULT_HOST; + } + + /* Read setting "client" from settings.xml */ + if (XBMC->GetSetting("client", buffer)) + { + g_szClientname = buffer; + } + else + { + /* If setting is unknown fallback to defaults */ + XBMC->Log(LOG_ERROR, "Couldn't get 'clientname' setting, falling back to 'xbmc' as default"); + g_szClientname = DEFAULT_CLIENTNAME; + } + + /* Read setting "username" from settings.xml */ + if (XBMC->GetSetting("username", buffer)) + { + g_szUsername = buffer; + } + else + { + /* If setting is unknown fallback to defaults */ + XBMC->Log(LOG_ERROR, "Couldn't get 'username' setting, falling back to '' as default"); + g_szUsername = DEFAULT_USERNAME; + } + + /* Read setting "password" from settings.xml */ + if (XBMC->GetSetting("password", buffer)) + { + g_szPassword = buffer; + } + else + { + /* If setting is unknown fallback to defaults */ + XBMC->Log(LOG_ERROR, "Couldn't get 'password' setting, falling back to '' as default"); + g_szPassword = DEFAULT_PASSWORD; + } + + /* Read setting "streamtype" from settings.xml */ + if (!XBMC->GetSetting("streamtype", &g_eStreamType)) + { + /* If setting is unknown fallback to defaults */ + XBMC->Log(LOG_ERROR, "Couldn't get 'streamtype' setting, falling back to 'http' as default"); + g_eStreamType = DEFAULT_STREAMTYPE; + } + + /* Read setting "port" from settings.xml */ + if (!XBMC->GetSetting("port", &g_lPort)) + { + /* If setting is unknown fallback to defaults */ + XBMC->Log(LOG_ERROR, "Couldn't get 'port' setting, falling back to '8080' as default"); + g_lPort = DEFAULT_PORT; + } + + /* Read setting "timeout" from settings.xml */ + if (!XBMC->GetSetting("timeout", &g_iConnectTimeout)) + { + /* If setting is unknown fallback to defaults */ + XBMC->Log(LOG_ERROR, "Couldn't get 'timeout' setting, falling back to %i seconds as default", DEFAULT_TIMEOUT); + g_iConnectTimeout = DEFAULT_TIMEOUT; + } + + /* Read setting "ch_handle" from settings.xml */ + if (!XBMC->GetSetting("ch_handle", &g_bUseChlHandle)) + { + /* If setting is unknown fallback to defaults */ + XBMC->Log(LOG_ERROR, "Couldn't get 'ch_handle' setting, falling back to 'true' as default"); + g_bUseChlHandle = DEFAULT_USECHLHANDLE; + } + + /* Read setting "timeshift" from settings.xml */ + if (!XBMC->GetSetting("timeshift", &g_bUseTimeshift)) + { + /* If setting is unknown fallback to defaults */ + XBMC->Log(LOG_ERROR, "Couldn't get 'timeshift' setting, falling back to 'false' as default"); + g_bUseTimeshift = DEFAULT_USETIMESHIFT; + } + + /* Read setting "timeshiftpath" from settings.xml */ + if (XBMC->GetSetting("timeshiftpath", buffer)) + { + g_szTimeShiftBufferPath = buffer; + } + else + { + /* If setting is unknown fallback to defaults */ + XBMC->Log(LOG_ERROR, "Couldn't get 'timeshiftpath' setting, falling back to 'special://userdata/addon_data/pvr.dvblink/' as default"); + g_szTimeShiftBufferPath = DEFAULT_TIMESHIFTBUFFERPATH; + } + + + /* Read setting "ch_handle" from settings.xml */ + if (!XBMC->GetSetting("showinfomsg", &g_bShowInfoMSG)) + { + /* If setting is unknown fallback to defaults */ + XBMC->Log(LOG_ERROR, "Couldn't get 'showinfomsg' setting, falling back to 'true' as default"); + g_bShowInfoMSG = DEFAULT_SHOWINFOMSG; + } + + /* Read setting "height" from settings.xml */ + if (!XBMC->GetSetting("height", &g_iHeight)) + { + /* If setting is unknown fallback to defaults */ + XBMC->Log(LOG_ERROR, "Couldn't get 'Height' setting, falling back to '720' as default"); + g_iHeight = DEFAULT_HEIGHT; + } + + /* Read setting "width" from settings.xml */ + if (!XBMC->GetSetting("width", &g_iWidth)) + { + /* If setting is unknown fallback to defaults */ + XBMC->Log(LOG_ERROR, "Couldn't get 'Width' setting, falling back to '576' as default"); + g_iWidth = DEFAULT_WIDTH; + } + + /* Read setting "bitrate" from settings.xml */ + if (!XBMC->GetSetting("bitrate", &g_iBitrate)) + { + /* If setting is unknown fallback to defaults */ + XBMC->Log(LOG_ERROR, "Couldn't get 'Biterate' setting, falling back to '512' as default"); + g_iBitrate = DEFAULT_BITRATE; + } + + /* Read setting "audiotrack" from settings.xml */ + if (XBMC->GetSetting("audiotrack", buffer)) + { + g_szAudiotrack = buffer; + }else + { + /* If setting is unknown fallback to defaults */ + XBMC->Log(LOG_ERROR, "Couldn't get 'Audiotrack' setting, falling back to 'eng' as default"); + g_szAudiotrack = DEFAULT_AUDIOTRACK; + } + + /* Log the current settings for debugging purposes */ + XBMC->Log(LOG_DEBUG, "settings: streamtype='%i' host='%s', port=%i, timeout=%i", g_eStreamType, g_szHostname.c_str(), g_lPort, g_iConnectTimeout); + + dvblinkclient = new DVBLinkClient(XBMC,PVR, g_szClientname, g_szHostname, g_lPort, g_bShowInfoMSG, g_szUsername, g_szPassword, g_bUseTimeshift, g_szTimeShiftBufferPath); + + m_CurStatus = ADDON_STATUS_OK; + m_bCreated = true; + return m_CurStatus; +} + +ADDON_STATUS ADDON_GetStatus() +{ + return m_CurStatus; +} + +void ADDON_Destroy() +{ + delete dvblinkclient; + m_bCreated = false; + m_CurStatus = ADDON_STATUS_UNKNOWN; +} + +bool ADDON_HasSettings() +{ + return true; +} + +unsigned int ADDON_GetSettings(ADDON_StructSetting ***sSet) +{ + return 0; +} + +ADDON_STATUS ADDON_SetSetting(const char *settingName, const void *settingValue) +{ + string str = settingName; + + if (str == "host") + { + string tmp_sHostname; + XBMC->Log(LOG_INFO, "Changed Setting 'host' from %s to %s", g_szHostname.c_str(), (const char*) settingValue); + tmp_sHostname = g_szHostname; + g_szHostname = (const char*) settingValue; + if (tmp_sHostname != g_szHostname) + return ADDON_STATUS_NEED_RESTART; + } + else if (str == "client") + { + string tmp_sClientname; + XBMC->Log(LOG_INFO, "Changed Setting 'client' from %s to %s", g_szClientname.c_str(), (const char*) settingValue); + tmp_sClientname = g_szClientname; + g_szClientname = (const char*) settingValue; + if (tmp_sClientname != g_szClientname) + return ADDON_STATUS_NEED_RESTART; + } + else if (str == "username") + { + string tmp_sUsername; + XBMC->Log(LOG_INFO, "Changed Setting 'username' from %s to %s", g_szUsername.c_str(), (const char*) settingValue); + tmp_sUsername = g_szUsername; + g_szUsername = (const char*) settingValue; + if (tmp_sUsername != g_szUsername) + return ADDON_STATUS_NEED_RESTART; + } + else if (str == "password") + { + string tmp_sPassword; + XBMC->Log(LOG_INFO, "Changed Setting 'password' from %s to %s", g_szPassword.c_str(), (const char*) settingValue); + tmp_sPassword = g_szPassword; + g_szPassword = (const char*) settingValue; + if (tmp_sPassword != g_szPassword) + return ADDON_STATUS_NEED_RESTART; + } + else if (str == "streamtype") + { + DVBLINK_STREAMTYPE tmp_eStreamtype; + XBMC->Log(LOG_INFO, "Changed Setting 'streamtype' from %i to %i", g_eStreamType, *(const DVBLINK_STREAMTYPE *) settingValue); + tmp_eStreamtype = g_eStreamType; + g_eStreamType = *((const DVBLINK_STREAMTYPE *)settingValue); + if (tmp_eStreamtype != g_eStreamType) + return ADDON_STATUS_NEED_RESTART; + } + else if (str == "port") + { + XBMC->Log(LOG_INFO, "Changed Setting 'port' from %i to %i", g_lPort, *(int*) settingValue); + if (g_lPort != (long)(*(int*) settingValue)) + { + g_lPort = (long)(*(int*) settingValue); + XBMC->Log(LOG_INFO, "Changed Setting 'port' to %i", g_lPort); + return ADDON_STATUS_NEED_RESTART; + } + } + else if (str == "timeout") + { + XBMC->Log(LOG_INFO, "Changed setting 'timeout' from %u to %u", g_iConnectTimeout, *(int*) settingValue); + g_iConnectTimeout = *(int*) settingValue; + } + else if (str == "ch_handle") + { + XBMC->Log(LOG_INFO, "Changed Setting 'ch_handle' from %u to %u", g_bUseChlHandle, *(int*) settingValue); + g_bUseChlHandle = *(bool*) settingValue; + } + else if (str == "timeshift") + { + XBMC->Log(LOG_INFO, "Changed Setting 'timeshift' from %u to %u", g_bUseTimeshift, *(int*) settingValue); + g_bUseTimeshift = *(bool*) settingValue; + return ADDON_STATUS_NEED_RESTART; + } + else if (str == "timeshiftpath") + { + string tmp_sTimeShiftBufferPath; + XBMC->Log(LOG_INFO, "Changed Setting 'timeshiftpath' from %s to %s", g_szTimeShiftBufferPath.c_str(), (const char*) settingValue); + tmp_sTimeShiftBufferPath = g_szTimeShiftBufferPath; + g_szTimeShiftBufferPath = (const char*) settingValue; + if (tmp_sTimeShiftBufferPath != g_szTimeShiftBufferPath) + return ADDON_STATUS_NEED_RESTART; + } + else if (str == "showinfomsg") + { + XBMC->Log(LOG_INFO, "Changed Setting 'showinfomsg' from %u to %u", g_bShowInfoMSG, *(int*) settingValue); + g_bShowInfoMSG = *(bool*) settingValue; + } + else if (str == "height") + { + XBMC->Log(LOG_INFO, "Changed Setting 'height' from %u to %u", g_iHeight, *(int*) settingValue); + g_iHeight = *(int*) settingValue; + } + else if (str == "width") + { + XBMC->Log(LOG_INFO, "Changed Setting 'width' from %u to %u", g_iWidth, *(int*) settingValue); + g_iWidth = *(int*) settingValue; + } + else if (str == "bitrate") + { + XBMC->Log(LOG_INFO, "Changed Setting 'bitrate' from %u to %u", g_iBitrate, *(int*) settingValue); + g_iBitrate = *(int*) settingValue; + } + else if (str == "audiotrack") + { + string tmp_sAudiotrack; + XBMC->Log(LOG_INFO, "Changed Setting 'audiotrack' from %s to %s", g_szAudiotrack.c_str(), (const char*) settingValue); + tmp_sAudiotrack = g_szAudiotrack; + g_szAudiotrack = (const char*) settingValue; + if (tmp_sAudiotrack != g_szAudiotrack) + return ADDON_STATUS_NEED_RESTART; + } + return ADDON_STATUS_OK; +} + +void ADDON_Stop() +{ +} + +void ADDON_FreeSettings() +{ +} + +void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ +} + +/*********************************************************** + * PVR Client AddOn specific public library functions + ***********************************************************/ + +const char* GetPVRAPIVersion(void) +{ + static const char *strApiVersion = XBMC_PVR_API_VERSION; + return strApiVersion; +} + +const char* GetMininumPVRAPIVersion(void) +{ + static const char *strMinApiVersion = XBMC_PVR_MIN_API_VERSION; + return strMinApiVersion; +} + +const char* GetGUIAPIVersion(void) +{ + static const char *strGuiApiVersion = XBMC_GUI_API_VERSION; + return strGuiApiVersion; +} + +const char* GetMininumGUIAPIVersion(void) +{ + static const char *strMinGuiApiVersion = XBMC_GUI_MIN_API_VERSION; + return strMinGuiApiVersion; +} + +PVR_ERROR GetAddonCapabilities(PVR_ADDON_CAPABILITIES* pCapabilities) +{ + pCapabilities->bSupportsEPG = true; + pCapabilities->bSupportsRecordings = true; //TODO: ADD when possible to see recording + pCapabilities->bSupportsTimers = true; + pCapabilities->bSupportsTV = true; + pCapabilities->bSupportsRadio = true; + pCapabilities->bHandlesInputStream = true; + return PVR_ERROR_NO_ERROR; +} + +const char *GetBackendName(void) +{ + static const char *strBackendName = "DVBLink Connect! Server"; + return strBackendName; +} + +const char *GetBackendVersion(void) +{ + static const char * strBackendVersion = "0.2"; + return strBackendVersion; +} + +const char *GetConnectionString(void) +{ + return g_szHostname.c_str(); +} + +PVR_ERROR GetDriveSpace(long long *iTotal, long long *iUsed) +{ + if (dvblinkclient) + { + dvblinkclient->GetDriveSpace(iTotal, iUsed); + return PVR_ERROR_NO_ERROR; + } + return PVR_ERROR_SERVER_ERROR; +} + +PVR_ERROR GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart, time_t iEnd) +{ + if (dvblinkclient) + return dvblinkclient->GetEPGForChannel(handle, channel, iStart, iEnd); + + return PVR_ERROR_SERVER_ERROR; +} + +int GetChannelsAmount(void) +{ + if (dvblinkclient) + return dvblinkclient->GetChannelsAmount(); + + return -1; +} + +PVR_ERROR GetChannels(ADDON_HANDLE handle, bool bRadio) +{ + if (dvblinkclient) + return dvblinkclient->GetChannels(handle, bRadio); + + return PVR_ERROR_SERVER_ERROR; +} + +bool OpenLiveStream(const PVR_CHANNEL &channel) +{ + if (dvblinkclient) + return dvblinkclient->OpenLiveStream(channel, g_eStreamType, g_iWidth, g_iHeight, g_iBitrate, g_szAudiotrack); + return false; +} + +void CloseLiveStream(void) +{ + if (dvblinkclient) + dvblinkclient->StopStreaming(g_bUseChlHandle); +} + +const char * GetLiveStreamURL(const PVR_CHANNEL &channel) +{ + if (dvblinkclient) + return dvblinkclient->GetLiveStreamURL(channel, g_eStreamType, g_iWidth, g_iHeight, g_iBitrate, g_szAudiotrack); + return ""; +} + +int ReadLiveStream(unsigned char *pBuffer, unsigned int iBufferSize) +{ + if (dvblinkclient) + return dvblinkclient->ReadLiveStream(pBuffer,iBufferSize); + return 0; +} + +long long SeekLiveStream(long long iPosition, int iWhence /* = SEEK_SET */) +{ + if (dvblinkclient) + return dvblinkclient->SeekLiveStream(iPosition,iWhence); + return -1; +} + +long long PositionLiveStream(void) +{ + if (dvblinkclient) + return dvblinkclient->PositionLiveStream(); + return -1; +} + +long long LengthLiveStream(void) +{ + if (dvblinkclient) + return dvblinkclient->LengthLiveStream(); + return -1; +} + +void PauseStream(bool bPaused) +{ +} + +bool CanPauseStream(void) +{ + return g_bUseTimeshift; +} + +bool CanSeekStream(void) +{ + return g_bUseTimeshift; +} + +int GetTimersAmount(void) +{ + if (dvblinkclient) + return dvblinkclient->GetTimersAmount(); + + return -1; +} + +PVR_ERROR GetTimers(ADDON_HANDLE handle) +{ + if (dvblinkclient) + return dvblinkclient->GetTimers(handle); + + return PVR_ERROR_FAILED; +} + +PVR_ERROR AddTimer(const PVR_TIMER &timer) +{ + if (dvblinkclient) + return dvblinkclient->AddTimer(timer); + + return PVR_ERROR_FAILED; +} + +PVR_ERROR DeleteTimer(const PVR_TIMER &timer, bool bForceDelete) +{ + if (dvblinkclient) + return dvblinkclient->DeleteTimer(timer); + + return PVR_ERROR_FAILED; +} + +PVR_ERROR UpdateTimer(const PVR_TIMER &timer) +{ + if (dvblinkclient) + return dvblinkclient->UpdateTimer(timer); + + return PVR_ERROR_FAILED; +} + + +int GetRecordingsAmount(void) +{ + if (dvblinkclient) + return dvblinkclient->GetRecordingsAmount(); + + return -1; +} + +PVR_ERROR GetRecordings(ADDON_HANDLE handle) +{ + if (dvblinkclient) + return dvblinkclient->GetRecordings(handle); + + return PVR_ERROR_FAILED; +} + +PVR_ERROR DeleteRecording(const PVR_RECORDING &recording) +{ + if (dvblinkclient) + return dvblinkclient->DeleteRecording(recording); + + return PVR_ERROR_FAILED; +} + +PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY[], int*) +{ + return PVR_ERROR_NOT_IMPLEMENTED; +} + +int GetCurrentClientChannel(void) +{ + if (dvblinkclient) + return dvblinkclient->GetCurrentChannelId(); + + return 0; +} + +bool SwitchChannel(const PVR_CHANNEL &channel) +{ + CloseLiveStream(); + return OpenLiveStream(channel); +} + +PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS &signalStatus) +{ + return PVR_ERROR_NO_ERROR; +} + +/** UNUSED API FUNCTIONS */ + +PVR_ERROR GetStreamProperties(PVR_STREAM_PROPERTIES* pProperties) +{ + return PVR_ERROR_NOT_IMPLEMENTED; +} + + +PVR_ERROR DialogChannelScan(void) +{ + return PVR_ERROR_NOT_IMPLEMENTED; +} + +PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_MENUHOOK_DATA &item) +{ + return PVR_ERROR_NOT_IMPLEMENTED; +} + +PVR_ERROR DeleteChannel(const PVR_CHANNEL &channel) +{ + return PVR_ERROR_NOT_IMPLEMENTED; +} + +PVR_ERROR RenameChannel(const PVR_CHANNEL &channel) +{ + return PVR_ERROR_NOT_IMPLEMENTED; +} + +PVR_ERROR MoveChannel(const PVR_CHANNEL &channel) +{ + return PVR_ERROR_NOT_IMPLEMENTED; +} + +PVR_ERROR DialogChannelSettings(const PVR_CHANNEL &channel) +{ + return PVR_ERROR_NOT_IMPLEMENTED; +} + +PVR_ERROR DialogAddChannel(const PVR_CHANNEL &channel) +{ + return PVR_ERROR_NOT_IMPLEMENTED; +} + +int GetChannelGroupsAmount(void) +{ + return -1; +} + +PVR_ERROR GetChannelGroups(ADDON_HANDLE handle, bool bRadio) +{ + return PVR_ERROR_NOT_IMPLEMENTED; +} + +PVR_ERROR GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group) +{ + return PVR_ERROR_NOT_IMPLEMENTED; +} + + +bool OpenRecordedStream(const PVR_RECORDING &recording) +{ + return false; +} +void CloseRecordedStream(void) +{ +} + +int ReadRecordedStream(unsigned char *pBuffer, unsigned int iBufferSize) +{ + return 0; +} +long long SeekRecordedStream(long long iPosition, int iWhence /* = SEEK_SET */) +{ + return 0; +} + +long long PositionRecordedStream(void) +{ + return -1; +} + +long long LengthRecordedStream(void) +{ + return 0; +} + +void DemuxReset(void) +{ +} + +void DemuxFlush(void) +{ +} + + +PVR_ERROR RenameRecording(const PVR_RECORDING &recording) +{ + return PVR_ERROR_NOT_IMPLEMENTED; +} + +PVR_ERROR SetRecordingPlayCount(const PVR_RECORDING &recording, int count) +{ + return PVR_ERROR_NOT_IMPLEMENTED; +} + +PVR_ERROR SetRecordingLastPlayedPosition(const PVR_RECORDING &recording, int lastplayedposition) +{ + return PVR_ERROR_NOT_IMPLEMENTED; +} + +int GetRecordingLastPlayedPosition(const PVR_RECORDING &recording) +{ + return -1; +} + +void DemuxAbort(void) +{ +} + +DemuxPacket* DemuxRead(void) +{ + return NULL; +} + +unsigned int GetChannelSwitchDelay(void) +{ + return 0; +} + + + +bool SeekTime(int,bool,double*) +{ + return false; +} + +void SetSpeed(int) +{ +} + +time_t GetPlayingTime() { return 0; } +time_t GetBufferTimeStart() { return 0; } +time_t GetBufferTimeEnd() { return 0; } + +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/src/client.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/src/client.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/src/client.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/src/client.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2005-2012 Team XBMC + * http://xbmc.org + + * Copyright (C) 2012 Palle Ehmsen(Barcode Madness) + * http://www.barcodemadness.com + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#pragma once +#include "libXBMC_addon.h" +#include "libXBMC_pvr.h" +#include "libXBMC_gui.h" + +extern bool m_bCreated; + +enum DVBLINK_STREAMTYPE {HTTP=0,RTP=1,HLS =2, ASF=3}; + +/* Client Settings default values */ +#define DEFAULT_HOST "127.0.0.1" +#define DEFAULT_PORT 8080 +#define DEFAULT_TIMEOUT 10 +#define DEFAULT_STREAMTYPE HTTP +#define DEFAULT_CLIENTNAME "xbmc" +#define DEFAULT_USERNAME "" +#define DEFAULT_PASSWORD "" +#define DEFAULT_USECHLHANDLE true +#define DEFAULT_SHOWINFOMSG false +#define DEFAULT_HEIGHT 720 +#define DEFAULT_WIDTH 576 +#define DEFAULT_BITRATE 512 +#define DEFAULT_AUDIOTRACK "eng" +#define DEFAULT_TIMESHIFTBUFFERPATH "special://userdata/addon_data/pvr.dvblink/" +#define DEFAULT_USETIMESHIFT false + +/* Client Settings */ +extern std::string g_szClientname; +extern std::string g_szHostname; +extern long g_lPort; +extern int g_iConnectTimeout; +extern DVBLINK_STREAMTYPE g_szStreamType; +extern std::string g_szUsername; +extern std::string g_szPassword; +extern int g_iHeight; +extern int g_iWidth; +extern int g_iBitrate; +extern std::string g_szAudiotrack; +extern bool g_bUseChlHandle; +extern bool g_bShowInfoMSG; +extern bool g_bUseTimeshift; +extern std::string g_szTimeShiftBufferPath; + + + +extern ADDON::CHelper_libXBMC_addon *XBMC; +extern CHelper_libXBMC_pvr *PVR; + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/src/DVBLinkClient.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/src/DVBLinkClient.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/src/DVBLinkClient.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/src/DVBLinkClient.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,749 @@ +/* + * Copyright (C) 2005-2012 Team XBMC + * http://xbmc.org + + * Copyright (C) 2012 Palle Ehmsen(Barcode Madness) + * http://www.barcodemadness.com + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#include "DVBLinkClient.h" +#include "platform/util/StdString.h" + +using namespace dvblinkremote; +using namespace dvblinkremotehttp; +using namespace ADDON; + +std::string DVBLinkClient::GetBuildInRecorderObjectID() +{ + std::string result = ""; + DVBLinkRemoteStatusCode status; + GetPlaybackObjectRequest getPlaybackObjectRequest(m_hostname.c_str(), ""); + getPlaybackObjectRequest.RequestedObjectType = GetPlaybackObjectRequest::REQUESTED_OBJECT_TYPE_ALL; + getPlaybackObjectRequest.RequestedItemType = GetPlaybackObjectRequest::REQUESTED_ITEM_TYPE_ALL; + getPlaybackObjectRequest.IncludeChildrenObjectsForRequestedObject = true; + GetPlaybackObjectResponse getPlaybackObjectResponse; + if ((status = m_dvblinkRemoteCommunication->GetPlaybackObject(getPlaybackObjectRequest, getPlaybackObjectResponse)) == DVBLINK_REMOTE_STATUS_OK) + { + for (std::vector::iterator it = getPlaybackObjectResponse.GetPlaybackContainers().begin(); it < getPlaybackObjectResponse.GetPlaybackContainers().end(); it++) + { + PlaybackContainer * container = (PlaybackContainer *) *it; + if (strcmp(container->SourceID.c_str(), DVBLINK_BUILD_IN_RECORDER_SOURCE_ID) == 0) + { + result = container->GetObjectID(); + break; + } + + } + } + return result; +} + + + +DVBLinkClient::DVBLinkClient(CHelper_libXBMC_addon *XBMC, CHelper_libXBMC_pvr *PVR,std::string clientname, std::string hostname, long port,bool showinfomsg, std::string username, std::string password, bool usetimeshift, std::string timeshiftpath) +{ + this->PVR = PVR; + this->XBMC = XBMC; + m_clientname = clientname; + m_hostname = hostname; + m_connected = false; + m_currentChannelId = 0; + m_showinfomsg = showinfomsg; + + m_usetimeshift = usetimeshift && XBMC->DirectoryExists(timeshiftpath.c_str()); + + m_timeshiftpath.append(timeshiftpath); + m_timeshiftpath.append(clientname); + + m_httpClient = new HttpPostClient(XBMC,hostname,port, username, password); + m_dvblinkRemoteCommunication = DVBLinkRemote::Connect((HttpClient&)*m_httpClient, m_hostname.c_str(), 8080, username.c_str(), password.c_str()); + + DVBLinkRemoteStatusCode status; + m_timerCount = -1; + m_recordingCount = -1; + + GetChannelsRequest request; + m_channels = new ChannelList(); + m_stream = new Stream(); + m_tsBuffer = NULL; + + if ((status = m_dvblinkRemoteCommunication->GetChannels(request, *m_channels)) == DVBLINK_REMOTE_STATUS_OK) + { + int iChannelUnique = 0; + for (std::vector::iterator it = m_channels->begin(); it < m_channels->end(); it++) + { + Channel* channel = (*it); + m_channelMap[++iChannelUnique] = channel; + } + m_connected = true; + + XBMC->Log(LOG_INFO, "Connected to DVBLink Server '%s'", m_hostname.c_str()); + if (m_showinfomsg) + { + XBMC->QueueNotification(QUEUE_INFO, XBMC->GetLocalizedString(32001), m_hostname.c_str()); + XBMC->QueueNotification(QUEUE_INFO, XBMC->GetLocalizedString(32002), m_channelMap.size()); + } + + m_recordingsid = GetBuildInRecorderObjectID(); + m_recordingsid.append(DVBLINK_RECODINGS_BY_DATA_ID); + + m_updating = true; + CreateThread(); + } + else + { + XBMC->QueueNotification(QUEUE_ERROR, XBMC->GetLocalizedString(32003), m_hostname.c_str(), (int)status); + std::string error; + m_dvblinkRemoteCommunication->GetLastError(error); + XBMC->Log(LOG_ERROR, "Could not connect to DVBLink Server '%s' on port '%i' with username '%s' (Error code : %d Description : %s)", hostname.c_str(), port, username.c_str(), (int)status,error.c_str()); + } +} + +void *DVBLinkClient::Process() +{ + XBMC->Log(LOG_DEBUG, "DVBLinkUpdateProcess:: thread started"); + unsigned int counter = 0; + while (m_updating) + { + if (counter >= 300000) + { + counter = 0; + PVR->TriggerTimerUpdate(); + Sleep(5000); + PVR->TriggerRecordingUpdate(); + } + counter += 1000; + Sleep(1000); + } + XBMC->Log(LOG_DEBUG, "DVBLinkUpdateProcess:: thread stopped"); + return NULL; +} + + +bool DVBLinkClient::GetStatus() +{ + return m_connected; +} + +int DVBLinkClient::GetChannelsAmount() +{ + return m_channelMap.size(); +} + +PVR_ERROR DVBLinkClient::GetChannels(ADDON_HANDLE handle, bool bRadio) +{ + XBMC->Log(LOG_INFO, "Getting channels (%d channels on server)", m_channelMap.size()); + for (std::map::iterator it=m_channelMap.begin(); it!=m_channelMap.end(); ++it) + { + Channel* channel = (*it).second; + + bool isRadio = (channel->GetChannelType() == Channel::CHANNEL_TYPE_RADIO); + + if (isRadio == bRadio) + { + PVR_CHANNEL xbmcChannel; + memset(&xbmcChannel, 0, sizeof(PVR_CHANNEL)); + xbmcChannel.bIsRadio = isRadio; + xbmcChannel.iChannelNumber =channel->Number; + xbmcChannel.iEncryptionSystem = 0; + xbmcChannel.iUniqueId = (*it).first; + + PVR_STRCPY(xbmcChannel.strChannelName,channel->GetName().c_str()); + CStdString stream; + if (!m_usetimeshift) + { + if (isRadio) + stream.Format("pvr://stream/radio/%i.ts", channel->GetDvbLinkID()); + else + stream.Format("pvr://stream/tv/%i.ts", channel->GetDvbLinkID()); + + PVR_STRCPY(xbmcChannel.strStreamURL, stream.c_str()); + PVR_STRCPY(xbmcChannel.strInputFormat, "video/x-mpegts"); + } + + //PVR_STRCPY(xbmcChannel.strIconPath, "special://userdata/addon_data/pvr.dvblink/channel.png"); + PVR->TransferChannelEntry(handle, &xbmcChannel); + } + } + return PVR_ERROR_NO_ERROR; +} + +int DVBLinkClient::GetTimersAmount() +{ + return m_timerCount; +} + + +int DVBLinkClient::GetInternalUniqueIdFromChannelId(const std::string& channelId) +{ + for (std::map::iterator it=m_channelMap.begin(); it!=m_channelMap.end(); ++it) + { + Channel * channel = (*it).second; + int id = (*it).first; + if (channelId.compare(channel->GetID()) == 0) + { + return id; + } + } + return 0; +} + +PVR_ERROR DVBLinkClient::GetTimers(ADDON_HANDLE handle) +{ + PVR_ERROR result = PVR_ERROR_FAILED; + PLATFORM::CLockObject critsec(m_mutex); + + GetSchedulesRequest getSchedulesRequest; + StoredSchedules sschedules; + + DVBLinkRemoteStatusCode status; + int count = 0; + if ((status = m_dvblinkRemoteCommunication->GetSchedules(getSchedulesRequest, sschedules)) != DVBLINK_REMOTE_STATUS_OK) + { + std::string error; + m_dvblinkRemoteCommunication->GetLastError(error); + XBMC->Log(LOG_ERROR, "Could not get timers (Error code : %d Description : %s)", (int)status,error.c_str()); + // XBMC->QueueNotification(QUEUE_ERROR, XBMC->GetLocalizedString(32006), (int)status); + return result; + } + + XBMC->Log(LOG_INFO, "Found %d epg timers", sschedules.GetEpgSchedules().size()); + + if (m_showinfomsg) + { + XBMC->QueueNotification(QUEUE_INFO, XBMC->GetLocalizedString(32007), sschedules.GetEpgSchedules().size()); + } + + for (std::vector::iterator it = sschedules.GetEpgSchedules().begin(); it < sschedules.GetEpgSchedules().end(); it++) + { + StoredEpgSchedule* schedule = (StoredEpgSchedule*)*it; + PVR_TIMER xbmcTimer; + memset(&xbmcTimer, 0, sizeof(PVR_TIMER)); + PVR_STR2INT(xbmcTimer.iClientIndex, schedule->GetID().c_str()); + + xbmcTimer.iClientChannelUid = GetInternalUniqueIdFromChannelId(schedule->GetChannelID()); + xbmcTimer.state = PVR_TIMER_STATE_SCHEDULED; + xbmcTimer.bIsRepeating = schedule->Repeat; + PVR_STR2INT(xbmcTimer.iEpgUid, schedule->GetProgramID().c_str()); + EpgSearchResult epgSearchResult; + if (DoEPGSearch(epgSearchResult,schedule->GetChannelID(), -1, -1, schedule->GetProgramID())) + { + if (epgSearchResult.size() < 1 || epgSearchResult[0]->GetEpgData().size() < 1) + { + XBMC->Log(LOG_INFO, "No EPG program data for timer '%s' on channel '%s' with program id '%s'", schedule->GetID().c_str(),schedule->GetChannelID().c_str(),schedule->GetProgramID().c_str()); + continue; + } + ChannelEpgData * channelepgdata = epgSearchResult[0]; + Program * program = channelepgdata->GetEpgData()[0]; + + xbmcTimer.startTime =program->GetStartTime(); + xbmcTimer.endTime = program->GetStartTime() + program->GetDuration(); + PVR_STRCPY(xbmcTimer.strTitle, program->GetTitle().c_str()); + PVR_STRCPY(xbmcTimer.strSummary, program->ShortDescription.c_str()); + PVR->TransferTimerEntry(handle, &xbmcTimer); + XBMC->Log(LOG_INFO, "Added EPG timer : %s", program->GetTitle().c_str()); + + count++; + } + + } + + XBMC->Log(LOG_INFO, "Found %d manual timers", sschedules.GetManualSchedules().size()); + + if (m_showinfomsg) + { + XBMC->QueueNotification(QUEUE_INFO, XBMC->GetLocalizedString(32008), sschedules.GetManualSchedules().size()); + } + + for (std::vector::iterator it = sschedules.GetManualSchedules().begin(); it < sschedules.GetManualSchedules().end(); it++) + { + StoredManualSchedule* schedule = (StoredManualSchedule*)*it; + PVR_TIMER xbmcTimer; + memset(&xbmcTimer, 0, sizeof(PVR_TIMER)); + PVR_STR2INT(xbmcTimer.iClientIndex, schedule->GetID().c_str()); + + xbmcTimer.iClientChannelUid = GetInternalUniqueIdFromChannelId(schedule->GetChannelID()); + + + xbmcTimer.state = PVR_TIMER_STATE_SCHEDULED; + xbmcTimer.startTime = schedule->GetStartTime(); + xbmcTimer.endTime = schedule->GetStartTime() + schedule->GetDuration(); + PVR_STRCPY(xbmcTimer.strTitle, schedule->Title.c_str()); + //TODO: PAE: Add weekdays + XBMC->Log(LOG_INFO, "Added manual timer : %s", schedule->Title.c_str()); + PVR->TransferTimerEntry(handle, &xbmcTimer); + count++; + } + m_timerCount = count; + result = PVR_ERROR_NO_ERROR; + return result; +} + +PVR_ERROR DVBLinkClient::AddTimer(const PVR_TIMER &timer) +{ + PVR_ERROR result = PVR_ERROR_FAILED; + PLATFORM::CLockObject critsec(m_mutex); + DVBLinkRemoteStatusCode status; + AddScheduleRequest * addScheduleRequest = NULL; + std::string channelId = m_channelMap[timer.iClientChannelUid]->GetID(); + if (timer.iEpgUid != 0) + { + char programId [33]; + PVR_INT2STR(programId,timer.iEpgUid); + addScheduleRequest = new AddScheduleByEpgRequest(channelId, programId, timer.bIsRepeating); + } + else + { + //TODO: Fix day mask + addScheduleRequest = new AddManualScheduleRequest(channelId, timer.startTime, timer.endTime - timer.startTime, -1, timer.strTitle); + } + + if ((status = m_dvblinkRemoteCommunication->AddSchedule(*addScheduleRequest)) == DVBLINK_REMOTE_STATUS_OK) + { + XBMC->Log(LOG_INFO, "Timer added"); + PVR->TriggerTimerUpdate(); + result = PVR_ERROR_NO_ERROR; + } + else + { + result = PVR_ERROR_FAILED; + std::string error; + m_dvblinkRemoteCommunication->GetLastError(error); + XBMC->Log(LOG_ERROR, "Could not add timer (Error code : %d Description : %s)", (int)status, error.c_str()); + } + SAFE_DELETE(addScheduleRequest); + return result; +} + +PVR_ERROR DVBLinkClient::DeleteTimer(const PVR_TIMER &timer) +{ + PVR_ERROR result = PVR_ERROR_FAILED; + PLATFORM::CLockObject critsec(m_mutex); + DVBLinkRemoteStatusCode status; + char scheduleId [33]; + PVR_INT2STR(scheduleId, timer.iClientIndex); + + RemoveScheduleRequest removeSchedule(scheduleId); + + + if ((status = m_dvblinkRemoteCommunication->RemoveSchedule(removeSchedule)) == DVBLINK_REMOTE_STATUS_OK) + { + XBMC->Log(LOG_INFO, "Timer deleted"); + PVR->TriggerTimerUpdate(); + result = PVR_ERROR_NO_ERROR; + } + else + { + std::string error; + m_dvblinkRemoteCommunication->GetLastError(error); + XBMC->Log(LOG_ERROR, "Timer could not be deleted (Error code : %d Description : %s)", (int)status, error.c_str()); + } + return result; +} + +PVR_ERROR DVBLinkClient::UpdateTimer(const PVR_TIMER &timer) +{ + PVR_ERROR deleteResult = DeleteTimer(timer); + if (deleteResult == PVR_ERROR_NO_ERROR) + { + return AddTimer(timer); + } + return deleteResult; +} + +int DVBLinkClient::GetRecordingsAmount() +{ + + return m_recordingCount; +} + + + +std::string DVBLinkClient::GetRecordedTVByDateObjectID(const std::string& buildInRecoderObjectID) +{ + std::string result = ""; + DVBLinkRemoteStatusCode status; + + GetPlaybackObjectRequest getPlaybackObjectRequest(m_hostname.c_str(), buildInRecoderObjectID); + getPlaybackObjectRequest.IncludeChildrenObjectsForRequestedObject = true; + GetPlaybackObjectResponse getPlaybackObjectResponse; + + + if ((status = m_dvblinkRemoteCommunication->GetPlaybackObject(getPlaybackObjectRequest, getPlaybackObjectResponse)) == DVBLINK_REMOTE_STATUS_OK) + { + for (std::vector::iterator it = getPlaybackObjectResponse.GetPlaybackContainers().begin(); it < getPlaybackObjectResponse.GetPlaybackContainers().end(); it++) + { + PlaybackContainer * container = (PlaybackContainer *) *it; + + + // if (strcmp(container->GetName().c_str(), "By Date") == 0) + if (container->GetObjectID().find("F6F08949-2A07-4074-9E9D-423D877270BB") != std::string::npos) + { + result = container->GetObjectID(); + break; + } + } + } + return result; + +} + +PVR_ERROR DVBLinkClient::DeleteRecording(const PVR_RECORDING& recording) +{ + PLATFORM::CLockObject critsec(m_mutex); + PVR_ERROR result = PVR_ERROR_FAILED; + DVBLinkRemoteStatusCode status; + RemovePlaybackObjectRequest remoteObj(recording.strRecordingId); + + if ((status = m_dvblinkRemoteCommunication->RemovePlaybackObject(remoteObj)) != DVBLINK_REMOTE_STATUS_OK) +{ + std::string error; + m_dvblinkRemoteCommunication->GetLastError(error); + XBMC->Log(LOG_ERROR, "Recording %s could not be deleted (Error code: %d Description : %s)", recording.strTitle, (int)status, error.c_str()); + return result; + } + + XBMC->Log(LOG_INFO, "Recording %s deleted", recording.strTitle); + PVR->TriggerRecordingUpdate(); + result = PVR_ERROR_NO_ERROR; + return result; +} + + +PVR_ERROR DVBLinkClient::GetRecordings(ADDON_HANDLE handle) +{ + PLATFORM::CLockObject critsec(m_mutex); + PVR_ERROR result = PVR_ERROR_FAILED; + DVBLinkRemoteStatusCode status; + + GetPlaybackObjectRequest getPlaybackObjectRequest(m_hostname.c_str(), m_recordingsid); + getPlaybackObjectRequest.IncludeChildrenObjectsForRequestedObject = true; + GetPlaybackObjectResponse getPlaybackObjectResponse; + + if ((status = m_dvblinkRemoteCommunication->GetPlaybackObject(getPlaybackObjectRequest, getPlaybackObjectResponse)) != DVBLINK_REMOTE_STATUS_OK) + { + std::string error; + m_dvblinkRemoteCommunication->GetLastError(error); + XBMC->Log(LOG_ERROR,"Could not get recordings (Error code : %d Description : %s)", (int)status, error.c_str()); + //XBMC->QueueNotification(QUEUE_ERROR, XBMC->GetLocalizedString(32004), (int)status); + return result; + } + + XBMC->Log(LOG_INFO, "Found %d recordings", getPlaybackObjectResponse.GetPlaybackItems().size()); + + if (m_showinfomsg) + { + XBMC->QueueNotification(QUEUE_INFO, XBMC->GetLocalizedString(32009), getPlaybackObjectResponse.GetPlaybackItems().size()); + } + + for (std::vector::iterator it = getPlaybackObjectResponse.GetPlaybackItems().begin(); it < getPlaybackObjectResponse.GetPlaybackItems().end(); it++) + { + RecordedTvItem * tvitem = (RecordedTvItem *) *it; + PVR_RECORDING xbmcRecording; + memset(&xbmcRecording, 0, sizeof(PVR_RECORDING)); + + PVR_STRCPY(xbmcRecording.strRecordingId,tvitem->GetObjectID().c_str()); + + PVR_STRCPY(xbmcRecording.strTitle,tvitem->GetMetadata().GetTitle().c_str()); + + xbmcRecording.recordingTime = tvitem->GetMetadata().GetStartTime(); + PVR_STRCPY(xbmcRecording.strPlot, tvitem->GetMetadata().ShortDescription.c_str()); + PVR_STRCPY(xbmcRecording.strStreamURL, tvitem->GetPlaybackUrl().c_str()); + xbmcRecording.iDuration = tvitem->GetMetadata().GetDuration(); + PVR_STRCPY(xbmcRecording.strChannelName, tvitem->ChannelName.c_str()); + PVR_STRCPY(xbmcRecording.strThumbnailPath, tvitem->GetThumbnailUrl().c_str()); + PVR->TransferRecordingEntry(handle, &xbmcRecording); + + } + m_recordingCount = getPlaybackObjectResponse.GetPlaybackItems().size(); + result = PVR_ERROR_NO_ERROR; + return result; +} + +void DVBLinkClient::GetDriveSpace(long long *iTotal, long long *iUsed) +{ + PLATFORM::CLockObject critsec(m_mutex); + GetRecordingSettingsRequest recordingsettingsrequest; + *iTotal = 0; + *iUsed = 0; + RecordingSettings settings; + DVBLinkRemoteStatusCode status; + if ((status = m_dvblinkRemoteCommunication->GetRecordingSettings(recordingsettingsrequest, settings)) == DVBLINK_REMOTE_STATUS_OK) + { + *iTotal = settings.TotalSpace; + *iUsed = settings.AvailableSpace; + } +} + + +int DVBLinkClient::GetCurrentChannelId() +{ + return m_currentChannelId; +} + +const char * DVBLinkClient::GetLiveStreamURL(const PVR_CHANNEL &channel, DVBLINK_STREAMTYPE streamtype, int width, int height, int bitrate, std::string audiotrack) +{ + PLATFORM::CLockObject critsec(m_mutex); + StreamRequest* streamRequest = NULL; + TranscodingOptions options(width, height); + options.SetBitrate(bitrate); + options.SetAudioTrack(audiotrack); + Channel * c = m_channelMap[channel.iUniqueId]; + DVBLinkRemoteStatusCode status; + switch (streamtype) + { + case HTTP: + streamRequest = new RawHttpStreamRequest(m_hostname.c_str(), c->GetDvbLinkID(), m_clientname.c_str()); + break; + case RTP: + streamRequest = new RealTimeTransportProtocolStreamRequest(m_hostname.c_str(), c->GetDvbLinkID(), m_clientname.c_str(), options); + break; + case HLS: + streamRequest = new HttpLiveStreamRequest(m_hostname.c_str(), c->GetDvbLinkID(), m_clientname.c_str(), options); + break; + case ASF: + streamRequest = new WindowsMediaStreamRequest(m_hostname.c_str(), c->GetDvbLinkID(), m_clientname.c_str(), options); + break; + } + + if ((status = m_dvblinkRemoteCommunication->PlayChannel(*streamRequest, *m_stream)) != DVBLINK_REMOTE_STATUS_OK) + { + std::string error; + m_dvblinkRemoteCommunication->GetLastError(error); + XBMC->Log(LOG_ERROR, "Could not get stream for channel %i (Error code : %d)", channel.iUniqueId, (int)status,error.c_str()); + XBMC->QueueNotification(QUEUE_ERROR, XBMC->GetLocalizedString(32010), channel.strChannelName, (int)status); + SAFE_DELETE(streamRequest); + return ""; + } + + m_currentChannelId = channel.iUniqueId; + SAFE_DELETE(streamRequest); + return m_stream->GetUrl().c_str(); +} + +bool DVBLinkClient::OpenLiveStream(const PVR_CHANNEL &channel, DVBLINK_STREAMTYPE streamtype, int width, int height, int bitrate, std::string audiotrack) +{ + if (m_usetimeshift && streamtype == HTTP) + { + if (m_tsBuffer) + { + SAFE_DELETE(m_tsBuffer); + } + m_tsBuffer = new TimeShiftBuffer(XBMC, GetLiveStreamURL(channel, streamtype, width, height, bitrate, audiotrack), m_timeshiftpath); + return m_tsBuffer->IsValid(); + } + return false; +} + +int DVBLinkClient::ReadLiveStream(unsigned char *pBuffer, unsigned int iBufferSize) +{ + if(m_tsBuffer) + return m_tsBuffer->ReadData(pBuffer,iBufferSize); + return 0; +} + +long long DVBLinkClient::SeekLiveStream(long long iPosition, int iWhence) +{ + if(m_tsBuffer) + return m_tsBuffer->Seek(iPosition, iWhence); + return 0; +} + +long long DVBLinkClient::PositionLiveStream(void) +{ + if(m_tsBuffer) + return m_tsBuffer->Position(); + return 0; +} +long long DVBLinkClient::LengthLiveStream(void) +{ + if(m_tsBuffer) + return m_tsBuffer->Length(); + return 0; +} + +void DVBLinkClient::StopStreaming(bool bUseChlHandle) +{ + PLATFORM::CLockObject critsec(m_mutex); + StopStreamRequest * request; + + + if (m_usetimeshift && m_tsBuffer) + { + SAFE_DELETE(m_tsBuffer); + } + + if (bUseChlHandle) + { + request = new StopStreamRequest(m_stream->GetChannelHandle()); + } + else + { + request = new StopStreamRequest(m_clientname); + } + + DVBLinkRemoteStatusCode status; + if ((status = m_dvblinkRemoteCommunication->StopChannel(*request)) != DVBLINK_REMOTE_STATUS_OK) + { + std::string error; + m_dvblinkRemoteCommunication->GetLastError(error); + XBMC->Log(LOG_ERROR, "Could not stop stream (Error code : %d Description : %s)", (int)status, error.c_str()); + } + + + SAFE_DELETE(request); +} + +void DVBLinkClient::SetEPGGenre(Program *program, EPG_TAG *tag) +{ + if (program->IsCatNews) + { + tag->iGenreType = 0x20; + tag->iGenreSubType = 0x00; + } + + if (program->IsCatDocumentary) + { + tag->iGenreType = 0x20; + tag->iGenreSubType = 0x03; + } + + + if (program->IsCatEducational) + { + tag->iGenreType = 0x90; + } + + if (program->IsCatSports) + { + tag->iGenreType = 0x40; + } + + + + + if (program->IsCatMovie) + { + tag->iGenreType = 0x10; + tag->iGenreSubType =program->IsCatThriller ? 0x01 : program->IsCatScifi ? 0x03 :program->IsCatHorror ? 0x03 : program->IsCatComedy ? 0x04 : program->IsCatSoap ? 0x05 : program->IsCatRomance ? 0x06 :program->IsCatDrama ? 0x08 : 0; + } + + if (program->IsCatKids) + { + tag->iGenreType = 0x50; + } + + if (program->IsCatMusic) + { + tag->iGenreType = 0x60; + } + + if (program->IsCatSpecial) + { + tag->iGenreType = 0xB0; + } +} + +bool DVBLinkClient::DoEPGSearch(EpgSearchResult& epgSearchResult, const std::string& channelId, const long startTime, const long endTime, const std::string& programId) +{ + PLATFORM::CLockObject critsec(m_mutex); + EpgSearchRequest epgSearchRequest(channelId, startTime, endTime); + if (programId.compare("") != 0) + { + epgSearchRequest.ProgramID = programId; + } + + DVBLinkRemoteStatusCode status; + + if ((status = m_dvblinkRemoteCommunication->SearchEpg(epgSearchRequest, epgSearchResult)) == DVBLINK_REMOTE_STATUS_OK) + { + return true; + } + return false; +} + +PVR_ERROR DVBLinkClient::GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL& channel, time_t iStart, time_t iEnd) +{ + PVR_ERROR result = PVR_ERROR_FAILED; + PLATFORM::CLockObject critsec(m_mutex); + Channel * c = m_channelMap[channel.iUniqueId]; + EpgSearchResult epgSearchResult; + + if (DoEPGSearch(epgSearchResult,c->GetID(), iStart, iEnd)) + { + for (std::vector::iterator it = epgSearchResult.begin(); it < epgSearchResult.end(); it++) + { + ChannelEpgData* channelEpgData = (ChannelEpgData*)*it; + EpgData& epgData = channelEpgData->GetEpgData(); + for (std::vector::iterator pIt = epgData.begin(); pIt < epgData.end(); pIt++) + { + Program* p = (Program*)*pIt; + EPG_TAG broadcast; + memset(&broadcast, 0, sizeof(EPG_TAG)); + + PVR_STR2INT(broadcast.iUniqueBroadcastId, p->GetID().c_str() ); + broadcast.strTitle = p->GetTitle().c_str(); + broadcast.iChannelNumber = channel.iChannelNumber; + broadcast.startTime = p->GetStartTime(); + broadcast.endTime = p->GetStartTime() + p->GetDuration(); + broadcast.strPlotOutline = p->SubTitle.c_str(); + broadcast.strPlot = p->ShortDescription.c_str(); + + broadcast.strIconPath = p->Image.c_str(); + broadcast.iGenreType = 0; + broadcast.iGenreSubType = 0; + broadcast.strGenreDescription = ""; + broadcast.firstAired = 0; + broadcast.iParentalRating = 0; + broadcast.iStarRating = p->Rating; + broadcast.bNotify = false; + broadcast.iSeriesNumber = 0; + broadcast.iEpisodeNumber = p->EpisodeNumber; + broadcast.iEpisodePartNumber = 0; + broadcast.strEpisodeName = ""; + SetEPGGenre(p, &broadcast); + PVR->TransferEpgEntry(handle, &broadcast); + } + } + result = PVR_ERROR_NO_ERROR; + } + else + { + XBMC->Log(LOG_NOTICE, "Not EPG data found for channel : %s with id : %i", channel.strChannelName, channel.iUniqueId); + } + return result; +} + +DVBLinkClient::~DVBLinkClient(void) +{ + m_updating = false; + if (IsRunning()) + { + StopThread(); + } + + SAFE_DELETE(m_dvblinkRemoteCommunication); + SAFE_DELETE(m_httpClient); + SAFE_DELETE(m_channels); + SAFE_DELETE(m_stream); + if (m_tsBuffer) + { + SAFE_DELETE(m_tsBuffer); + } +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/src/DVBLinkClient.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/src/DVBLinkClient.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/src/DVBLinkClient.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/src/DVBLinkClient.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2005-2012 Team XBMC + * http://xbmc.org + + * Copyright (C) 2012 Palle Ehmsen(Barcode Madness) + * http://www.barcodemadness.com + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#pragma once + +#include "platform/os.h" +#include "libdvblinkremote/dvblinkremote.h" +#include "HttpPostClient.h" +#include "TimeShiftBuffer.h" +#include "xbmc_pvr_types.h" +#include "libXBMC_addon.h" +#include "libXBMC_pvr.h" +#include "client.h" +#include "platform/threads/threads.h" +#include "platform/threads/mutex.h" +#include "platform/util/util.h" +#include + +#define DVBLINK_BUILD_IN_RECORDER_SOURCE_ID "8F94B459-EFC0-4D91-9B29-EC3D72E92677" +#define DVBLINK_RECODINGS_BY_DATA_ID "F6F08949-2A07-4074-9E9D-423D877270BB" + + + +class DVBLinkClient : public PLATFORM::CThread +{ +public: + DVBLinkClient(ADDON::CHelper_libXBMC_addon *XBMC, CHelper_libXBMC_pvr *PVR, std::string clientname, std::string hostname, long port, bool showinfomsg, std::string username, std::string password, bool usetimeshift, std::string timeshiftpath); + ~DVBLinkClient(void); + int GetChannelsAmount(); + PVR_ERROR GetChannels(ADDON_HANDLE handle, bool bRadio); + PVR_ERROR GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL& channel, time_t iStart, time_t iEnd); + int GetRecordingsAmount(); + PVR_ERROR GetRecordings(ADDON_HANDLE handle); + PVR_ERROR DeleteRecording(const PVR_RECORDING& recording); + int GetTimersAmount(); + PVR_ERROR GetTimers(ADDON_HANDLE handle); + PVR_ERROR AddTimer(const PVR_TIMER &timer); + PVR_ERROR DeleteTimer(const PVR_TIMER &timer); + PVR_ERROR UpdateTimer(const PVR_TIMER &timer); + bool GetStatus(); + const char * GetLiveStreamURL(const PVR_CHANNEL &channel, DVBLINK_STREAMTYPE streamtype, int width, int height, int bitrate, std::string audiotrack); + bool OpenLiveStream(const PVR_CHANNEL &channel, DVBLINK_STREAMTYPE streamtype, int width, int height, int bitrate, std::string audiotrack); + void StopStreaming(bool bUseChlHandle); + int GetCurrentChannelId(); + void GetDriveSpace(long long *iTotal, long long *iUsed); + long long SeekLiveStream(long long iPosition, int iWhence); + long long PositionLiveStream(void); + long long LengthLiveStream(void); + int ReadLiveStream(unsigned char *pBuffer, unsigned int iBufferSize); + +private: + bool DoEPGSearch(dvblinkremote::EpgSearchResult& epgSearchResult, const std::string& channelId, const long startTime, const long endTime, const std::string & programId = ""); + void SetEPGGenre(dvblinkremote::Program *program, EPG_TAG *tag); + std::string GetBuildInRecorderObjectID(); + std::string GetRecordedTVByDateObjectID(const std::string& buildInRecoderObjectID); + int GetInternalUniqueIdFromChannelId(const std::string& channelId); + virtual void * Process(void); + + HttpPostClient* m_httpClient; + dvblinkremote::IDVBLinkRemoteConnection* m_dvblinkRemoteCommunication; + bool m_connected; + std::map m_channelMap; + dvblinkremote::Stream * m_stream; + int m_currentChannelId; + dvblinkremote::ChannelList* m_channels; + long m_timerCount; + long m_recordingCount; + PLATFORM::CMutex m_mutex; + CHelper_libXBMC_pvr *PVR; + ADDON::CHelper_libXBMC_addon *XBMC; + DVBLINK_STREAMTYPE m_streamtype; + std::string m_clientname; + std::string m_hostname; + TimeShiftBuffer *m_tsBuffer; + std::string m_timeshiftpath; + bool m_usetimeshift; + bool m_showinfomsg; + bool m_updating; + std::string m_recordingsid; +}; + +/*! + * @brief PVR macros + */ +#define PVR_STRCPY(dest, source) do { strncpy(dest, source, sizeof(dest)-1); dest[sizeof(dest)-1] = '\0'; } while(0) +#define PVR_STRCLR(dest) memset(dest, 0, sizeof(dest)) +#define PVR_INT2STR(dest, source) sprintf(dest, "%d", source) +#define PVR_STR2INT(dest, source) dest = atoi(source) diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/src/HttpPostClient.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/src/HttpPostClient.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/src/HttpPostClient.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/src/HttpPostClient.cpp 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,251 @@ +/* + * Copyright (C) 2005-2012 Team XBMC + * http://xbmc.org + + * Copyright (C) 2012 Palle Ehmsen(Barcode Madness) + * http://www.barcodemadness.com + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#include "HttpPostClient.h" +#include "base64.h" + +using namespace dvblinkremotehttp; +using namespace ADDON; + +#ifdef TARGET_WINDOWS + #pragma warning(disable:4005) // Disable "warning C4005: '_WINSOCKAPI_' : macro redefinition" + #include + #pragma warning(default:4005) + #define close(s) closesocket(s) +#else + #include + #include + #include + #include + #include +#endif + + + +#define SEND_RQ(MSG) \ + /*cout<> 4), *pbuf++ = to_hex(*pstr & 15); + pstr++; + } + *pbuf = '\0'; + return buf; +} + +HttpPostClient::HttpPostClient(CHelper_libXBMC_addon *XBMC, const std::string& server, const int serverport, const std::string& username, const std::string& password) +{ + this->XBMC = XBMC; + m_server = server; + m_serverport = serverport; + m_username = username; + m_password = password; +} + +int HttpPostClient::SendPostRequest(HttpWebRequest& request) +{ + std::string buffer; + std::string message; + char content_header[100]; + + buffer.append("POST /cs/ HTTP/1.0\r\n"); + sprintf(content_header,"Host: %s:%d\r\n",m_server.c_str(),(int)m_serverport); + buffer.append(content_header); + buffer.append("Content-Type: application/x-www-form-urlencoded\r\n"); + if (m_username.compare("") != 0) + { + sprintf(content_header,"%s:%s",m_username.c_str(),m_password.c_str()); + sprintf(content_header, "Authorization: Basic %s\r\n",base64_encode((const char*)content_header,strlen(content_header)).c_str()); + buffer.append(content_header); + } + sprintf(content_header,"Content-Length: %ld\r\n",request.ContentLength); + buffer.append(content_header); + buffer.append("\r\n"); + buffer.append(request.GetRequestData()); + + #ifdef TARGET_WINDOWS + { + WSADATA WsaData; + WSAStartup(0x0101, &WsaData); + } + #endif + + sockaddr_in sin; + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock == -1) + { + return -100; + } + sin.sin_family = AF_INET; + sin.sin_port = htons((unsigned short)m_serverport); + + struct hostent * host_addr = gethostbyname(m_server.c_str()); + if (host_addr==NULL) + { + return -103; + } + sin.sin_addr.s_addr = *((int*)*host_addr->h_addr_list) ; + + if (connect(sock, (const struct sockaddr *)&sin, sizeof(sockaddr_in)) == -1 ) + { + return -101; + } + + SEND_RQ(buffer.c_str()); + + char c1[1]; + int l,line_length; + bool loop = true; + bool bHeader = false; + + + while (loop) + { + l = recv(sock, c1, 1, 0); + if (l<0) loop = false; + if (c1[0]=='\n') + { + if (line_length == 0) + loop = false; + line_length = 0; + if (message.find("401 Unauthorized") != std::string::npos) + { + close(sock); + return -401; + } + if (message.find("200 OK") != std::string::npos) + bHeader = true; + } + else if (c1[0]!='\r') + { + line_length++; + } + message += c1[0]; + } + + message=""; + if (bHeader) + { + char p[1024]; + while ((l = recv(sock,p,1023,0)) > 0) { + p[l] = '\0'; + message += p; + } + } + else + { + close(sock); + return -102; + } + + //TODO: Use xbmc file code when it allows to post content-type application/x-www-form-urlencoded and authentication + /* + void* hFile = XBMC->OpenFileForWrite(request.GetUrl().c_str(), 0); + if (hFile != NULL) + { + + int rc = XBMC->WriteFile(hFile, buffer.c_str(), buffer.length()); + if (rc >= 0) + { + std::string result; + result.clear(); + char buffer[1024]; + while (XBMC->ReadFileString(hFile, buffer, 1023)) + result.append(buffer); + + } + else + { + XBMC->Log(LOG_ERROR, "can not write to %s",request.GetUrl().c_str()); + } + + XBMC->CloseFile(hFile); + } + else + { + XBMC->Log(LOG_ERROR, "can not open %s for write", request.GetUrl().c_str()); + } + + */ + m_responseData.clear(); + m_responseData.append(message); + close(sock); + + return 200; +} + +bool HttpPostClient::SendRequest(HttpWebRequest& request) +{ + m_lastReqeuestErrorCode = SendPostRequest(request); + return (m_lastReqeuestErrorCode == 200); +} + +HttpWebResponse* HttpPostClient::GetResponse() +{ + if (m_lastReqeuestErrorCode != 200) + { + return NULL; + } + HttpWebResponse* response = new HttpWebResponse(200, m_responseData); + return response; +} + +void HttpPostClient::GetLastError(std::string& err) +{ + +} + +void HttpPostClient::UrlEncode(const std::string& str, std::string& outEncodedStr) +{ + char* encodedstring = url_encode(str.c_str()); + outEncodedStr.append(encodedstring); + free(encodedstring); +} + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/src/HttpPostClient.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/src/HttpPostClient.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/src/HttpPostClient.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/src/HttpPostClient.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2005-2012 Team XBMC + * http://xbmc.org + + * Copyright (C) 2012 Palle Ehmsen(Barcode Madness) + * http://www.barcodemadness.com + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#include "libdvblinkremote/dvblinkremote.h" +#include "libdvblinkremote/dvblinkremotehttp.h" +#include "libXBMC_addon.h" + +class HttpPostClient : public dvblinkremotehttp::HttpClient +{ +public : + bool SendRequest(dvblinkremotehttp::HttpWebRequest& request); + dvblinkremotehttp::HttpWebResponse* GetResponse(); + void GetLastError(std::string& err); + void UrlEncode(const std::string& str, std::string& outEncodedStr); + HttpPostClient(ADDON::CHelper_libXBMC_addon *XBMC, const std::string& server, const int serverport, const std::string& username, const std::string& password); + +private : + int SendPostRequest(dvblinkremotehttp::HttpWebRequest& request); + std::string m_server; + long m_serverport; + std::string m_username; + std::string m_password; + ADDON::CHelper_libXBMC_addon *XBMC; + std::string m_responseData; + int m_lastReqeuestErrorCode; + +}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/src/TimeShiftBuffer.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/src/TimeShiftBuffer.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/src/TimeShiftBuffer.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/src/TimeShiftBuffer.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2005-2012 Team XBMC + * http://xbmc.org + + * Copyright (C) 2012 Palle Ehmsen(Barcode Madness) + * http://www.barcodemadness.com + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + + +#include "TimeShiftBuffer.h" +using namespace ADDON; + +TimeShiftBuffer::TimeShiftBuffer(CHelper_libXBMC_addon * XBMC, std::string streampath, std::string bufferpath) +{ + this->XBMC = XBMC; + + m_bufferPath = bufferpath; + m_streamHandle = XBMC->OpenFile(streampath.c_str(), 0); + m_filebufferWriteHandle = XBMC->OpenFileForWrite(m_bufferPath.c_str(),true); + Sleep(100); + m_filebufferReadHandle = XBMC->OpenFile(m_bufferPath.c_str(), 0); + m_shifting = true; + CreateThread(); +} + + +bool TimeShiftBuffer::IsValid() +{ + return (m_streamHandle != NULL); +} + +void TimeShiftBuffer::Stop() +{ + m_shifting = false; +} + +TimeShiftBuffer::~TimeShiftBuffer(void) +{ + Stop(); + if (IsRunning()) + { + StopThread(); + } + + if (m_filebufferWriteHandle) + { + XBMC->CloseFile(m_filebufferWriteHandle); + } + if (m_filebufferReadHandle) + { + XBMC->CloseFile(m_filebufferReadHandle); + } + if (XBMC->FileExists(m_bufferPath.c_str(), true)) + { + XBMC->DeleteFile(m_bufferPath.c_str()); + } + + if (m_streamHandle) + { + XBMC->CloseFile(m_streamHandle); + } +} + +void *TimeShiftBuffer::Process() +{ + XBMC->Log(LOG_DEBUG, "TimeShiftProcess:: thread started"); + byte buffer[STREAM_READ_BUFFER_SIZE]; + int bytesRead = STREAM_READ_BUFFER_SIZE; + + while (m_shifting) + { + bytesRead = XBMC->ReadFile(m_streamHandle, buffer, sizeof(buffer)); + XBMC->WriteFile(m_filebufferWriteHandle,buffer,bytesRead); + } + XBMC->Log(LOG_DEBUG, "TimeShiftProcess:: thread stopped"); + return NULL; +} + + +long long TimeShiftBuffer::Seek(long long iPosition, int iWhence) +{ + if (m_filebufferReadHandle) + return XBMC->SeekFile(m_filebufferReadHandle,iPosition,iWhence); + return 0; +} + +long long TimeShiftBuffer::Position() +{ + if (m_filebufferReadHandle) + return XBMC->GetFilePosition(m_filebufferReadHandle); + return 0; +} + +long long TimeShiftBuffer::Length() +{ + if (m_filebufferReadHandle) + return XBMC->GetFileLength(m_filebufferReadHandle); + return 0; +} + +int TimeShiftBuffer::ReadData(unsigned char *pBuffer, unsigned int iBufferSize) +{ + unsigned int totalReadBytes = 0; + unsigned int totalTimeWaited = 0; + if (m_filebufferReadHandle) + { + unsigned int read = XBMC->ReadFile(m_filebufferReadHandle, pBuffer,iBufferSize); + totalReadBytes += read; + + while (read < iBufferSize && totalTimeWaited < BUFFER_READ_TIMEOUT) + { + Sleep(BUFFER_READ_WAITTIME); + totalTimeWaited += BUFFER_READ_WAITTIME; + read = XBMC->ReadFile(m_filebufferReadHandle, pBuffer,iBufferSize - totalReadBytes); + totalReadBytes += read; + } + + if(totalTimeWaited > BUFFER_READ_TIMEOUT) + { + XBMC->Log(LOG_DEBUG, "Timeshifterbuffer timed out, waited : %d", totalTimeWaited); + } + } + return totalReadBytes; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/src/TimeShiftBuffer.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/src/TimeShiftBuffer.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvblink/src/TimeShiftBuffer.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/src/TimeShiftBuffer.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2005-2012 Team XBMC + * http://xbmc.org + + * Copyright (C) 2012 Palle Ehmsen(Barcode Madness) + * http://www.barcodemadness.com + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#pragma once + +#ifdef TARGET_WINDOWS +#define DeleteFile DeleteFileA +#endif + +#include "libXBMC_addon.h" +#include "platform/util/StdString.h" +#include "libdvblinkremote/dvblinkremote.h" +#include "platform/threads/threads.h" +#include "platform/util/util.h" + +#define STREAM_READ_BUFFER_SIZE 8192 +#define BUFFER_READ_TIMEOUT 10000 +#define BUFFER_READ_WAITTIME 50 + +class TimeShiftBuffer : public PLATFORM::CThread +{ +public: + TimeShiftBuffer(ADDON::CHelper_libXBMC_addon * XBMC, std::string streampath, std::string bufferpath); + ~TimeShiftBuffer(void); + int ReadData(unsigned char *pBuffer, unsigned int iBufferSize); + bool IsValid(); + long long Seek(long long iPosition, int iWhence); + long long Position(); + long long Length(); + void Stop(void); +private: + virtual void * Process(void); + + std::string m_bufferPath; + void * m_streamHandle; + void * m_filebufferReadHandle; + void * m_filebufferWriteHandle; + bool m_shifting; + ADDON::CHelper_libXBMC_addon * XBMC; +}; + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/addon.xml.in xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/addon.xml.in --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/addon.xml.in 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/addon.xml.in 2014-05-04 07:03:11.000000000 +0000 @@ -1,108 +1,165 @@ + provider-name="jdembski, A600, Manuel Mausz, Portisch"> - + XBMC se voorprogram vir DVBViewer XBMC's frontend for DVBViewer + XBMC клиент за DVBViewer + Frontal de l'XBMC pel DVBViewer Rozhraní XBMC pro DVBViewer + Blaen XBMC ar gyfer DVBViewer XBMC's frontend til DVBViewer - XBMC's Frontend für DVBViewer - Frontend του XBMC για το DVBViewer + XBMC-Oberfläche für DVBViewer + Το frontend του XBMC για το DVBViewer XBMC's frontend for DVBViewer + XBMC's frontend for DVBViewer Frontend de XBMC para DVBViewer Frontend de XBMC para DVBViewer + XBMC esi DVBViewer'ile Client XBMC pour DVBViewer + Frontal XBMC pour DVBViewer Interface de XBMC para DVBViewer ממשק קדמי של XBMC עבור DVBViewer + DVBViewer pozadinski softver za XBMC XBMC DVBViwer előtér-kiszolgáló + Frontend XBMC untuk DVBViewer Frontend XBMC per DVBViewer DVBViewer 用 XBMC フロントエンド + XBMC's სამომხმარებლო მხარე DVBViewer-თვის DVBViewer XBMC 프론트엔드 + XBMC galasistēma DVBViewer XBMC's интерфејс за DVBViewer - XBMC's frontend voor DVBViewer - Interfejs XBMC dla DVBViewer + Bahagian hadapan XBMC untuk DVBViewer + XBMC's Frontend voor DVBViewer + XBMC sitt frontend for DVBViewer + Klient XBMC dla DVBViewer Frontend XBMC para DVBViewer XBMC's frontend para DVBViewer Interfața XBMC pentru DVBViewer Фронтэнд XBMC для DVBViewer XBMC rozhranie pre DVBViewer XBMC-jev vmesnik za DVBViewer - XBMC's frontend för DVBViewer + "Frontend'i" i XBMC'së për DVBViewer + Интерфејс XBMC-а за DVBViewer + XBMCs gränssnitt för DVBViewer + DVBViewer காண XBMC முன்நிலை + DVBViewer için XBMC'nin ön ucu + Надбудова XBMC для переглядача DVBViewer + Giao tiếp của XBMC cho DVBViewer XBMC 的 DVBViewer 前端 + XBMC的前端DVBViewer DVBViewer Opname Diens voorprogram; ondersteun stroom van lewendige TV, Tydhouers, Opnames & EPG. Om die XML uittree vanaf die RS webkoppelvlak te ontleed word die xmlParser biblioteek gebruik, ontwikkel deur Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Baie dankie hiervoor! DVBViewer Recording Service frontend; supporting streaming of LiveTV, Timers, Recordings & EPG. For parsing the XML output from the RS webinterface it uses the xmlParser library developed by Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Many thanks for this! + DVBViewer клиентска услуга за записване. Поддържа стрийминг и записване на телевизия, броячи и електронен програмен справочник. За разбор на XML изхода от RS уеб интерфейс, използва библиотеката xmlParser разработена от Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Благодарим му за това! + Frontal del servei d'enregistrament del DVBViewer; suportant transmissió de TV en viu, temporitzadors, enregistraments i EPG. Per analitzar la sortida XML de la interfície web RS utilitza la llibreria xmlParser desenvolupada per Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Moltes gràcies! Rozhraní služby nahrávek DVBViewer. Podporuje proudové vysílání živého vysílání, nahrávky a EPG. Pro zpracování výstupu XML z webového rozhraní RS používá knihovnu xmlParser, kterou vyvinul Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Za to mnohokrát děkujeme. - DVBViewer Recording Service frontend; Understøtter streaming af Direkte TV, Timere, Optagelser og EPG. For parsing af XML output fra RS webinterface bruges xmlParser biblioteket, der er udviklet af Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Mange tak for dette!\n - DVBViewer Aufnahme Service Frontend; Unterstützt Streamen von LiveTV, Timer, Aufnahmen & EPG. Für das Parsen der XML Ausgabe vom RS Web Interface nutzt es die xmlParser Bibliothek, entwickelt von Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Vielen Dank dafür! + Blaen DBViewer Recording Service; cynnal ffrydio Teledu Byw, Amseryddion, Recordio acAmserlenydd. Ar gyfer didoli allbwn XML o ryngwyneb RS mae'n defnyddio llyfrgell xmlParser ddatblygwyd gan Frank Vanden Berghen ( http://www.applied-mathematics.net/tools/xmlParser.html). Diolch yn fawr am hyn! + DVBViewer Recording Service frontend; Understøtter streaming af Direkte TV, Timere, Optagelser og EPG. For parsing af XML output fra RS webinterface bruges xmlParser biblioteket, der er udviklet af Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Mange tak for dette! + Oberfläche für den DVBViewer-Aufnahmedienst; Unterstützt Live TV & Aufnahmen, Timer und EPG. Für das Parsen der XML-Ausgabe der RS-Weboberfläche nutzt es die xmlParser-Bibliothek, entwickelt von Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Vielen Dank dafür!⏎ Frontend για την Υπηρεσία Εγγραφών του DVBViewer. Υποστηρίζει ροές Live TV, Χρονοδιακόπτες, Εγγραφές & EPG. Για την ανάλυση του XML αρχείου εξόδου από την RS διεπαφή ιστού χρησιμοποιείται η βιβλιοθήκη xmlParser που αναπτύχθηκε από τον Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Θερμές ευχαριστίες για αυτό! DVBViewer Recording Service frontend; supporting streaming of LiveTV, Timers, Recordings & EPG. For parsing the XML output from the RS webinterface it uses the xmlParser library developed by Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Many thanks for this! + DVBViewer Recording Service frontend; supporting streaming of LiveTV, Timers, Recordings & EPG. For parsing the XML output from the RS webinterface it uses the xmlParser library developed by Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Many thanks for this! Frontend del Servicio de Grabaciones de DVBViewer; soportando transmisión de TV en Vivo, Temporizadores, Grabaciones y Guía de Programas. Para analizar la salida XML de la interfaz Web RS usa la librería xmlParser desarrollada por Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html).⏎ Frontend del Servicio de Grabaciones de DVBViewer; soportando transmisión de TV en Vivo, Temporizadores, Grabaciones y Guía de Programas. Para analizar la salida XML de la interfaz Web RS usa la librería xmlParser desarrollada por Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). ¡Mucas gracias por esto!⏎ + DVBViewer salvestus serveri esi; toetab televisiooni striimimist, salvestamist ja elektroonilist saatekava. RS veebilehe XML väljundi parsimiseks kasutatakse Frank Vanden Berghen poolt arendatud xmlParser teeki (http://www.applied-mathematics.net/tools/xmlParser.html). Palju tänu selle eest! Client pour le Service d'Enregistrement DVBViewer; supporte la diffusion de la TV en direct, les programmations, les enregistrements et l'EPG. Utilise la librairie xmlParser développée par Frank Vanden Berghen pour l'interprétation de la sortie XML de l'interface web du SE (http://www.applied-mathematics.net/tools/xmlParser.html). - Servizo da interface de gravación de DVBViewer, soporta a transmisión de TV ao vivo, temporizadores, gravacións e EPG. Para analizar a saída do XML da interface web RS fai uso da librería xmlParser desenrrolada por Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Moitas Grazas! + Frontal du service d'enregistrement de DVBViewer prenant en charge la lecture en transit des télés en direct, les minuteries, les enregistrements, et le GÉP. Pour analyser la sortie XML de l'interface Web du service d'enregistrement, il utilise la bibliothèque xmlParser développée par Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Un grand merci pour ceci! + Servizo da interface de gravación de DVBViewer, soporta a transmisión de TV ao vivo, temporizadores, gravacións e Guía. Para analizar a saída do XML da interface web RS fai uso da librería xmlParser desenrrolada por Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Moitas Grazas! נגן DVB ממשק קידמי של שרת הקלטה;תומך בהזרמת שידורים חיים של טלויזיה,מתזמני הקלטות ולוחות שידורים.לניתוח פלט של XML ממשק אינטרנט RS משתמש בסיפרית xmlPreser שפותחה ע"י פראנק ודן ברגן (http://www.applied-mathematics.net/tools/xmlParser.html).הרבה תודה על כך!⏎ + DVBViewer pozadinski softver usluge snimanja; podržava stremanje televizije, zakazana snimanja, snimanje i EPG. Za prikupljanje podataka iz XML datoteka sa RS web sučelja koristi xmlParser zbirku koju je razvio Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html).Puno hvala za ovo!⏎ DVBViwer felvétel szolgáltatás előtér-kiszolgáló, ami támogatja az élő TV adások sugárzását, időzítések hozzáadását, felvételek készítését és EPG adatok kezelését. + Frontend Layanan Perekaman DVBViewer; Mendukung pengaliran TV secara langsung, Timer, Perekaman dan EPG. Untuk mengolah keluaran XML dari antar-muka web RS, akan menggunakan pustaka xmlParser yang dikembangkan oleh Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Terimakasih untuk hal tersebut! Frontend del servizio di registrazione DVBViewer; supporta lo streaming LiveTV, i timer, la registrazione e l'EPG. Per scansionare l'output XML dell'interfaccia web RS viene utilizzata la libreria xmlParser sviluppata da Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Molte grazie per questo! DVBViewer 録画サービスのフロントエンドです。LiveTV のストリーミング視聴、タイマー、録画、EPG をサポートしています。RS web インターフェースの XML 出力の読み込みには Frank Vanden Berghen 氏の開発した xmlParser ライブラリ (http://www.applied-mathematics.net/tools/xmlParser.html) を使用しています。ありがとうございます! + DVBViewer ჩაწერის სერვისის სამომხმარებლო მხარე ; მხარს უჭერს LiveTV-ის სტრიმინგს, თაიმერებს, ჩანაწერებს და EPG-ს. XML-სი გამოსავლის RS ვებ-ინტერფეისიდან გამოიყენება xmlParser ბიბლიოთეკა რომელიც Frank Vanden Berghen-მა შექმნა (http://www.applied-mathematics.net/tools/xmlParser.html). რისთვისაც უღრმესი მადლობა! DVBViewer 녹화 서비스 프론트엔드; 라이브 TV 스트리밍, 녹화, EPG 지원. RS 웹인터페이스에서 XML을 추출하기 위해 Frank Vanden Berghen이 개발한 xmlParser를 이용합니다 (http://www.applied-mathematics.net/tools/xmlParser.html). Many thanks for this! + DVBViewer Recording Service galasistēma; atbalsta tiešraides TV straumēšanu, taimerus, ierakstus un EPG. Lai analizētu XML izvadi no RS tīmekļa saskarnes, tas izmanto xmlParser bibliotēku, kuru izstrādājis Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Liels paldies par to! DVBViewer Recording Service frontend; supporting streaming of LiveTV, Timers, Recordings & EPG. For parsing the XML output from the RS webinterface it uses the xmlParser library developed by Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Many thanks for this! - DVBViewer Recording Service frontend; ondersteunt het streamen van LiveTV, Timers, Opnames & EPG. Voor het parsen van de XML output van de RS webinterface wordt gebruik gemaakt van de xmlparser library ontwikkeld door Frank vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Veel dank hiervoor!\n - Interfejs usługi nagrań DVBViwer; wspiera strumieniowe oglądanie TV na żywo, wyłączniki czasowe, nagrywanie oraz EPG. Do parsowania XML wyjście z interfejsu WWW RS wykorzystuje bibliotekę XMLParser opracowaną przez Franka Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Wielkie dzięki za to! + Bahagian hadapan perkhidmatan Rakaman DVBViewer; menyokong penstriman bagi TV Langsung, Pemasa, Rakaman & EPG. Untuk menghurai output XML dari webinterface RS ia gunakan pustaka penghurai xml yang dibangunkan oleh Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Terima kasih!⏎ + DVBViewer opnamen service frontend; ondersteunt streaming van LiveTV, Timers, opnamen& EPG. Voor parsing de XML output van de RS webinterface gebruikt het de xmlParser bibliotheek ontwikkelt door Frank van den Berghen (http://www.applied-mathematics.net/tools/xmlParser.html) Hartelijk bedankt voor dit! + DVBViewer Recording Service frontend; støtter streaming av live TV, timere, Opptak og EPG. For å legge til XML utdata fra RS webinterface bruker det xmlParser bibloteket laget av Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Mange takk for dette! + Klient usługi DVBViewer Recording Service. Wspiera strumieniowanie kanałów telewizyjnych, nagrywanie, planowanie nagrań oraz funkcje przewodnika TV. Do parsowania plików XML udostępnianych przez interfejs webowy usługi, wykorzystuje bibliotekę xmlParser opracowaną przez Franka Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Wielkie dzięki za to! Frontend para o serviço de gravação DVBViewer; permite transmissão ao vivo de LiveTV, temporizadores, gravações e EPG. Para análise do XML emitido da webinterface RS, é utilizada a biblioteca xmlParser de Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Mil obrigados por isso! DVBViewer frontend Serviço de gravações, suporta streaming de TV ao Vivo, Agendamentos, Gravações e EPG. Para analisar a saída XML do RS webinterface ele usa a biblioteca XmlParser desenvolvido por Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Muito obrigado por isso! - DVBViewer serviciu interfață de înregistrare; suporta streaming de LiveTV, Timers, Înregistrări și EPG. Pentru parsarea XML din webinterface RS se folosește biblioteca xmlParser dezvoltat de Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Multe mulțumiri pentru asta!\n + DVBViewer serviciu interfață de înregistrare; suporta streaming de LiveTV, Timers, Înregistrări și EPG. Pentru parsarea XML din webinterface RS se folosește biblioteca xmlParser dezvoltat de Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Multe mulțumiri pentru asta! Фронтэнд сервиса записи DVBViewer; поддерживает потоковое вещание ТВ, таймеры, запись и ЕПГ. Для разбора XML-вывода RS-интерфейса использует библиотеку xmlParser, написанную Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). За что благодарим его!⏎ Rozhranie pre spoluprácu s nahrávacou službou aplikácie DVBViewer; podporuje streamovanie živej televízie, časovače, nahrávky a EPG. Na získavanie dát zo XML výstupu z RS webového rozhrania používa knižnicu xmlParser, ktorú vyvinul Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Za to mu veľmi ďakujeme! - Vmesnik za DVBViewer; podpira pretakanje televizije v živo, časovnike, snemanje & EPG. Za branje zapisa XML s spletnega vmesnika RS uporablja knjižnico xmlParser avtorja Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Hvala za to! - DVBViewer inspelningsservice-frontend; stödjer strömmning av direktsänd TV, timers, inspelningar & EPG. För analysering av XML-utdata från RS-webbgränssnitt använder det xmlParser-biblioteket utvecklat av Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Många tack för detta! - DVBViewer Recording Service 前端; 支持直播电视的流媒体转发,定时器,录像及电子节目表。RS web 接口的 XML 结果解析采用 xmlParser 库,由 Frank Vanden Berghen 开发(http://www.applied-mathematics.net/tools/xmlParser.html)。感谢作者! + Vmesnik za DVBViewer; podpira pretakanje televizije v živo, časovnike, snemanje & EPG. Za branje zapisa XML s spletnega vmesnika RS uporablja knjižnico xmlParser avtorja Franka Vanden Berghena (http://www.applied-mathematics.net/tools/xmlParser.html). Hvala za to! + DVBViewer Recording Service frontend; përkrahën transmetimin té LiveTV, Orarin, Regjistrime & EPG. Për të bërë "parsing" i XML prej RS "webinterface'it" ky përdorën bibliotekën të "xmlParser'it" që është zhvilluar nga Frank van den Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Many thanks for this!. Shum i falemnderohemi! + Интерфејс за услугу снимања DVBViewer-а; подржава емитовање телевизије уживо, бројаче, снимање и програмски водич (EPG). Користи библиотеку xmlParser коју је развио Франк Фанден Берген за рашчлањивање XML датотека из RS веб интерфејса (http://www.applied-mathematics.net/tools/xmlParser.html). Хвала много на овоме! + DVBViewers gränssnitt för inspelningstjänst, stödjer strömning av direktsänd TV, timers, inspelningar och EPG. För att tolka XML-data från RS-webbgränssnitt använder den biblioteket xmlParser utvecklat av Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Många tack för detta! + DVBViewer பதிவு சேவை முன்னிலை: லைவ் டிவி & பதிவுகளின் ஸ்ட்ரீமிங், EPG கேட்கவும் துணைபுரிகிறது. RS வலை இடைமுகத்திலிருந்து XML வெளியீடு பாகுபடுத்துவதற்கு xmlParser நூலகத்தை பயன்படுத்துகிறது. அதை தயாரித்த Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html) மிக்க நன்றி + DVBViewer Recording Service frontend; LiveTV yayınını, zamanlayıcıları, kayıtları ve EPGları destekler. RS web arayüzünden XML çıktısı almak için Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html) tarafından geliştirilmiş xmlParser kütüphanesini kullanır. Bunun için kendisine teşekkür ediyoruz! + Накладка на сервіс запису DVBViewer'а; підтримує потокове LiveTV, таймери, запис та телегід. Для обробки виводу XML з RS веб-інтерфейсу використовує бібліотеку xmlParser, розроблену Франком Ванденом Бергеном (http://www.applied-mathematics.net/tools/xmlParser.html). Велика подяка йому за це! + Giao tiếp DVBViewer Recording Service; hỗ trợ phát streaming LiveTV, hẹn giờ, thu chương trình và hiển thị lịch chiếu (EPG). Sử dụng trích xuất XML từ RS webinterface dựa trên thư viện xmlParser phát triển bởi Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html). Xin cảm ơn rất nhiều! + DVBViewer 录像服务前端。支持直播电视流媒体、定时器、录像及电子节目单。RS web 接口的 XML 结果解析采用 xmlParser 库,由 Frank Vanden Berghen 开发(http://www.applied-mathematics.net/tools/xmlParser.html)。感谢作者! + DVBViewer錄影服務前端;支援電視直播串流,計時器,錄影以及電子節目表功能。為了解析從RS Web界面的XML輸出,它使用由Frank Vanden Berghen (http://www.applied-mathematics.net/tools/xmlParser.html) 所開發的xmlParser 資料庫。對此致上無比謝意! Hierdie is onstabiele sagteware! Die outeurs is op geen manier verantwoordelik vir gefaalde opnames, inkorrekte tydhouers, vermorsde ure, of enige ander ongewensde effekte. This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. - Això és programari inestable! Els autors no són en absolut responsables d'enregistraments fallist, temporitzadors incorrectes, hores tudades, o qualsevol altra efecte indesitjable... + Тази програма е нестабилна! Авторите не носят отговорност за неуспешно записване, некоректни броячи, пропиляното време и други нежелани ефекти. + Això és programari inestable! Els autors no són de cap manera responsables dels enregistraments que han fallat, temporitzadors incorrectes, hores perdudes, o qualssevol altres efectes indesitjables. Tento software není stabilní. Autoři nejsou žádným způsobem zodpovědní za selhání při nahrávání, neplatné časovače, ztracený čas, či jakékoliv jiné nežádoucí události... - Dette er ustabil software! Ophavsmændene er på ingen måde ansvarlige for fejl i optagelser, ukorrekte timere, spildte timer, eller andre uønskede konsekvenser. - Diese Software ist noch in der Entwicklung! Die Autoren sind nicht für fehlgeschlagene Aufnahmen, falsche Timer, verschwendete Zeit oder andere ungewollte Effekte verantwortlich. + Mae hwn yn feddalwedd ansad! Nid yw'r awduron yn gyfrifol mewn unrhyw ffordd am fethu recordio, amseru gwallus, oriau wedi eu gwastraffu nac effeithiau anymunol eraill. + Dette er ustabil software! Ophavsmændene er på ingen måde ansvarlige for mislykkede optagelser, fejlagtige timere, spildte timer, eller andre uønskede konsekvenser. + Dies ist instabile Software! Die Autoren sind in keiner Weise verantwortlich für fehlgeschlagene Aufnahmen, falsche Timer, verschwendete Zeit oder andere ungewünschte Effekte. Ασταθές πρόγραμμα! Οι δημιουργοί δεν είναι σε καμία περίπτωση υπεύθυνοι για αποτυχημένες εγγραφές, λανθασμένους χρονοδιακόπτες, χαμένες ώρες, ή κάθε είδους ανεπιθύμητα αποτελέσματα.. This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. + This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. ¡Este software es aún inestable! Los autores no son responsables en forma alguna por grabaciones fallidas, temporizaciones incorrectas, tiempo perdido o ningún otro efecto no deseado. ¡Este software es inestable! Los autores no se responsabilizan por grabaciones fallidas, temporizadores incorrectos, horas perdidas, o cualquier otro efecto no deseado.. ¡Esto es software inestable! Los autores no son de ninguna manera responsables por grabaciones fallidas, temporizadores incorrectos, horas perdidas o cualquier otro efecto no deseado... + See on ebastabiilne tarkvara! Autorid ei ole kuidagi moodi vastutavad nurjunud salvestiste, ebaõige aegrelee, raisatud tundide ega muude soovimatute asjade eest. Tämä on epävakaa ohjelma! Ohjelman kirjoittavat eivät vastaa millään tavalla epäonnistuneista nauhoituksista, ajastimen väärästä toiminnasta, hukatusta ajasta tai muista ei-halutuista tapahtumista. Logiciel en cours d'élaboration ! Les auteurs ne sont en aucun cas responsables de l'échec des enregistrements, minuteries défectueuses, temps perdu ou autres effets indésirables.. + Ce logiciel est instable! Les auteurs ne sont aucunement responsables des enregistrements défaillants, des minuteries erronées, des heures perdues ou tout autre effet indésirable. Este é software non estable, os autores non se fan responsábeis dos erros na gravacións, temporizadores incorrectos, e outros efectos non desexados. - זוהי תוכנה בלתי יציבה!מחברי התכנה אינם אחראים להקלטות כושלות,מתזמני הקלטות שגויים,שעות מבוזבזות,או כל תוצאה בלתי רצויה... + זוהי תוכנה לא יציבה! היוצרים אינם אחראים לכשלון בהקלטה, תזמונים לא נכונים, שעות מבוזבזות או כל השפעות בלתי רצויות אחרות. + Ovo je nestabilan softver! Autori nisu ni na koji način odgovorani za neuspjelo snimanje, netočna zakazana snimanja, izgubjene sate, ili bilo koje druge neželjene učinke .. Ez nem stabil szoftver! A készítők nem vállalnak felelősséget, a hibás felvételért, rossz időzítésért, elvesztegetett időért... + Ini merupakan software yang tidak stabil! Penulis tidak bertanggung jawab untuk rekaman gagal, timer salah, waktu terbuang, atau efek tak diinginkan lainnya... Þetta er óstöðugur hugbúnaður! Höfundarnir eru á engann hátt ábyrgir fyrir misheppnuðum upptökum, röngum upptökutímum, klukkustundum sem að fóru í súginn eða nokkrum öðrum óæskilegum áhrifum. Questo software è instabile! Gli autori non sono in alcun modo responsabili per registrazioni fallite, timers incorretti, ore perse, o qualsiasi altro effetto indesiderato. これは不安定なソフトウェアです!本プログラムの作者は、録画の失敗、正確に作動しなかったタイマー、無駄にした時間、その他あらゆる好ましくない結果について責任を負わないものとします。 + ეს არის არასტაბილური პროგრამული უზრუნველყოფა! ავტორები არ არიან პასუხისმგებელი შეცდომებზე, არასწორ EPG-ზე, დაკარგულ დროზე ან სხვა ხარვეზებზე 이 소프트웨어는 불안정합니다! 제작자는 녹화 실패, 부정확한 타이머, 시간 낭비 및 기타 예상하지 못한 결과에 대해 책임지지 않습니다.. Tai yra nestabili programinė įranga! Autorius jokiu būdu neatsakingas už nepavykusius įrašus, neteisingus laikmačius, iššvaistytas valandas, ar nutikus kitiems nepageidaujamiems poveikiams ...[COLOR=red](xbmc.lt siūlo/rekomenduoja testuojant šį priedą persijungti į Anglų [orinali] kalbą)[/COLOR] + Šī ir nestabila programmatūra! Autori nav nekādā vaidā atbildīgi par nesanākušiem ierakstiem, nepareiziem taimeriem, iztērētām stundām vai jebkādiem citiem nevēlamiem efektiem.. Ова е нестабилен софтвер! Авторите на ниту еден начин не одговараат за неуспешни снимки, неточни тајмери, потрошени часови, или било кои други несакани ефекти. + Ini merupakan perisian tidak stabil! Pengarang tidak bertanggungjawab atas kegagalan rakaman, pemasa tidak betul, masa yang dibazirkan, atau apa jua kesan yang tidak dikehendaki.. Deze software is niet 100% stabiel! De auteurs zijn op geen enkele wijze aansprakelijk voor mislukte opnames, verspilde tijd, of enig ander ongewild neveneffect.. Dette er ustabil programvare! Skaperen har ikke på noen måte ansvar for feilede opptak, feile timere, bortkastede timer, eller andre uønskede effekter.. - To oprogramowanie jest niestabilne! Autorzy w żaden sposób nie odpowiadają za nieudane nagrania, źle działające wyłączniki czasowe, stracone godziny czy też jakiekolwiek inne niepożądane efekty. - Este é um software instável! Os autores não se responsabilizam por falhas nas gravações, temporizadores incorrectos, outro qualquer efeito não desejado... - Este é um software instável! Os autores não são responsáveis por falhas nas gravações, agendamentos incorretos, horas dispendidas, ou quaisquer outros efeitos indesejáveis - Acesta nu este o aplicație definitivă! Autorii nu sunt în nici un fel responsabili pentru înregistrări eșuate, cronometre incorecte, ore pierdute, sau oricare alte efecte nedorite... - Это тестовая программа! Авторы не несут ответственности за неудачные записи, неверные таймеры, потраченное время и прочие нежелательные эффекты.. + Oprogramowanie nadal jest w fazie rozwoju i jest niestabilne! Autorzy w żaden sposób nie są odpowiedzialni za błędne nagrania, błędy planowaniu nagrań, zmarnowany czas ani jakiekolwiek inne niepożądane efekty. + Este software é instável! Os autores não são de forma alguma responsáveis por gravações falhadas, temporizadores incorrectos, horas desperdiçadas, ou qualquer outro tipo de efeitos indesejáveis.. + Este é um software instável! Os autores não são responsáveis por falhas nas gravações, agendamentos incorretos, horas desperdiçadas, ou quaisquer outros efeitos indesejáveis. + Acesta nu este o aplicație definitivă! Autorii nu sunt în nici un fel responsabili pentru înregistrări eșuate, cronometre incorecte, ore pierdute, sau orice alte efecte nedorite... + Это нестабильная программа! Авторы не несут ответственности за неудачные записи, неверные таймеры, потраченное время и прочие нежелательные эффекты. Tento softvér nie je stabilný! Autori nenesú žiadnu zodpovednosť za chybné nahrávky vysielania, nesprávne časovače alebo iné neželané udalosti spôsobené týmto softvérom.. To je nestabilna programska oprema! Avtorji niso odgovorni za neuspela snemanja, nepravilne časovnike, zapravljen čas in katerikoli drug neželen učinek... + Ky program nuk është ende stabil! Autorët së këtij programi nuk janë në as një menyr përgjegjës për rregistrime të gabuara, timer të pasaktë, kohë të humbur ose efekte të tillë të padëshirueshëm. + Овај софтвер је нестабилан! Аутори ни на који начин нису одговорни за неуспела снимања, неисправна заказана снимања, изгубљене сате или друге нежељене ефекте. Detta är ostabil mjukvara! Upphovsmännen är inte ansvariga för misslyckade inspelningar, inkorrekta timers, bortslösade timmar, eller några andra oönskade effekter.. - 这是不稳定版的软件!作者不对录制失败、错误定时造成时间浪费或其它不良影响负责。 + இந்த நிலையற்ற மென்பொருள்! தோல்வியடைந்தது பதிவுகள், தவறான டைமர்கள், வீணாகி மணி, அல்லது வேறு எந்த விரும்பத்தகாத விளைவுகலுக்கு இதன் ஆசிரியர்கள் பொறுப்பு இல்லை. + Ин нармафзори ноустувор аст! Муаллифон барои вайрониҳои сабт, вақтсанҷҳои нодуруст, соатҳои бефоида ва дигар таъсирҳои номатлуб ҷавобгар намебошанд. + Bu stabil olmayan program! Yapımcılar hatalı kayıtlardan, bozuk sürelerden, harcanan vakitten veya herhangi bir olumsuz etkiden dolayı sorumlu tutulamaz. + Це нестабільна програма! Автори не несуть відповідальності за попсуті записи, неправильні таймери, втрачений час та інші небажані ефекти. + Đây là phần mềm không ổn định! Các tác giả sẽ không chịu trách nhiệm nào với các bản ghi thất bại, bị đặt giờ sai, giờ lãng phí, hoặc các tác dụng không mong muốn khác.. + 这是不稳定版的软件!作者不对录像失败、错误定时造成时间浪费或其它不良影响负责。 + 這是測試版軟體!其原創作者並無法對於以下情況負責,包含:錄影失敗,不正確的定時設定,多餘時數,或任何產生的其它不良影響... @OS@ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/changelog.txt xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/changelog.txt --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/changelog.txt 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/changelog.txt 2014-05-04 07:03:11.000000000 +0000 @@ -1,3 +1,55 @@ +1.9.13 + +[updated] Language files from Transifex + +1.9.12 + +[updated] Language files from Transifex + +1.9.11 +[added] add timeshift buffer functions + +1.8.10 + +[updated] Require DVB Viewer Recording Service 1.25.0 or later +[updated] In general use RS XML API instead of HTML/channeldat parsing +[updated] Rewrote channel parsing. Use favourites if you want fast startups. +[updated] Rewrote recording parsing, generate unique recording IDs +[added] Show available diskspace +[added] RTSP support (Note: RTSP is only available if timeshift is disabled) +[fixed] Removed signal status information. Not available anymore +[fixed] Channel logos not being displayed for some channels +[fixed] After changing certain settings live TV wasn't work anymore and XBMC restart was required +[fixed] possible crash (2x) + +1.8.9 + +[updated] sync with PVR API v1.8.0 + +1.7.9 + +[fixed] loading favourites without groups/folders + +1.7.8 + +[fixed] fix crash with Recording Service 1.25.0 + +1.7.7 + +[fixed] fix possible crash during timer updates + +1.7.6 + +[added] Basic timeshift support. +[added] Use channel names from favourites. This allows easy channelname changes. +[fixed] Use 64 bit channel ids. Fall back to 32 bit if favourites.xml still contain the old ones. +[fixed] Replace "/"-character by " " in channel logo url +[updated] A lot of code cleanup + +1.7.5 + +[updated] Bump after PVR API version bump + 1.6.5 [updated] Language files from Transifex diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Afrikaans/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Afrikaans/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Afrikaans/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Afrikaans/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Afrikaans (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/af/)\n" +"Language-Team: Afrikaans (http://www.transifex.com/projects/p/xbmc-main/language/af/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,33 +25,25 @@ msgstr "Webkoppelvlak Poort" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Stroom Poort" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Opname Poort" - -msgctxt "#30004" msgid "Username" msgstr "Gebruikersnaam" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Wagwoord" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Laai kanale vanaf favourites.xml in plaas van channels.dat" - -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "Selekteer die favourites.xml lêer" +msgctxt "#30100" +msgid "General" +msgstr "Algemeen" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Gevorderde" + msgctxt "#30500" msgid "Can't connect to the Recording Service" msgstr "Kan nie aan die Opname Diens konnekteer" - -msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "Opname Diens weergawe 1.%d of hoër vereis" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Albanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Albanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Albanian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Albanian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,49 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Albanian (http://www.transifex.com/projects/p/xbmc-main/language/sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "DVBViewer Recording Service IP Address" +msgstr "DVBViewer Recording Service Adresa IP" + +msgctxt "#30001" +msgid "Webinterface Port" +msgstr "Webinterface porti" + +msgctxt "#30002" +msgid "Username" +msgstr "Emri i përdoruesit" + +msgctxt "#30003" +msgid "Password" +msgstr "Fjalkalimi" + +msgctxt "#30012" +msgid "Select the favourites.xml file" +msgstr "Zgjidh skedën favourites.xml" + +msgctxt "#30100" +msgid "General" +msgstr "Të përgjithshëm" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Të shtuar" + +msgctxt "#30500" +msgid "Can't connect to the Recording Service" +msgstr "Nuk mund të lidhet me Recording Service" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Amharic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Amharic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Amharic/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Amharic/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,33 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Amharic (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/am/)\n" +"Language-Team: Amharic (http://www.transifex.com/projects/p/xbmc-main/language/am/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: am\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -msgctxt "#30004" +msgctxt "#30002" msgid "Username" msgstr "የተጠቃሚ ስም " -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "የመግቢያ ቃል" + +msgctxt "#30100" +msgid "General" +msgstr "ባጠቃላይ" + +msgctxt "#30101" +msgid "Advanced" +msgstr "የረቀቀ" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Arabic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Arabic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Arabic/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Arabic/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,33 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Arabic (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ar/)\n" +"Language-Team: Arabic (http://www.transifex.com/projects/p/xbmc-main/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ar\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" -msgctxt "#30004" +msgctxt "#30002" msgid "Username" msgstr "اسم المستخدم" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "كلمة المرور" + +msgctxt "#30100" +msgid "General" +msgstr "عام" + +msgctxt "#30101" +msgid "Advanced" +msgstr "منقدم" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Basque/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Basque/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Basque/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Basque/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,29 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Basque (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/eu/)\n" +"Language-Team: Basque (http://www.transifex.com/projects/p/xbmc-main/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: eu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgctxt "#30004" +msgctxt "#30002" msgid "Username" msgstr "Erabiltzailea" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Pasahitza" + +msgctxt "#30100" +msgid "General" +msgstr "Orokorra" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Belarusian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Belarusian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Belarusian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Belarusian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Belarusian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/be/)\n" +"Language-Team: Belarusian (http://www.transifex.com/projects/p/xbmc-main/language/be/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,33 +25,25 @@ msgstr "Webinterface Port" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Streaming Port" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Recordings Port" - -msgctxt "#30004" msgid "Username" msgstr "Username" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Password" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Load channels from favourites.xml instead of from channels.dat" - -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "Select the favourites.xml file" +msgctxt "#30100" +msgid "General" +msgstr "General" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Advanced" + msgctxt "#30500" msgid "Can't connect to the Recording Service" msgstr "Can't connect to the Recording Service" - -msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "Recording Service version 1.%d or higher required" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Bosnian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Bosnian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Bosnian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Bosnian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,29 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Bosnian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/bs/)\n" +"Language-Team: Bosnian (http://www.transifex.com/projects/p/xbmc-main/language/bs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bs\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -msgctxt "#30004" +msgctxt "#30002" msgid "Username" msgstr "Korisničko ime" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Lozinka" + +msgctxt "#30100" +msgid "General" +msgstr "Opšte" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Bulgarian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Bulgarian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Bulgarian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Bulgarian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,73 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Bulgarian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/bg/)\n" +"Language-Team: Bulgarian (http://www.transifex.com/projects/p/xbmc-main/language/bg/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bg\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgctxt "#30004" +msgctxt "#30000" +msgid "DVBViewer Recording Service IP Address" +msgstr "IP адрес на DVBViewer услуга за записване" + +msgctxt "#30001" +msgid "Webinterface Port" +msgstr "Порт на уеб интерфейса" + +msgctxt "#30002" msgid "Username" msgstr "Потребителско име" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Парола" + +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Използвай любимите вместо списъка с канали" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Използвай локален файл с любими" + +msgctxt "#30012" +msgid "Select the favourites.xml file" +msgstr "Изберете favourites.xml файл" + +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Включи таймшифта" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Път към таймшифт буфера" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Използвай RTSP стрийминг за телевизия на живо" + +msgctxt "#30100" +msgid "General" +msgstr "Основни" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Допълнителни" + +msgctxt "#30500" +msgid "Can't connect to the Recording Service" +msgstr "Неуспешно свързване с услугата за записване" + +msgctxt "#30501" +msgid "Recording Service version %s or higher required" +msgstr "Изисква се услуга за записване версия %s или по-нова" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Burmese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Burmese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Burmese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Burmese/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,33 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Burmese (http://www.transifex.com/projects/p/xbmc-main/language/my/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30002" +msgid "Username" +msgstr "အသုံးပြုသူအမည်" + +msgctxt "#30003" +msgid "Password" +msgstr "စကားဝှက်" + +msgctxt "#30100" +msgid "General" +msgstr "ယေဘုယျ" + +msgctxt "#30101" +msgid "Advanced" +msgstr "အဆင့်မြင့်သော" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Catalan/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Catalan/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Catalan/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Catalan/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,49 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Catalan (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ca/)\n" +"Language-Team: Catalan (http://www.transifex.com/projects/p/xbmc-main/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgctxt "#30004" +msgctxt "#30000" +msgid "DVBViewer Recording Service IP Address" +msgstr "Adreça IP del servei d'enregistrament del DVBViewer" + +msgctxt "#30001" +msgid "Webinterface Port" +msgstr "Port interfície web" + +msgctxt "#30002" msgid "Username" msgstr "Nom d'usuari" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Contrasenya" + +msgctxt "#30012" +msgid "Select the favourites.xml file" +msgstr "Seleccioneu el fitxer favourites.xml" + +msgctxt "#30100" +msgid "General" +msgstr "General" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Avançat" + +msgctxt "#30500" +msgid "Can't connect to the Recording Service" +msgstr "No es pot connectar amb el servei d'enregistrament" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Chinese (Simple)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Chinese (Simple)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Chinese (Simple)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Chinese (Simple)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Chinese (Simple) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/zh/)\n" +"Language-Team: Chinese (Simple) (http://www.transifex.com/projects/p/xbmc-main/language/zh/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,40 +18,56 @@ msgctxt "#30000" msgid "DVBViewer Recording Service IP Address" -msgstr "DVBViewer录制服务IP地址" +msgstr "DVBViewer 录制服务 IP 地址" msgctxt "#30001" msgid "Webinterface Port" -msgstr "Web界面端口" +msgstr "Web 界面端口" msgctxt "#30002" -msgid "Streaming Port" -msgstr "流媒体端口" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "录制端口" - -msgctxt "#30004" msgid "Username" msgstr "用户名" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "密码" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "从favourites.xml中载入频道跳过channels.dat" +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "使用收藏夹代替频道列表" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "使用本地收藏夹文件" -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" -msgstr "选择favourites.xml文件" +msgstr "选择 favourites.xml 文件" + +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "启用时光平移" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "时光平移缓存路径" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "直播电视使用 RTSP 流" + +msgctxt "#30100" +msgid "General" +msgstr "常规" + +msgctxt "#30101" +msgid "Advanced" +msgstr "高级" msgctxt "#30500" msgid "Can't connect to the Recording Service" -msgstr "无法连接录制服务" +msgstr "无法连接录像服务" msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "录制服务版本需 1.%d 或以上。" +msgid "Recording Service version %s or higher required" +msgstr "录像服务需要 s% 或更高版本" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Chinese (Traditional)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Chinese (Traditional)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Chinese (Traditional)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Chinese (Traditional)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,57 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Chinese (Traditional) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/zh_TW/)\n" +"Language-Team: Chinese (Traditional) (http://www.transifex.com/projects/p/xbmc-main/language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0;\n" -msgctxt "#30004" +msgctxt "#30000" +msgid "DVBViewer Recording Service IP Address" +msgstr "DVBViewer錄影服務IP位址" + +msgctxt "#30001" +msgid "Webinterface Port" +msgstr "Web介面端口" + +msgctxt "#30002" msgid "Username" msgstr "帳號" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "密碼" + +msgctxt "#30012" +msgid "Select the favourites.xml file" +msgstr "選擇favourites.xml檔案" + +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "啟用時間平移" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "時間平移緩衝路徑" + +msgctxt "#30100" +msgid "General" +msgstr "一般設定" + +msgctxt "#30101" +msgid "Advanced" +msgstr "進階" + +msgctxt "#30500" +msgid "Can't connect to the Recording Service" +msgstr "無法連接到錄影服務" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Croatian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Croatian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Croatian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Croatian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,73 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Croatian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/hr/)\n" +"Language-Team: Croatian (http://www.transifex.com/projects/p/xbmc-main/language/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -msgctxt "#30004" +msgctxt "#30000" +msgid "DVBViewer Recording Service IP Address" +msgstr "IP adresa DVBViewer usluge snimanja" + +msgctxt "#30001" +msgid "Webinterface Port" +msgstr "Ulaz web sučelja" + +msgctxt "#30002" msgid "Username" msgstr "Korisničko ime" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" -msgstr "Zaporka" +msgstr "Lozinka" + +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Koristi popis omiljenih umjesto popisa programa" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Koristi lokalnu datoteku omiljenih" + +msgctxt "#30012" +msgid "Select the favourites.xml file" +msgstr "Odaberite favourites.xml datoteku" + +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Omogući vremensko premotavanje" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Putanja međuspremnika premotavanja u vremenu" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Koristi RTSP streamanje za televiziju" + +msgctxt "#30100" +msgid "General" +msgstr "Općenito" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Napredno" + +msgctxt "#30500" +msgid "Can't connect to the Recording Service" +msgstr "Nemoguće povezivanje s uslugom snimanja" + +msgctxt "#30501" +msgid "Recording Service version %s or higher required" +msgstr "Potrebna je usluga snimanja inačice %s ili viša" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Czech/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Czech/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Czech/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Czech/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Czech (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/cs/)\n" +"Language-Team: Czech (http://www.transifex.com/projects/p/xbmc-main/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,33 +25,33 @@ msgstr "Port webového rozhraní" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Port proudového vysílání" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Port nahrávání" - -msgctxt "#30004" msgid "Username" msgstr "Uživatelské jméno" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Heslo" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Načíst kanály z favourites.xml místo channels.dat" - -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "Vyberte soubor favourites.xml" +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Povolit časový posun" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Cesta k zásobníku časového posunu" + +msgctxt "#30100" +msgid "General" +msgstr "Obecné" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Pokročilé" + msgctxt "#30500" msgid "Can't connect to the Recording Service" msgstr "Nelze se spojit se službou nahrávání" - -msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "Vyžadována služba nahrávání verze 1.%d nebo novější" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Danish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Danish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Danish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Danish/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Danish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/da/)\n" +"Language-Team: Danish (http://www.transifex.com/projects/p/xbmc-main/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,33 +25,49 @@ msgstr "Web-grænsefladeport" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Streamport" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Optagelsesport" - -msgctxt "#30004" msgid "Username" msgstr "Brugernavn" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Adgangskode" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Indlæs kanaler fra favourites.xml i stedet for channels.dat" +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Brug favoritter i stedet for kanalliste" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Brug lokal favoritfil" -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "Vælg favourites.xml filen" +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Aktiver tidsforskydning" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Stien til tidsforskydningsbuffer" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Brug RTSP streaming til live TV" + +msgctxt "#30100" +msgid "General" +msgstr "Generelt" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Avanceret" + msgctxt "#30500" msgid "Can't connect to the Recording Service" msgstr "Kan ikke forbinde til optagelsestjeneste" msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "Optagelsestjeneste version 1.%d eller højere kræves" +msgid "Recording Service version %s or higher required" +msgstr "Optageservice version %s eller højere nødvendig" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Dutch/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Dutch/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Dutch/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Dutch/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Dutch (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/nl/)\n" +"Language-Team: Dutch (http://www.transifex.com/projects/p/xbmc-main/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,40 +18,56 @@ msgctxt "#30000" msgid "DVBViewer Recording Service IP Address" -msgstr "DVBViewer Recording Service IP-Adres" +msgstr "DVBViewer opnamen service IP adres" msgctxt "#30001" msgid "Webinterface Port" msgstr "Webinterface poort" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Streaming Poort" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Opnames Poort" - -msgctxt "#30004" msgid "Username" msgstr "Gebruikersnaam" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Wachtwoord" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Laad kanalen van favourites.xml in plaats van channels.dat" +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Gebruik favorieten in plaats van kanalenlijst" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Gebruik lokale favorietenbestand" -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "Selecteer het favourites.xml bestand" +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Inschakelen Tijdsprong" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Tijdsprong buffer locatie" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Gebruik RTSP streaming voor live TV" + +msgctxt "#30100" +msgid "General" +msgstr "Algemeen" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Geavanceerd" + msgctxt "#30500" msgid "Can't connect to the Recording Service" -msgstr "Kan niet verbinden met de Recording Service" +msgstr "Kan geen verbinding maken met de opnamen service" msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "Recording Service versie 1.%d of hoger benodigd" +msgid "Recording Service version %s or higher required" +msgstr "Opnamen service versie %s of hoger vereist" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/English/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/English/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/English/strings.po 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/English/strings.po 2014-05-04 07:03:11.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: English (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/en/)\n" +"Language-Team: English (http://www.transifex.com/projects/p/xbmc-main/language/en/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -28,30 +27,54 @@ msgstr "" msgctxt "#30002" -msgid "Streaming Port" +msgid "Username" msgstr "" msgctxt "#30003" -msgid "Recordings Port" +msgid "Password" msgstr "" -msgctxt "#30004" -msgid "Username" -msgstr "" +#empty strings from id 30004 to 30009 -msgctxt "#30005" -msgid "Password" +msgctxt "#30010" +msgid "Use favourites instead of channel list" msgstr "" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" +msgctxt "#30011" +msgid "Use local favourites file" msgstr "" -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "" -#empty strings from id 30008 to 30499 +#empty strings from id 30013 to 30019 + +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "" + +#empty strings from id 30022 to 30029 + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "" + +#empty strings from id 30031 to 30099 + +msgctxt "#30100" +msgid "General" +msgstr "" + +msgctxt "#30101" +msgid "Advanced" +msgstr "" + +#empty strings from id 30102 to 30499 #notifications msgctxt "#30500" @@ -59,5 +82,5 @@ msgstr "" msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" +msgid "Recording Service version %s or higher required" msgstr "" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/English (Australia)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/English (Australia)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/English (Australia)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/English (Australia)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,33 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (Australia) (http://www.transifex.com/projects/p/xbmc-main/language/en_AU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30002" +msgid "Username" +msgstr "Username" + +msgctxt "#30003" +msgid "Password" +msgstr "Password" + +msgctxt "#30100" +msgid "General" +msgstr "General" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Advanced" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/English (New Zealand)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/English (New Zealand)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/English (New Zealand)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/English (New Zealand)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,73 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (New Zealand) (http://www.transifex.com/projects/p/xbmc-main/language/en_NZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_NZ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "DVBViewer Recording Service IP Address" +msgstr "DVBViewer Recording Service IP Address" + +msgctxt "#30001" +msgid "Webinterface Port" +msgstr "Webinterface Port" + +msgctxt "#30002" +msgid "Username" +msgstr "Username" + +msgctxt "#30003" +msgid "Password" +msgstr "Password" + +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Use favourites instead of channel list" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Use local favourites file" + +msgctxt "#30012" +msgid "Select the favourites.xml file" +msgstr "Select the favourites.xml file" + +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Enable Timeshift" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Timeshift buffer path" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Use RTSP streaming for live TV" + +msgctxt "#30100" +msgid "General" +msgstr "General" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Advanced" + +msgctxt "#30500" +msgid "Can't connect to the Recording Service" +msgstr "Can't connect to the Recording Service" + +msgctxt "#30501" +msgid "Recording Service version %s or higher required" +msgstr "Recording Service version %s or higher required" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/English (US)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/English (US)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/English (US)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/English (US)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,33 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (US) (http://www.transifex.com/projects/p/xbmc-main/language/en_US/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_US\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30002" +msgid "Username" +msgstr "Username" + +msgctxt "#30003" +msgid "Password" +msgstr "Password" + +msgctxt "#30100" +msgid "General" +msgstr "General" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Advanced" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Esperanto/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Esperanto/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Esperanto/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Esperanto/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,29 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Esperanto (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/eo/)\n" +"Language-Team: Esperanto (http://www.transifex.com/projects/p/xbmc-main/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: eo\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgctxt "#30004" +msgctxt "#30002" msgid "Username" msgstr "Uzulonomo" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "pasvorto" + +msgctxt "#30100" +msgid "General" +msgstr "Generalo" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Estonian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Estonian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Estonian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Estonian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,49 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Estonian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/et/)\n" +"Language-Team: Estonian (http://www.transifex.com/projects/p/xbmc-main/language/et/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: et\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgctxt "#30004" +msgctxt "#30000" +msgid "DVBViewer Recording Service IP Address" +msgstr "DVBViewer salvestus serveri IP aadress" + +msgctxt "#30001" +msgid "Webinterface Port" +msgstr "Veebiliidese port" + +msgctxt "#30002" msgid "Username" msgstr "Kasutajanimi" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" -msgstr "Salasõna" +msgstr "Parool" + +msgctxt "#30012" +msgid "Select the favourites.xml file" +msgstr "Vali favourites.xml fail" + +msgctxt "#30100" +msgid "General" +msgstr "Üldine" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Edasijõudnud" + +msgctxt "#30500" +msgid "Can't connect to the Recording Service" +msgstr "Salvestus serveriga ühendamine nurjus" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Faroese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Faroese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Faroese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Faroese/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Faroese (http://www.transifex.com/projects/p/xbmc-main/language/fo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30002" +msgid "Username" +msgstr "Brúkaranavn" + +msgctxt "#30003" +msgid "Password" +msgstr "Loyniorð" + +msgctxt "#30100" +msgid "General" +msgstr "Vanligt" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Finnish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Finnish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Finnish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Finnish/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,37 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Finnish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fi/)\n" +"Language-Team: Finnish (http://www.transifex.com/projects/p/xbmc-main/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgctxt "#30004" +msgctxt "#30001" +msgid "Webinterface Port" +msgstr "Webbikäyttöliittymän portti" + +msgctxt "#30002" msgid "Username" msgstr "Käyttäjätunnus" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Salasana" + +msgctxt "#30100" +msgid "General" +msgstr "Yleiset" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Lisäasetukset" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/French/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/French/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/French/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/French/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: French (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fr/)\n" +"Language-Team: French (http://www.transifex.com/projects/p/xbmc-main/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,33 +25,49 @@ msgstr "Port de l'interface web" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Port du flux" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Port des enregistrements" - -msgctxt "#30004" msgid "Username" -msgstr "Utilisateur" +msgstr "Nom d'utilisateur" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Mot de passe" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Charger les chaînes depuis favourites.xml au lieu de channels.dat" +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Utiliser les favoris au lieu de la liste des chaînes" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Utiliser le fichier local des favoris" -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "Sélectionner le fichier favourites.xml" +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Activer le différé" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Chemin du tampon pour le différé" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Utiliser le streaming RTSP pour la TV Directe" + +msgctxt "#30100" +msgid "General" +msgstr "Général" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Avancé" + msgctxt "#30500" msgid "Can't connect to the Recording Service" msgstr "Impossible de se connecter au service d'enregistrement" msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "Version 1.%d ou supérieure du service d'enregistrement requise" +msgid "Recording Service version %s or higher required" +msgstr "Version du service d'enregistrement %s ou supérieur requisé" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/French (Canada)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/French (Canada)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/French (Canada)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/French (Canada)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,73 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: French (Canada) (http://www.transifex.com/projects/p/xbmc-main/language/fr_CA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_CA\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "DVBViewer Recording Service IP Address" +msgstr "Adresse IP du service d'enregistrement DVBViewer" + +msgctxt "#30001" +msgid "Webinterface Port" +msgstr "Port de l'interface Web" + +msgctxt "#30002" +msgid "Username" +msgstr "Nom d'utilisateur" + +msgctxt "#30003" +msgid "Password" +msgstr "Mot de passe" + +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Utiliser les favoris au lieu de la liste des chaînes" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Utiliser un fichier local de favoris" + +msgctxt "#30012" +msgid "Select the favourites.xml file" +msgstr "Choisir le fichier favourites.xml" + +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Activer le décalage temporel" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Chemin du tampon de décalage temporel" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Utiliser la lecture en transit pour la télé en direct " + +msgctxt "#30100" +msgid "General" +msgstr "Général" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Avancé" + +msgctxt "#30500" +msgid "Can't connect to the Recording Service" +msgstr "Impossible de se connecter au service d'enregistrement" + +msgctxt "#30501" +msgid "Recording Service version %s or higher required" +msgstr "La version %s ou ultérieure du service d'enregistrement est exigée" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Galician/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Galician/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Galician/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Galician/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Galician (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/gl/)\n" +"Language-Team: Galician (http://www.transifex.com/projects/p/xbmc-main/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,33 +25,49 @@ msgstr "Porto de Webinterface" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Porto do fluxo" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Porto das gravacións" - -msgctxt "#30004" msgid "Username" msgstr "Nome de usuario" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Contrasinal" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Cargar as canles dende favourites.xml no lugar de channels.dat" +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Usar os favoritos no canto da listaxe de canles" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Usar o ficheiro de favoritos locales" -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "Seleccionar o ficheiro favourites.xml" +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Habilitar Timeshift" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Camiño do búfer do Timeshift" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Usar a transmisión RTSP para a TV ao vivo" + +msgctxt "#30100" +msgid "General" +msgstr "Xeral" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Avanzado" + msgctxt "#30500" msgid "Can't connect to the Recording Service" msgstr "Non se puido conectar ao servizo de gravación" msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "Requírese a versión 1.%d ou superior do servizo de gravación" +msgid "Recording Service version %s or higher required" +msgstr "Requírese a versión %s ou superior do servizo" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Georgian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Georgian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Georgian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Georgian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,73 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Georgian (http://www.transifex.com/projects/p/xbmc-main/language/ka/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ka\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "DVBViewer Recording Service IP Address" +msgstr "DVBViewer ჩაწერის სერვისის IP მისამართი" + +msgctxt "#30001" +msgid "Webinterface Port" +msgstr "ვებ-ინტერფეისის პორტი" + +msgctxt "#30002" +msgid "Username" +msgstr "მომხმარებელი" + +msgctxt "#30003" +msgid "Password" +msgstr "პაროლი" + +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "არხების სიის ნაცვლად რჩეულების გამოყენება" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "ლოკალური რჩეულების ფაილი" + +msgctxt "#30012" +msgid "Select the favourites.xml file" +msgstr "შეარჩიეთ favorites.xml ფაილი" + +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "დროში გადანაცვლების ჩართვა" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "დროში გადანაცვლების ბუფერის მისამართი" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "RTSP სტრიმინგის გამოყენება live TV-თვის" + +msgctxt "#30100" +msgid "General" +msgstr "მთავარი" + +msgctxt "#30101" +msgid "Advanced" +msgstr "დამატებით" + +msgctxt "#30500" +msgid "Can't connect to the Recording Service" +msgstr "ვერ ვუკავშირდები ჩაწერის სერვისს" + +msgctxt "#30501" +msgid "Recording Service version %s or higher required" +msgstr "საჭიროა ჩაწერის სერვისის %s ან უფრო ახალი ვერსია" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/German/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/German/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/German/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/German/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: German (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/de/)\n" +"Language-Team: German (http://www.transifex.com/projects/p/xbmc-main/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,40 +18,56 @@ msgctxt "#30000" msgid "DVBViewer Recording Service IP Address" -msgstr "DVBViewer Aufnahme Service IP Addresse" +msgstr "IP-Adresse des DVBViewer-Aufnahmedienstes" msgctxt "#30001" msgid "Webinterface Port" -msgstr "Webinterface Port" +msgstr "Weboberfläche Port" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Streaming Port" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Port für Aufnahmen" - -msgctxt "#30004" msgid "Username" msgstr "Benutzername" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Passwort" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Lade Kanäle aus favourites.xml an Stelle von channels.dat" +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Favoriten anstelle einer Kanalliste verwenden" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Lokale Favoritendatei verwenden" -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" -msgstr "Wähle die favourites.xml Datei" +msgstr "Wähle die favourites.xml-Datei" + +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Timeshift aktivieren" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Timeshift Puffer-Pfad" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "RTSP-Streaming für Live TV verwenden" + +msgctxt "#30100" +msgid "General" +msgstr "Allgemein" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Fortgeschritten" msgctxt "#30500" msgid "Can't connect to the Recording Service" -msgstr "Kann keine Verbindung mit dem Aufnahme Service herstellen." +msgstr "Kann keine Verbindung mit dem Aufzeichnungsdienst herstellen" msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "Aufnhame Service Version 1.%d oder höher erforderlich" +msgid "Recording Service version %s or higher required" +msgstr "Aufzeichnungsdienst in Version %s oder höher wird benötigt" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Greek/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Greek/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Greek/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Greek/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Greek (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/el/)\n" +"Language-Team: Greek (http://www.transifex.com/projects/p/xbmc-main/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -23,36 +22,52 @@ msgctxt "#30001" msgid "Webinterface Port" -msgstr "Θύρα Διεπαφής Ιστού" +msgstr "Θύρα Διασύνδεσης Ιστού" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Θύρα Ροής" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Θύρα Εγγραφών" - -msgctxt "#30004" msgid "Username" msgstr "Όνομα χρήστη" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Κωδικός πρόσβασης" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Φόρτωση καναλιών από το favourites.xml αντί του channels.dat" +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Χρήση αγαπημένων αντί λίστας καναλιών" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Χρήση τοπικού αρχείου αγαπημένων" -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" -msgstr "Επιλογή του αρχείου favourites.xml" +msgstr "Επιλογή του αρχείου αγαπημένων favourites.xml" + +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Ενεργοποίηση Timeshift" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Διαδρομή προσωρινής αποθήκευσης Timeshift" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Χρήση ροής RTSP για ζωντανή τηλεόρασης" + +msgctxt "#30100" +msgid "General" +msgstr "Γενικά" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Για Προχωρημένους" msgctxt "#30500" msgid "Can't connect to the Recording Service" msgstr "Αδυναμία σύνδεσης με την Υπηρεσία Εγγραφών" msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "Απαιτείται έκδοση 1.%d ή ανώτερη της Υπηρεσίας Εγγραφών" +msgid "Recording Service version %s or higher required" +msgstr "Απαιτείται η έκδοση %s ή ανώτερη για το Recording Service" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Haitian (Haitian Creole)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Haitian (Haitian Creole)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Haitian (Haitian Creole)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Haitian (Haitian Creole)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,27 +1,26 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Haitian (Haitian Creole) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ht/)\n" +"Language-Team: Haitian (Haitian Creole) (http://www.transifex.com/projects/p/xbmc-main/language/ht/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ht\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgctxt "#30004" +msgctxt "#30002" msgid "Username" msgstr "nom itilizateur" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "mo de pas" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Hebrew/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Hebrew/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Hebrew/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Hebrew/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hebrew (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/he/)\n" +"Language-Team: Hebrew (http://www.transifex.com/projects/p/xbmc-main/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -23,36 +22,52 @@ msgctxt "#30001" msgid "Webinterface Port" -msgstr "פורט ממשק אינטרנט" +msgstr "פיתחת ממשק רשת" msgctxt "#30002" -msgid "Streaming Port" -msgstr "פורט הזרמה" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "פורט הקלטה" - -msgctxt "#30004" msgid "Username" msgstr "שם משתמש" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" -msgstr "סיסמא" +msgstr "ססמה" + +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "השתמש במועדפים במקום רשימת ערוצים" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "טען את הערוצים מהקובץ favourites.xml במקום channels.dat" +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "השתמש בקובץ מועדפים מקומי" -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "סמן את הקובץ favourites.xml" +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "אפשר תזוזה בזמן" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "נתיב חוצץ תזוזה בזמן" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "השתמש בהזרמת RTSP לשידור חי" + +msgctxt "#30100" +msgid "General" +msgstr "כללי" + +msgctxt "#30101" +msgid "Advanced" +msgstr "מתקדם" + msgctxt "#30500" msgid "Can't connect to the Recording Service" msgstr "אין אפשרות להתחבר לשירות ההקלטה" msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "נחוצה גרסת שירות הקלטה 1.%d או גבוהה יותר" +msgid "Recording Service version %s or higher required" +msgstr "נדרשת לפחות גרסת שירות הקלטות %s" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Hindi (Devanagiri)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Hindi (Devanagiri)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Hindi (Devanagiri)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Hindi (Devanagiri)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,22 +1,29 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hindi (Devanagiri) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/hi/)\n" +"Language-Team: Hindi (Devanagiri) (http://www.transifex.com/projects/p/xbmc-main/language/hi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgctxt "#30004" +msgctxt "#30002" msgid "Username" msgstr "उपयोगकर्ता नाम" + +msgctxt "#30100" +msgid "General" +msgstr "सामान्य" + +msgctxt "#30101" +msgid "Advanced" +msgstr "उन्नत" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Hungarian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Hungarian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Hungarian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Hungarian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hungarian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/hu/)\n" +"Language-Team: Hungarian (http://www.transifex.com/projects/p/xbmc-main/language/hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,33 +25,49 @@ msgstr "Web-kezelőfelület port" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Sugárzási port" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Felvételek portja" - -msgctxt "#30004" msgid "Username" msgstr "Felhasználónév" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Jelszó" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Csatornák betöltése a favourites.xml fájlból a channels.dat helyett" +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Kedvencek használata a csatornalista helyett." + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Helyi kedvencek fájl használata" -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "A favourites.xml fájl kiválasztása" +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Csúsztatott élőkép engedélyezése" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Csúsztatott élőkép tároló útvonala" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "RTSP adatfolyam használata az elő TV-hez" + +msgctxt "#30100" +msgid "General" +msgstr "Általános" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Haladó" + msgctxt "#30500" msgid "Can't connect to the Recording Service" msgstr "Nem lehet a felvétel szolgáltatáshoz csatlakozni" msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "Legalább 1.%d verziószámú felvétel szolgáltatás szükséges" +msgid "Recording Service version %s or higher required" +msgstr "Felvétel szolgáltatás verzió %s vagy nagyobb szükséges" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Icelandic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Icelandic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Icelandic/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Icelandic/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,33 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Icelandic (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/is/)\n" +"Language-Team: Icelandic (http://www.transifex.com/projects/p/xbmc-main/language/is/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: is\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgctxt "#30004" +msgctxt "#30002" msgid "Username" msgstr "Notandanafn" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Lykilorð" + +msgctxt "#30012" +msgid "Select the favourites.xml file" +msgstr "Veldu favourites.xml skrána" + +msgctxt "#30100" +msgid "General" +msgstr "Almennt" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Indonesian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Indonesian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Indonesian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Indonesian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,73 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Indonesian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/id/)\n" +"Language-Team: Indonesian (http://www.transifex.com/projects/p/xbmc-main/language/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: id\n" "Plural-Forms: nplurals=1; plural=0;\n" -msgctxt "#30004" +msgctxt "#30000" +msgid "DVBViewer Recording Service IP Address" +msgstr "Alamat IP Layanan Perekaman DVBViewer" + +msgctxt "#30001" +msgid "Webinterface Port" +msgstr "Port antar-muka web" + +msgctxt "#30002" msgid "Username" -msgstr "Nama" +msgstr "NamaPengguna" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Password" + +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Gunakan favorit bukannya list kanal" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Gunakan berkas favorit lokal" + +msgctxt "#30012" +msgid "Select the favourites.xml file" +msgstr "Pilih berkas favourites.xml" + +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Aktifkan Timeshift" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Path penyangga Timeshift" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Gunakan aliran RTSP untuk Siaran TV langsung" + +msgctxt "#30100" +msgid "General" +msgstr "Umum" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Lanjutan" + +msgctxt "#30500" +msgid "Can't connect to the Recording Service" +msgstr "Tidak bisa terkoneksi dengan Layanan Perekaman" + +msgctxt "#30501" +msgid "Recording Service version %s or higher required" +msgstr "Membutuhkan Layanan Perekaman versi %s atau yang lebih tinggi" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Italian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Italian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Italian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Italian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Italian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/it/)\n" +"Language-Team: Italian (http://www.transifex.com/projects/p/xbmc-main/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -23,36 +22,52 @@ msgctxt "#30001" msgid "Webinterface Port" -msgstr "Porta interfaccia web" +msgstr "Porta dell'interfaccia web" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Porta streaming" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Porta registrazione" - -msgctxt "#30004" msgid "Username" msgstr "Nome utente" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Password" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Carica canali da favourites.xml invece che da channels.dat" +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Utilizza i preferiti invece della lista canali" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Utilizza file dei preferiti locali" -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "Seleziona il file favourites.xml" +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Abilita Timeshift" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Path per il buffer del timeshift" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Utilizza streaming RTSP per la TV live" + +msgctxt "#30100" +msgid "General" +msgstr "Generale" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Avanzato" + msgctxt "#30500" msgid "Can't connect to the Recording Service" msgstr "Impossibile connettersi al servizio di registrazione" msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "È richiesta la versione 1.%d o superiore del servizio di registrazione" +msgid "Recording Service version %s or higher required" +msgstr "Richiesta la versione %s o maggiore del Recording Service" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Japanese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Japanese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Japanese/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Japanese/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Japanese (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ja/)\n" +"Language-Team: Japanese (http://www.transifex.com/projects/p/xbmc-main/language/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,33 +25,33 @@ msgstr "Web インターフェースのポート番号" msgctxt "#30002" -msgid "Streaming Port" -msgstr "ストリーミングのポート番号" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "録画のポート番号" - -msgctxt "#30004" msgid "Username" msgstr "ユーザー名" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "パスワード" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "channels.dat からではなく favourites.xml からチャンネルを読み込む" - -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "favourites.xml ファイルを選択" +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "タイムシフトを有効" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "タイムシフト用バッファのパス" + +msgctxt "#30100" +msgid "General" +msgstr "一般" + +msgctxt "#30101" +msgid "Advanced" +msgstr "高度な設定" + msgctxt "#30500" msgid "Can't connect to the Recording Service" msgstr "録画サービスに接続できません" - -msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "録画サービス 1.%d またはそれ以上のバージョンが必要です" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Korean/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Korean/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Korean/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Korean/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Korean (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ko/)\n" +"Language-Team: Korean (http://www.transifex.com/projects/p/xbmc-main/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,33 +25,25 @@ msgstr "웹인터페이스 포트" msgctxt "#30002" -msgid "Streaming Port" -msgstr "스트리밍 포트" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "녹화 포트" - -msgctxt "#30004" msgid "Username" msgstr "사용자명" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "비밀번호" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "channels.dat 대신 favourites.xml에서 채널 가져오기" - -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "favourites.xml 파일 선택" +msgctxt "#30100" +msgid "General" +msgstr "일반" + +msgctxt "#30101" +msgid "Advanced" +msgstr "고급" + msgctxt "#30500" msgid "Can't connect to the Recording Service" msgstr "녹화 서비스에 연결할 수 없음" - -msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "1.%d 버전 이상의 녹화 서비스가 필요합니다." diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Latvian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Latvian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Latvian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Latvian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,73 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Latvian (http://www.transifex.com/projects/p/xbmc-main/language/lv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +msgctxt "#30000" +msgid "DVBViewer Recording Service IP Address" +msgstr "DVBViewer Recording Service IP adrese" + +msgctxt "#30001" +msgid "Webinterface Port" +msgstr "Tīmekļa saskarnes ports" + +msgctxt "#30002" +msgid "Username" +msgstr "Lietotājvārds" + +msgctxt "#30003" +msgid "Password" +msgstr "Parole" + +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Channel list vietā izmantot favourites" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Izmantot lokālu favourites failu" + +msgctxt "#30012" +msgid "Select the favourites.xml file" +msgstr "Izvēlēties favourites.xml failu" + +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Ieslēgt laika nobīdi" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Laika nobīdes bufera ceļš" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Izmantot RTSP straumēšanu tiešraides TV" + +msgctxt "#30100" +msgid "General" +msgstr "Vispārīgi" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Papildus" + +msgctxt "#30500" +msgid "Can't connect to the Recording Service" +msgstr "Nevar savienoties ar Recording Service" + +msgctxt "#30501" +msgid "Recording Service version %s or higher required" +msgstr "Nepieciešama Recording Service %s vai jaunāka versija" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Lithuanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Lithuanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Lithuanian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Lithuanian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Lithuanian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/lt/)\n" +"Language-Team: Lithuanian (http://www.transifex.com/projects/p/xbmc-main/language/lt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -22,13 +21,17 @@ msgstr "Web sąsajos prievadas" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Srauto prievadas" - -msgctxt "#30004" msgid "Username" -msgstr "Vartotojo slaptavardis" +msgstr "Vartotojo vardas" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Slaptažodis" + +msgctxt "#30100" +msgid "General" +msgstr "Pagrindinis" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Išplėstinis" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Macedonian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Macedonian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Macedonian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Macedonian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Macedonian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/mk/)\n" +"Language-Team: Macedonian (http://www.transifex.com/projects/p/xbmc-main/language/mk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,33 +25,25 @@ msgstr "Webinterface Port" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Streaming Port" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Recordings Port" - -msgctxt "#30004" msgid "Username" msgstr "Корисничко име" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Лозинка" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Превземи канали од favourites.xml наместо од channels.dat" - -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "Одбери favourites.xml папка" +msgctxt "#30100" +msgid "General" +msgstr "Општо" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Напредно" + msgctxt "#30500" msgid "Can't connect to the Recording Service" msgstr "Неможе да се поврзе на Recording Service" - -msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "Recording Service верзија 1.%d или повисока е потребна" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Malay/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Malay/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Malay/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Malay/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,73 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Malay (http://www.transifex.com/projects/p/xbmc-main/language/ms/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "DVBViewer Recording Service IP Address" +msgstr "Alamat IP Perkhidmatan Rakaman DVBViewer" + +msgctxt "#30001" +msgid "Webinterface Port" +msgstr "Port " + +msgctxt "#30002" +msgid "Username" +msgstr "Nama Pengguna" + +msgctxt "#30003" +msgid "Password" +msgstr "Kata Laluan" + +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Guna kegemaran selain dari senarai saluran" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Guna fail kegemaran setempat" + +msgctxt "#30012" +msgid "Select the favourites.xml file" +msgstr "Pilih fail favourites.xml" + +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Benarkan Anjak Masa" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Laluan penimbal Anjak Masa" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Guna penstriman RTSP untuk TV langsung" + +msgctxt "#30100" +msgid "General" +msgstr "Am" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Lanjutan" + +msgctxt "#30500" +msgid "Can't connect to the Recording Service" +msgstr "Tidak dapat sambung ke Perkhidmatan Rakaman" + +msgctxt "#30501" +msgid "Recording Service version %s or higher required" +msgstr "Perkhidmatan Rakaman versi %s atau lebih tinggi diperlukan" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Malayalam/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Malayalam/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Malayalam/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Malayalam/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Malayalam (http://www.transifex.com/projects/p/xbmc-main/language/ml/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ml\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30100" +msgid "General" +msgstr "പോതുവായത്" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Maltese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Maltese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Maltese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Maltese/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Maltese (http://www.transifex.com/projects/p/xbmc-main/language/mt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mt\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);\n" + +msgctxt "#30002" +msgid "Username" +msgstr "Username" + +msgctxt "#30003" +msgid "Password" +msgstr "Sigriet" + +msgctxt "#30100" +msgid "General" +msgstr "Ġenerali" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Maori/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Maori/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Maori/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Maori/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,33 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Maori (http://www.transifex.com/projects/p/xbmc-main/language/mi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mi\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30002" +msgid "Username" +msgstr "Ingoa kaiwhakamahi" + +msgctxt "#30003" +msgid "Password" +msgstr "Kupuhipa" + +msgctxt "#30100" +msgid "General" +msgstr "Āhuawhānui" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Arā Atu Anō" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Norwegian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Norwegian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Norwegian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Norwegian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,34 +1,49 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Norwegian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/no/)\n" +"Language-Team: Norwegian (http://www.transifex.com/projects/p/xbmc-main/language/no/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: no\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "DVBViewer Recording Service IP Address" +msgstr "DVBViewer Recording Service Ip Adresse" + msgctxt "#30001" msgid "Webinterface Port" msgstr "Webgrensesnitt Port" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Stream Port" - -msgctxt "#30004" msgid "Username" msgstr "Brukernavn" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Passord" + +msgctxt "#30012" +msgid "Select the favourites.xml file" +msgstr "Velg favourites.xml filen" + +msgctxt "#30100" +msgid "General" +msgstr "Generelt" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Avansert" + +msgctxt "#30500" +msgid "Can't connect to the Recording Service" +msgstr "Kan ikke koble til Recording Service" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Ossetic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Ossetic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Ossetic/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Ossetic/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Ossetic (http://www.transifex.com/projects/p/xbmc-main/language/os/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: os\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30100" +msgid "General" +msgstr "Сӕйраг" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Persian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Persian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Persian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Persian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,33 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Persian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fa/)\n" +"Language-Team: Persian (http://www.transifex.com/projects/p/xbmc-main/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa\n" "Plural-Forms: nplurals=1; plural=0;\n" -msgctxt "#30004" +msgctxt "#30002" msgid "Username" msgstr "نام کاربری" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "کلمه عبور" + +msgctxt "#30100" +msgid "General" +msgstr "عمومی" + +msgctxt "#30101" +msgid "Advanced" +msgstr "پیشرفته" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Persian (Iran)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Persian (Iran)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Persian (Iran)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Persian (Iran)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Persian (Iran) (http://www.transifex.com/projects/p/xbmc-main/language/fa_IR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa_IR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30002" +msgid "Username" +msgstr "نام کاربری" + +msgctxt "#30003" +msgid "Password" +msgstr "رمز عبور" + +msgctxt "#30100" +msgid "General" +msgstr "عمومی" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Polish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Polish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Polish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Polish/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Polish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pl/)\n" +"Language-Team: Polish (http://www.transifex.com/projects/p/xbmc-main/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,40 +18,56 @@ msgctxt "#30000" msgid "DVBViewer Recording Service IP Address" -msgstr "Adres IP usługi nagrywania DVBViewer" +msgstr "Adres IP usługi DVBViewer Recording Service" msgctxt "#30001" msgid "Webinterface Port" msgstr "Port interfejsu webowego" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Port strumieniowania" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Port nagrywania" - -msgctxt "#30004" msgid "Username" -msgstr "Użytkownik" +msgstr "Nazwa użytkownika" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Hasło" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Załaduj kanały z favourites.xml zamiast z channels.dat" +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Używaj ulubionych zamiast listy kanałów" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Używaj lokalnego pliku ulubionych" -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "Wybierz plik favourites.xml" +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Włącz funkcję przesunięcia czasowego" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Ścieżka do pliku bufora przesunięcia czasowego" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Używaj RTSP do strumieniowania telewizji" + +msgctxt "#30100" +msgid "General" +msgstr "Ogólne" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Zaawansowane" + msgctxt "#30500" msgid "Can't connect to the Recording Service" -msgstr "Nie można połączyć się z usługą nagrywania" +msgstr "Problem z połączeniem z usługą Recording Service" msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "Usługa nagrywania potrzebna w wersji 1.%d lub wyższej" +msgid "Recording Service version %s or higher required" +msgstr "Usługa Recording Service wymagana w wersji %s lub nowszej" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Portuguese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Portuguese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Portuguese/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Portuguese/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Portuguese (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pt/)\n" +"Language-Team: Portuguese (http://www.transifex.com/projects/p/xbmc-main/language/pt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,33 +25,49 @@ msgstr "Porta da interface Web" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Porta de Transmissão" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Porta das Gravações" - -msgctxt "#30004" msgid "Username" msgstr "Nome de Utilizador" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Palavra-passe" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Carregar canais de favourites.xml em vez de channels.dat" +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Usar favoritos em vez de lista de canais" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Usar ficheiro local de favoritos" -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "Seleccione o ficheiro favourites.xml" +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Activar Ver Mais Tarde" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Localização do buffer de Ver Mais Tarde" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Usar emissão RTSP para TV ao vivo" + +msgctxt "#30100" +msgid "General" +msgstr "Geral" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Avançado" + msgctxt "#30500" msgid "Can't connect to the Recording Service" msgstr "Não foi possível ligar ao Serviço de Gravação" msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "É necessária uma versão do Serviço de Gravação 1.%d ou mais recente." +msgid "Recording Service version %s or higher required" +msgstr "É necessária uma versão do Serviço de Gravação %s ou superior" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Portuguese (Brazil)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Portuguese (Brazil)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Portuguese (Brazil)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Portuguese (Brazil)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pt_BR/)\n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/xbmc-main/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -23,36 +22,52 @@ msgctxt "#30001" msgid "Webinterface Port" -msgstr "Porta Webinterface" +msgstr "Porta da Interface Web" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Porta Streaming" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Porta de Gravações" - -msgctxt "#30004" msgid "Username" -msgstr "Nome do usuário" +msgstr "Usuário" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Senha" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Carregar canais de favourites.xml ao invés de channels.dat" +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Usar favoritos ao invés da lista de canais" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Usar arquivos favoritos locais" -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "Selecione o arquivo favourites.xml" +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Ativar gravação" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Caminho do buffer de gravação" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Usar RTSP streaming para TV ao Vivo" + +msgctxt "#30100" +msgid "General" +msgstr "Geral" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Avançado" + msgctxt "#30500" msgid "Can't connect to the Recording Service" msgstr "Não pude me conectar ao Serviço de Gravação" msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "Versão de Serviço Gravações 1.%d ou maior é requerido" +msgid "Recording Service version %s or higher required" +msgstr "Versão do Serviço de Gravação %s ou maior é requerido" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Romanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Romanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Romanian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Romanian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Romanian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ro/)\n" +"Language-Team: Romanian (http://www.transifex.com/projects/p/xbmc-main/language/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,33 +25,37 @@ msgstr "Portul interfaței web" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Portul de streaming" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Portul de înregistrare " - -msgctxt "#30004" msgid "Username" msgstr "Utilizator" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Parolă" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Încarcă canalele din favourites.xml și nu din channels.dat" - -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "Selectează fișierul favourites.xml " +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Activeaza programul de inregistrare" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Calea tamponului de inregistrare" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Foloseste RTSP pentru TV in direct" + +msgctxt "#30100" +msgid "General" +msgstr "General" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Avansat" + msgctxt "#30500" msgid "Can't connect to the Recording Service" msgstr "Nu se poate conecta la Serviciul de înregistrare" - -msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "Este necesară o versiune 1.%d sau mai mare " diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Russian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Russian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Russian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Russian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Russian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ru/)\n" +"Language-Team: Russian (http://www.transifex.com/projects/p/xbmc-main/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,33 +25,49 @@ msgstr "Порт веб-интерфейса" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Порт видео-потока" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Порт записей" - -msgctxt "#30004" msgid "Username" msgstr "Имя пользователя" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Пароль" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Загружать каналы из favourites.xml вместо channels.dat" +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Использовать избранное вместо списка канала" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Использовать избранный локальный файл" -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "Выбрать файл favourites.xml" +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Включить таймшифт" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Путь к буферу таймшифт" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Использовать RTSP поток для вещания ТВ" + +msgctxt "#30100" +msgid "General" +msgstr "Общие" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Расширенный" + msgctxt "#30500" msgid "Can't connect to the Recording Service" msgstr "Не могу соединиться с сервисом записи" msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "Требуется версия сервиса записи 1.%d или выше" +msgid "Recording Service version %s or higher required" +msgstr "Служба записи требуется %s версии или выше" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Serbian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Serbian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Serbian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Serbian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,53 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Serbian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sr/)\n" +"Language-Team: Serbian (http://www.transifex.com/projects/p/xbmc-main/language/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -msgctxt "#30004" +msgctxt "#30000" +msgid "DVBViewer Recording Service IP Address" +msgstr "IP адреса услуге снимања DVBViewer-а" + +msgctxt "#30001" +msgid "Webinterface Port" +msgstr "Порт веб интерфејса" + +msgctxt "#30002" msgid "Username" msgstr "Korisničko ime" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Lozinka" + +msgctxt "#30012" +msgid "Select the favourites.xml file" +msgstr "Изаберите датотеку favourites.xml" + +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Омогући временски помак" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Путања до међумеморије временског помака" + +msgctxt "#30100" +msgid "General" +msgstr "Opšte" + +msgctxt "#30500" +msgid "Can't connect to the Recording Service" +msgstr "Не могу да се повежем са услугом снимања" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Serbian (Cyrillic)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Serbian (Cyrillic)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Serbian (Cyrillic)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Serbian (Cyrillic)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,29 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Serbian (Cyrillic) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sr_RS/)\n" +"Language-Team: Serbian (Cyrillic) (http://www.transifex.com/projects/p/xbmc-main/language/sr_RS/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr_RS\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -msgctxt "#30004" +msgctxt "#30002" msgid "Username" msgstr "Корисничко име" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Лозинка" + +msgctxt "#30100" +msgid "General" +msgstr "Опште" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Slovak/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Slovak/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Slovak/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Slovak/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Slovak (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sk/)\n" +"Language-Team: Slovak (http://www.transifex.com/projects/p/xbmc-main/language/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,33 +25,49 @@ msgstr "Port pre webové rozhranie" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Port pre streamovanie" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Port pre nahrávky" - -msgctxt "#30004" msgid "Username" -msgstr "Používateľské meno" +msgstr "Užívateľské meno" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Heslo" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Načítať kanály zo súboru favourites.xml namiesto zo súboru channels.dat" +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Použiť obľúbené namiesto zoznamu kanálov" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Použiť lokálny súbor s obľúbenými" -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "Vybrať súbor favourites.xml" +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Povoliť časový posun" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Cesta k zásobníku časového posunu" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Použiť RTSP streamovanie pre živú TV" + +msgctxt "#30100" +msgid "General" +msgstr "Hlavné" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Pokročilé" + msgctxt "#30500" msgid "Can't connect to the Recording Service" msgstr "Nie je možné sa pripojiť k nahrávacej službe" msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "Vyžaduje sa nahrávacia služba vo verzii 1.%d alebo vyššej" +msgid "Recording Service version %s or higher required" +msgstr "Vyžaduje sa služba nahrávania vo verzii %s alebo vyššej" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Slovenian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Slovenian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Slovenian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Slovenian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Slovenian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sl/)\n" +"Language-Team: Slovenian (http://www.transifex.com/projects/p/xbmc-main/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,33 +25,49 @@ msgstr "Vrata spletnega vmesnika" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Vrata za pretakanje" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Vrata posnetkov" - -msgctxt "#30004" msgid "Username" msgstr "Uporabniško ime" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Geslo" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Naloži programe iz favourites.xml namesto iz channels.dat" +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Uporabi priljubljene namesto seznama programov" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Uporabi krajevno datoteko priljubljenih" -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "Izberi datoteko favourites.xml" +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Omogoči časovni zamik" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Pot medpomnenja časovnega zamika" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Za TV v živo uporabi pretakanje RTSP" + +msgctxt "#30100" +msgid "General" +msgstr "Splošno" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Napredno" + msgctxt "#30500" msgid "Can't connect to the Recording Service" -msgstr "Ni se mogoče povezati s storitvijo DVBViewer" +msgstr "S storitvijo DVBViewer se ni mogoče povezati" msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "Potrebna je storitev DVBViewer različice 1.%d ali novejše" +msgid "Recording Service version %s or higher required" +msgstr "Potrebna je storitev DVBViewer različice %s ali novejše" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Spanish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Spanish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Spanish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Spanish/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es/)\n" +"Language-Team: Spanish (http://www.transifex.com/projects/p/xbmc-main/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,33 +25,49 @@ msgstr "Puerto interface web" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Puerto streaming" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Puerto de Grabaciones" - -msgctxt "#30004" msgid "Username" msgstr "Usuario" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Contraseña" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Cargar canales de favourites.xml en lugar de hacerlo de channels.dat" +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Usar favoritos en lugar de lista de canales" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Usar fichero local de favoritos" -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "Elegir el archivo favourites.xml" +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Activar TimeShift" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Ubicación del buffer de TimeShift" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Usar streaming RTSP para TV en vivo" + +msgctxt "#30100" +msgid "General" +msgstr "General" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Avanzado" + msgctxt "#30500" msgid "Can't connect to the Recording Service" msgstr "No se puede conectar con el Servicio de Grabación" msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "Versión del Servicio de Grabación requerida 1.%d o superior" +msgid "Recording Service version %s or higher required" +msgstr "Se necesita versión %s os superior del servicio de grabación" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Spanish (Argentina)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Spanish (Argentina)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Spanish (Argentina)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Spanish (Argentina)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es_AR/)\n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/xbmc-main/language/es_AR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,33 +25,33 @@ msgstr "Puerto interface web" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Puerto streaming" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Puerto de Grabaciones" - -msgctxt "#30004" msgid "Username" msgstr "Usuario" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Contraseña" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Cargar canales de favourites.xml en lugar de hacerlo de channels.dat" - -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" msgstr "Elegir el archivo favourites.xml" +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Activar Timeshift" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Ruta del buffer de Timeshift" + +msgctxt "#30100" +msgid "General" +msgstr "General" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Avanzado" + msgctxt "#30500" msgid "Can't connect to the Recording Service" msgstr "No se puede conectar con el Servicio de Grabación" - -msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "Versión del Servicio de Grabación requerida 1.%d o superior" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Spanish (Mexico)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Spanish (Mexico)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Spanish (Mexico)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Spanish (Mexico)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,33 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es_MX/)\n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/xbmc-main/language/es_MX/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es_MX\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgctxt "#30004" +msgctxt "#30002" msgid "Username" msgstr "Usuario" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Contraseña" + +msgctxt "#30100" +msgid "General" +msgstr "General" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Avanzado" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Swedish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Swedish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Swedish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Swedish/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Swedish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sv/)\n" +"Language-Team: Swedish (http://www.transifex.com/projects/p/xbmc-main/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,40 +18,56 @@ msgctxt "#30000" msgid "DVBViewer Recording Service IP Address" -msgstr "DVBViewer inspelningsservice IP-adress" +msgstr "IP-adress för DVBViewers inspelningstjänst" msgctxt "#30001" msgid "Webinterface Port" msgstr "Webbgränssnittsport" msgctxt "#30002" -msgid "Streaming Port" -msgstr "Strömningsport" - -msgctxt "#30003" -msgid "Recordings Port" -msgstr "Inspelningsport" - -msgctxt "#30004" msgid "Username" msgstr "Användarnamn" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Lösenord" -msgctxt "#30006" -msgid "Load channels from favourites.xml instead of from channels.dat" -msgstr "Ladda kanaler från favourites.xml istället för channels.dat" +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Använd favoriter istället för kanallista" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Använd lokal favoritfil" -msgctxt "#30007" +msgctxt "#30012" msgid "Select the favourites.xml file" -msgstr "Välj favourites.xml filen" +msgstr "Välj filen favourites.xml" + +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Aktivera Timeshift" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Buffertsökväg för Timeshift " + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Använd RTSP-strömning för direktsänd TV" + +msgctxt "#30100" +msgid "General" +msgstr "Allmänt" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Avancerad" msgctxt "#30500" msgid "Can't connect to the Recording Service" -msgstr "Kan inte ansluta till inspelningsservicen" +msgstr "Kan inte ansluta till inspelningstjänsten" msgctxt "#30501" -msgid "Recording Service version 1.%d or higher required" -msgstr "Inspelningsservice version 1.%d eller högre krävs" +msgid "Recording Service version %s or higher required" +msgstr "Inspelningsservice version %s eller högre krävs" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Tajik/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Tajik/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Tajik/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Tajik/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,33 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Tajik (http://www.transifex.com/projects/p/xbmc-main/language/tg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30002" +msgid "Username" +msgstr "Номи корбар" + +msgctxt "#30003" +msgid "Password" +msgstr "Парол" + +msgctxt "#30100" +msgid "General" +msgstr "Умумӣ" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Иловагӣ" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Tamil (India)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Tamil (India)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Tamil (India)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Tamil (India)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,57 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Tamil (India) (http://www.transifex.com/projects/p/xbmc-main/language/ta_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "DVBViewer Recording Service IP Address" +msgstr "DVBViewer பதிவு சேவை ஐபி முகவரி" + +msgctxt "#30001" +msgid "Webinterface Port" +msgstr "வலை இடைமுக முனையம்" + +msgctxt "#30002" +msgid "Username" +msgstr "பயனர்பெயர்" + +msgctxt "#30003" +msgid "Password" +msgstr "அடையாளச் சொல்" + +msgctxt "#30012" +msgid "Select the favourites.xml file" +msgstr "Favourites.xml கோப்பை தேர்ந்தெடுக்கவும்" + +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "நேரமாற்றத்தை செயல்படுத்து" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "நேரமாற்ற இடையக பாதை" + +msgctxt "#30100" +msgid "General" +msgstr "பொதுவானது" + +msgctxt "#30101" +msgid "Advanced" +msgstr "மேம்பட்ட" + +msgctxt "#30500" +msgid "Can't connect to the Recording Service" +msgstr "பதிவு சேவை இணைக்க முடியவில்லை" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Telugu/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Telugu/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Telugu/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Telugu/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Telugu (http://www.transifex.com/projects/p/xbmc-main/language/te/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: te\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30002" +msgid "Username" +msgstr "వాడుకరి పేరు" + +msgctxt "#30003" +msgid "Password" +msgstr "సంకేతపదం" + +msgctxt "#30100" +msgid "General" +msgstr "సాధారణం" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Thai/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Thai/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Thai/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Thai/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,33 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Thai (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/th/)\n" +"Language-Team: Thai (http://www.transifex.com/projects/p/xbmc-main/language/th/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: th\n" "Plural-Forms: nplurals=1; plural=0;\n" -msgctxt "#30004" +msgctxt "#30002" msgid "Username" msgstr "ชื่อผู้ใช้" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "รหัสผ่าน" + +msgctxt "#30100" +msgid "General" +msgstr "ทั่วไป" + +msgctxt "#30101" +msgid "Advanced" +msgstr "ขั้นสูง" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Turkish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Turkish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Turkish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Turkish/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,73 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Turkish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/tr/)\n" +"Language-Team: Turkish (http://www.transifex.com/projects/p/xbmc-main/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=1; plural=0;\n" -msgctxt "#30004" +msgctxt "#30000" +msgid "DVBViewer Recording Service IP Address" +msgstr "DVBViewer Kayıt Servisi IP Adresi" + +msgctxt "#30001" +msgid "Webinterface Port" +msgstr "Web arayüzü Portu" + +msgctxt "#30002" msgid "Username" -msgstr "Kullanıcı Adı" +msgstr "Kullanıcı adı" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Parola" + +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Kanal listeleri yerine favorileri kullan" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Yerel favoriler dosyasını kullan" + +msgctxt "#30012" +msgid "Select the favourites.xml file" +msgstr "favourites.xml dosyasını seç" + +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Zaman Kaydırma Aktif" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Zaman Kaydırma tampon bellek yolu" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Canlı TV için RTSP akışını kullan" + +msgctxt "#30100" +msgid "General" +msgstr "Genel" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Gelişmiş" + +msgctxt "#30500" +msgid "Can't connect to the Recording Service" +msgstr "Kayıt Servisi'ne bağlanılamıyor" + +msgctxt "#30501" +msgid "Recording Service version %s or higher required" +msgstr "Kayıt Servisi'nin %s veya daha yüksek sürümü gerekiyor" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Ukrainian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Ukrainian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Ukrainian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Ukrainian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,26 +1,49 @@ # XBMC Media Center language file # Addon Name: DVBViewer Client # Addon id: pvr.dvbviewer -# Addon version: 1.6.5 -# Addon Provider: jdembski, A600 +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Ukrainian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/uk/)\n" +"Language-Team: Ukrainian (http://www.transifex.com/projects/p/xbmc-main/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -msgctxt "#30004" +msgctxt "#30000" +msgid "DVBViewer Recording Service IP Address" +msgstr "IP адреса сервісу запису DVBViewer'а" + +msgctxt "#30001" +msgid "Webinterface Port" +msgstr "Порт веб-інтерфейсу" + +msgctxt "#30002" msgid "Username" msgstr "Ім'я користувача" -msgctxt "#30005" +msgctxt "#30003" msgid "Password" msgstr "Пароль" + +msgctxt "#30012" +msgid "Select the favourites.xml file" +msgstr "Вибір файлу favourites.xml" + +msgctxt "#30100" +msgid "General" +msgstr "Загальні" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Більше" + +msgctxt "#30500" +msgid "Can't connect to the Recording Service" +msgstr "Не можу з’єднатися з Сервісом запису" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Uzbek/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Uzbek/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Uzbek/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Uzbek/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Uzbek (http://www.transifex.com/projects/p/xbmc-main/language/uz/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uz\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30002" +msgid "Username" +msgstr "Foydalanuvchi nomi" + +msgctxt "#30003" +msgid "Password" +msgstr "Maxfiy so'z" + +msgctxt "#30100" +msgid "General" +msgstr "Umumiy" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Vietnamese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Vietnamese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Vietnamese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Vietnamese/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,49 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Vietnamese (http://www.transifex.com/projects/p/xbmc-main/language/vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "DVBViewer Recording Service IP Address" +msgstr "Địa chỉ IP của DVBViewer Recording Service" + +msgctxt "#30001" +msgid "Webinterface Port" +msgstr "Cổng Webinterface" + +msgctxt "#30002" +msgid "Username" +msgstr "Tên truy nhập" + +msgctxt "#30003" +msgid "Password" +msgstr "Mật khẩu" + +msgctxt "#30012" +msgid "Select the favourites.xml file" +msgstr "Chọn nguồn file favourites.xml" + +msgctxt "#30100" +msgid "General" +msgstr "Tổng Quan" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Nâng cao" + +msgctxt "#30500" +msgid "Can't connect to the Recording Service" +msgstr "Không kết nối được tới Recording Service" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Vietnamese (Viet Nam)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Vietnamese (Viet Nam)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Vietnamese (Viet Nam)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Vietnamese (Viet Nam)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/projects/p/xbmc-main/language/vi_VN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi_VN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30003" +msgid "Password" +msgstr "Mật khẩu" + +msgctxt "#30100" +msgid "General" +msgstr "Chung" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Nâng ca" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Welsh/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Welsh/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/language/Welsh/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/language/Welsh/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,73 @@ +# XBMC Media Center language file +# Addon Name: DVBViewer Client +# Addon id: pvr.dvbviewer +# Addon Provider: jdembski, A600, Manuel Mausz, Portisch +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Welsh (http://www.transifex.com/projects/p/xbmc-main/language/cy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" + +msgctxt "#30000" +msgid "DVBViewer Recording Service IP Address" +msgstr "Cyfeiriad IP Gwasanaeth Recordio DVBViewer" + +msgctxt "#30001" +msgid "Webinterface Port" +msgstr "Porth Rhyngwyneb Gwe" + +msgctxt "#30002" +msgid "Username" +msgstr "Enw defnyddiwr" + +msgctxt "#30003" +msgid "Password" +msgstr "Cyfrinair" + +msgctxt "#30010" +msgid "Use favourites instead of channel list" +msgstr "Defnyddio ffefrynnau yn lle'r rhestr sianeli" + +msgctxt "#30011" +msgid "Use local favourites file" +msgstr "Defnyddio ffeil ffefrynnau lleol" + +msgctxt "#30012" +msgid "Select the favourites.xml file" +msgstr "Dewis ffeil favourites.xml" + +msgctxt "#30020" +msgid "Enable Timeshift" +msgstr "Galluogi Symud Amser" + +msgctxt "#30021" +msgid "Timeshift buffer path" +msgstr "Llwybr byffro Symud Amser" + +msgctxt "#30030" +msgid "Use RTSP streaming for live TV" +msgstr "Defnyddio ffrydio RTSP ar gyfer Teledu Byw" + +msgctxt "#30100" +msgid "General" +msgstr "Cyffredinol" + +msgctxt "#30101" +msgid "Advanced" +msgstr "Uwch" + +msgctxt "#30500" +msgid "Can't connect to the Recording Service" +msgstr "Methu cysylltu â'r Gwasanaeth Recordio" + +msgctxt "#30501" +msgid "Recording Service version %s or higher required" +msgstr "Mae angen Gwasanaeth Recordio fersiwn %s or neu uwch" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/settings.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/settings.xml --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/addon/resources/settings.xml 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/addon/resources/settings.xml 2014-05-04 07:03:11.000000000 +0000 @@ -1,11 +1,23 @@ - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/Makefile.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/Makefile.am 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/Makefile.am 2014-05-04 07:03:11.000000000 +0000 @@ -14,6 +14,7 @@ libdvbviewer_addon_la_SOURCES = src/client.cpp \ src/DvbData.cpp \ - src/xmlParser.cpp + src/xmlParser.cpp \ + src/TimeshiftBuffer.cpp libdvbviewer_addon_la_LDFLAGS = @TARGET_LDFLAGS@ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/project/VS2010Express/pvr.dvbviewer.vcxproj xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/project/VS2010Express/pvr.dvbviewer.vcxproj --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/project/VS2010Express/pvr.dvbviewer.vcxproj 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/project/VS2010Express/pvr.dvbviewer.vcxproj 2014-05-04 07:03:11.000000000 +0000 @@ -54,7 +54,7 @@ Disabled MultiThreadedDebug ..\..\..\..\xbmc;..\..\..\..\lib;..\..\..\..\lib\platform\windows - _WINDLL;TARGET_WINDOWS;_WINSOCKAPI_;_USE_32BIT_TIME_T;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + _WINDLL;TARGET_WINDOWS;_WINSOCKAPI_;_USE_32BIT_TIME_T;_CRT_SECURE_NO_WARNINGS;__STDC_FORMAT_MACROS;%(PreprocessorDefinitions) true @@ -71,7 +71,7 @@ true MultiThreaded ..\..\..\..\xbmc;..\..\..\..\lib;..\..\..\..\lib\platform\windows - _WINDLL;TARGET_WINDOWS;_WINSOCKAPI_;_USE_32BIT_TIME_T;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + _WINDLL;TARGET_WINDOWS;_WINSOCKAPI_;_USE_32BIT_TIME_T;_CRT_SECURE_NO_WARNINGS;__STDC_FORMAT_MACROS;%(PreprocessorDefinitions) true @@ -86,11 +86,13 @@ + + @@ -100,4 +102,4 @@ - \ No newline at end of file + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/project/VS2010Express/pvr.dvbviewer.vcxproj.filters xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/project/VS2010Express/pvr.dvbviewer.vcxproj.filters --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/project/VS2010Express/pvr.dvbviewer.vcxproj.filters 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/project/VS2010Express/pvr.dvbviewer.vcxproj.filters 2014-05-04 07:03:11.000000000 +0000 @@ -24,6 +24,9 @@ Source Files + + Source Files + @@ -35,5 +38,8 @@ Header Files + + Header Files + - \ No newline at end of file + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/src/client.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/src/client.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/src/client.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/src/client.cpp 2014-05-04 07:03:11.000000000 +0000 @@ -20,87 +20,87 @@ */ #include "client.h" -#include "xbmc_pvr_dll.h" -#include #include "DvbData.h" +#include "xbmc_pvr_dll.h" #include "platform/util/util.h" +#include -using namespace std; using namespace ADDON; -bool m_bCreated = false; ADDON_STATUS m_CurStatus = ADDON_STATUS_UNKNOWN; -//int g_iClientId = -1; /* User adjustable settings are saved here. * Default values are defined inside client.h * and exported to the other source files. */ -std::string g_strHostname = DEFAULT_HOST; -int g_iConnectTimeout = DEFAULT_CONNECT_TIMEOUT; -int g_iPortWeb = DEFAULT_WEB_PORT; -int g_iPortStream = DEFAULT_STREAM_PORT; -int g_iPortRecording = DEFAULT_RECORDING_PORT; -std::string g_strUsername = ""; -std::string g_strPassword = ""; -bool g_bUseFavourites = false; -std::string g_strFavouritesPath = ""; - -CHelper_libXBMC_addon *XBMC = NULL; -CHelper_libXBMC_pvr *PVR = NULL; -Dvb *DvbData = NULL; - -extern "C" { +CStdString g_strHostname = DEFAULT_HOST; +int g_iConnectTimeout = DEFAULT_CONNECT_TIMEOUT; +int g_iPortWeb = DEFAULT_WEB_PORT; +CStdString g_strUsername = ""; +CStdString g_strPassword = ""; +bool g_useFavourites = false; +bool g_useFavouritesFile = false; +CStdString g_favouritesFile = ""; +bool g_bUseTimeshift = false; +CStdString g_strTimeshiftBufferPath = DEFAULT_TSBUFFERPATH; +bool g_useRTSP = false; + +CHelper_libXBMC_addon *XBMC = NULL; +CHelper_libXBMC_pvr *PVR = NULL; +Dvb *DvbData = NULL; +extern "C" +{ void ADDON_ReadSettings(void) { - /* read setting "host" from settings.xml */ - char * buffer; - buffer = (char*) malloc (1024); - buffer[0] = 0; /* Set the end of string */ + char buffer[1024]; if (XBMC->GetSetting("host", buffer)) g_strHostname = buffer; - else - g_strHostname = DEFAULT_HOST; - buffer[0] = 0; /* Set the end of string */ - /* read setting "user" from settings.xml */ if (XBMC->GetSetting("user", buffer)) g_strUsername = buffer; - else - g_strUsername = ""; - buffer[0] = 0; /* Set the end of string */ - - /* read setting "pass" from settings.xml */ + if (XBMC->GetSetting("pass", buffer)) g_strPassword = buffer; - else - g_strPassword = ""; - - /* read setting "streamport" from settings.xml */ - if (!XBMC->GetSetting("streamport", &g_iPortStream)) - g_iPortStream = DEFAULT_STREAM_PORT; - - /* read setting "webport" from settings.xml */ + if (!XBMC->GetSetting("webport", &g_iPortWeb)) g_iPortWeb = DEFAULT_WEB_PORT; - /* read setting "recordingport" from settings.xml */ - if (!XBMC->GetSetting("recordingport", &g_iPortRecording)) - g_iPortRecording = DEFAULT_RECORDING_PORT; - - /* read setting "usefavourites" from settings.xml */ - if (!XBMC->GetSetting("usefavourites", &g_bUseFavourites)) - g_bUseFavourites = false; - - /* read setting "favouritespath" from settings.xml */ - if (XBMC->GetSetting("favouritespath", buffer)) - g_strFavouritesPath = buffer; - else - g_strFavouritesPath = ""; + if (!XBMC->GetSetting("usefavourites", &g_useFavourites)) + g_useFavourites = false; + + if (XBMC->GetSetting("usefavouritesfile", &g_useFavouritesFile)) + g_useFavouritesFile = false; - free (buffer); + if (g_useFavouritesFile && XBMC->GetSetting("favouritesfile", buffer)) + g_favouritesFile = buffer; + + if (!XBMC->GetSetting("usetimeshift", &g_bUseTimeshift)) + g_bUseTimeshift = false; + + if (XBMC->GetSetting("timeshiftpath", buffer)) + g_strTimeshiftBufferPath = buffer; + + if (!XBMC->GetSetting("usertsp", &g_useRTSP) || g_bUseTimeshift) + g_useRTSP = false; + + /* Log the current settings for debugging purposes */ + XBMC->Log(LOG_DEBUG, "DVBViewer Addon Configuration options"); + XBMC->Log(LOG_DEBUG, "Hostname: %s", g_strHostname.c_str()); + if (!g_strUsername.empty() && !g_strPassword.empty()) + { + XBMC->Log(LOG_DEBUG, "Username: %s", g_strUsername.c_str()); + XBMC->Log(LOG_DEBUG, "Password: %s", g_strPassword.c_str()); + } + XBMC->Log(LOG_DEBUG, "WebPort: %d", g_iPortWeb); + XBMC->Log(LOG_DEBUG, "Use favourites: %s", (g_useFavourites) ? "yes" : "no"); + if (g_useFavouritesFile) + XBMC->Log(LOG_DEBUG, "Favourites File: %s", g_favouritesFile.c_str()); + XBMC->Log(LOG_DEBUG, "Timeshift: %s", (g_bUseTimeshift) ? "enabled" : "disabled"); + if (g_bUseTimeshift) + XBMC->Log(LOG_DEBUG, "Timeshift Buffer Path: %s", g_strTimeshiftBufferPath.c_str()); + XBMC->Log(LOG_DEBUG, "Use RTSP: %s", (g_useRTSP) ? "yes" : "no"); } ADDON_STATUS ADDON_Create(void* hdl, void* props) @@ -108,16 +108,14 @@ if (!hdl || !props) return ADDON_STATUS_UNKNOWN; - PVR_PROPERTIES* pvrprops = (PVR_PROPERTIES*)props; - - XBMC = new CHelper_libXBMC_addon; + XBMC = new CHelper_libXBMC_addon(); if (!XBMC->RegisterMe(hdl)) { SAFE_DELETE(XBMC); return ADDON_STATUS_PERMANENT_FAILURE; } - PVR = new CHelper_libXBMC_pvr; + PVR = new CHelper_libXBMC_pvr(); if (!PVR->RegisterMe(hdl)) { SAFE_DELETE(PVR); @@ -126,14 +124,12 @@ } XBMC->Log(LOG_DEBUG, "%s - Creating DVBViewer PVR-Client", __FUNCTION__); - - m_CurStatus = ADDON_STATUS_UNKNOWN; - //g_iClientId = pvrprops->iClientId; //removed from Frodo PVR API + m_CurStatus = ADDON_STATUS_UNKNOWN; ADDON_ReadSettings(); - DvbData = new Dvb; - if (!DvbData->Open()) + DvbData = new Dvb(); + if (!DvbData->Open()) { SAFE_DELETE(DvbData); SAFE_DELETE(PVR); @@ -143,7 +139,6 @@ } m_CurStatus = ADDON_STATUS_OK; - m_bCreated = true; return m_CurStatus; } @@ -170,73 +165,75 @@ return true; } -unsigned int ADDON_GetSettings(ADDON_StructSetting ***sSet) +unsigned int ADDON_GetSettings(ADDON_StructSetting ***_UNUSED(sSet)) { return 0; } ADDON_STATUS ADDON_SetSetting(const char *settingName, const void *settingValue) { - string str = settingName; - if (str == "host") + // SetSetting can occur when the addon is enabled, but TV support still + // disabled. In that case the addon is not loaded, so we should not try + // to change its settings. + if (!XBMC) + return ADDON_STATUS_OK; + + CStdString sname(settingName); + if (sname == "host") { - string tmp_sHostname; - XBMC->Log(LOG_INFO, "%s - Changed Setting 'host' from %s to %s", __FUNCTION__, g_strHostname.c_str(), (const char*) settingValue); - tmp_sHostname = g_strHostname; - g_strHostname = (const char*) settingValue; - if (tmp_sHostname != g_strHostname) + if (g_strHostname.compare((const char *)settingValue) != 0) return ADDON_STATUS_NEED_RESTART; } - else if (str == "user") + else if (sname == "user") { - string tmp_sUsername = g_strUsername; - g_strUsername = (const char*) settingValue; - if (tmp_sUsername != g_strUsername) - { - XBMC->Log(LOG_INFO, "%s - Changed Setting 'user'", __FUNCTION__); + if (g_strUsername.compare((const char *)settingValue) != 0) return ADDON_STATUS_NEED_RESTART; - } } - else if (str == "pass") + else if (sname == "pass") { - string tmp_sPassword = g_strPassword; - g_strPassword = (const char*) settingValue; - if (tmp_sPassword != g_strPassword) - { - XBMC->Log(LOG_INFO, "%s - Changed Setting 'pass'", __FUNCTION__); + if (g_strPassword.compare((const char *)settingValue) != 0) return ADDON_STATUS_NEED_RESTART; - } } - else if (str == "streamport") + else if (sname == "webport") { - int iNewValue = *(int*) settingValue + 1; - if (g_iPortStream != iNewValue) - { - XBMC->Log(LOG_INFO, "%s - Changed Setting 'streamport' from %u to %u", __FUNCTION__, g_iPortStream, iNewValue); - g_iPortStream = iNewValue; + if (g_iPortWeb != *(int *)settingValue) return ADDON_STATUS_NEED_RESTART; - } } - else if (str == "webport") + else if (sname == "usefavourites") { - int iNewValue = *(int*) settingValue + 1; - if (g_iPortWeb != iNewValue) - { - XBMC->Log(LOG_INFO, "%s - Changed Setting 'webport' from %u to %u", __FUNCTION__, g_iPortWeb, iNewValue); - g_iPortWeb = iNewValue; + if (g_useFavourites != *(bool *)settingValue) return ADDON_STATUS_NEED_RESTART; - } } - else if (str == "recordingport") + else if (sname == "usefavouritesfile") { - int iNewValue = *(int*) settingValue + 1; - if (g_iPortRecording != iNewValue) - { - XBMC->Log(LOG_INFO, "%s - Changed Setting 'recordingport' from %u to %u", __FUNCTION__, g_iPortRecording, iNewValue); - g_iPortRecording = iNewValue; + if (g_useFavouritesFile != *(bool *)settingValue) + return ADDON_STATUS_NEED_RESTART; + } + else if (sname == "favouritesfile") + { + if (g_favouritesFile.compare((const char *)settingValue) != 0) + return ADDON_STATUS_NEED_RESTART; + } + else if (sname == "usetimeshift") + { + if (g_bUseTimeshift != *(bool *)settingValue) return ADDON_STATUS_NEED_RESTART; + } + else if (sname == "timeshiftpath") + { + CStdString newValue = (const char *)settingValue; + if (g_strTimeshiftBufferPath != newValue) + { + XBMC->Log(LOG_DEBUG, "%s - Changed Setting '%s' from '%s' to '%s'", __FUNCTION__, + settingName, g_strTimeshiftBufferPath.c_str(), newValue.c_str()); + g_strTimeshiftBufferPath = newValue; } } + else if (sname == "usertsp") + { + if (g_useRTSP != *(bool *)settingValue) + return ADDON_STATUS_NEED_RESTART; + } return ADDON_STATUS_OK; } @@ -248,6 +245,11 @@ { } +void ADDON_Announce(const char *_UNUSED(flag), const char *_UNUSED(sender), + const char *_UNUSED(message), const void *_UNUSED(data)) +{ +} + /*********************************************************** * PVR Client AddOn specific public library functions ***********************************************************/ @@ -264,10 +266,20 @@ return strMinApiVersion; } +const char* GetGUIAPIVersion(void) +{ + static const char *strGuiApiVersion = XBMC_GUI_API_VERSION; + return strGuiApiVersion; +} + +const char* GetMininumGUIAPIVersion(void) +{ + static const char *strMinGuiApiVersion = XBMC_GUI_MIN_API_VERSION; + return strMinGuiApiVersion; +} + PVR_ERROR GetAddonCapabilities(PVR_ADDON_CAPABILITIES* pCapabilities) { - //pCapabilities->bSupportsChannelSettings = false; - //pCapabilities->bSupportsTimeshift = false; pCapabilities->bSupportsEPG = true; pCapabilities->bSupportsTV = true; pCapabilities->bSupportsRadio = true; @@ -284,30 +296,34 @@ const char *GetBackendName(void) { - static const char *strBackendName = DvbData ? DvbData->GetServerName() : "unknown"; - return strBackendName; + static const CStdString name = DvbData ? DvbData->GetBackendName() + : "unknown"; + return name.c_str(); } const char *GetBackendVersion(void) { - static const char *strBackendVersion = "UNKNOWN"; - return strBackendVersion; + static const CStdString version = DvbData ? DvbData->GetBackendVersion() + : "UNKNOWN"; + return version.c_str(); } -static CStdString strConnectionString; - const char *GetConnectionString(void) { + static CStdString conn; if (DvbData) - strConnectionString.Format("%s%s", g_strHostname.c_str(), DvbData->IsConnected() ? "" : " (Not connected!)"); + conn.Format("%s%s", g_strHostname, DvbData->IsConnected() ? "" : " (Not connected!)"); else - strConnectionString.Format("%s (addon error!)", g_strHostname.c_str()); - return strConnectionString.c_str(); + conn.Format("%s (addon error!)", g_strHostname); + return conn.c_str(); } PVR_ERROR GetDriveSpace(long long *iTotal, long long *iUsed) { - return PVR_ERROR_SERVER_ERROR; + if (!DvbData || !DvbData->IsConnected()) + return PVR_ERROR_SERVER_ERROR; + + return DvbData->GetDriveSpace(iTotal, iUsed); } PVR_ERROR GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart, time_t iEnd) @@ -358,7 +374,7 @@ return DvbData->DeleteRecording(recording); } -PVR_ERROR RenameRecording(const PVR_RECORDING &recording) +PVR_ERROR RenameRecording(const PVR_RECORDING &_UNUSED(recording)) { return PVR_ERROR_NOT_IMPLEMENTED; } @@ -387,7 +403,7 @@ return DvbData->AddTimer(timer); } -PVR_ERROR DeleteTimer(const PVR_TIMER &timer, bool bForceDelete) +PVR_ERROR DeleteTimer(const PVR_TIMER &timer, bool _UNUSED(bForceDelete)) { if (!DvbData || !DvbData->IsConnected()) return PVR_ERROR_SERVER_ERROR; @@ -424,87 +440,132 @@ if (!DvbData || !DvbData->IsConnected()) return PVR_ERROR_SERVER_ERROR; - return DvbData->GetNumChannelGroups(); + return DvbData->GetChannelGroupsAmount(); } PVR_ERROR GetChannelGroups(ADDON_HANDLE handle, bool bRadio) { - if (bRadio) - return PVR_ERROR_NO_ERROR; - if (!DvbData || !DvbData->IsConnected()) return PVR_ERROR_SERVER_ERROR; - return DvbData->GetChannelGroups(handle); + return DvbData->GetChannelGroups(handle, bRadio); } PVR_ERROR GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group) { - if (group.bIsRadio) - return PVR_ERROR_NO_ERROR; - if (!DvbData || !DvbData->IsConnected()) return PVR_ERROR_SERVER_ERROR; return DvbData->GetChannelGroupMembers(handle, group); } -void CloseLiveStream(void) -{ +void CloseLiveStream(void) +{ DvbData->CloseLiveStream(); -}; +} -bool OpenLiveStream(const PVR_CHANNEL &channel) -{ +bool OpenLiveStream(const PVR_CHANNEL &channel) +{ if (!DvbData || !DvbData->IsConnected()) return false; return DvbData->OpenLiveStream(channel); } -const char * GetLiveStreamURL(const PVR_CHANNEL &channel) -{ +const char *GetLiveStreamURL(const PVR_CHANNEL &channel) +{ if (!DvbData || !DvbData->IsConnected()) return ""; - return DvbData->GetLiveStreamURL(channel); + return DvbData->GetLiveStreamURL(channel).c_str(); +} + +bool CanPauseStream(void) +{ + if (!DvbData || !DvbData->IsConnected()) + return false; + + return g_bUseTimeshift; +} + +bool CanSeekStream(void) +{ + if (!DvbData || !DvbData->IsConnected()) + return false; + + return g_bUseTimeshift; +} + +int ReadLiveStream(unsigned char *pBuffer, unsigned int iBufferSize) +{ + if (!DvbData || !DvbData->IsConnected()) + return 0; + + return DvbData->ReadLiveStream(pBuffer, iBufferSize); +} + +long long SeekLiveStream(long long iPosition, int iWhence /* = SEEK_SET */) +{ + if (!DvbData || !DvbData->IsConnected()) + return -1; + + return DvbData->SeekLiveStream(iPosition, iWhence); +} + +long long PositionLiveStream(void) +{ + if (!DvbData || !DvbData->IsConnected()) + return -1; + + return DvbData->PositionLiveStream(); +} + +long long LengthLiveStream(void) +{ + if (!DvbData || !DvbData->IsConnected()) + return 0; + + return DvbData->LengthLiveStream(); } PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS &signalStatus) { - return DvbData->SignalStatus(signalStatus); + // the RS api doesn't provide information about signal quality (yet) + strncpy(signalStatus.strAdapterName, "DVBViewer Recording Service", + sizeof(signalStatus.strAdapterName)); + strncpy(signalStatus.strAdapterStatus, "OK", + sizeof(signalStatus.strAdapterStatus)); + return PVR_ERROR_NO_ERROR; } /** UNUSED API FUNCTIONS */ -PVR_ERROR GetStreamProperties(PVR_STREAM_PROPERTIES* pProperties) { return PVR_ERROR_NOT_IMPLEMENTED; } +PVR_ERROR GetStreamProperties(PVR_STREAM_PROPERTIES* _UNUSED(pProperties)) { return PVR_ERROR_NOT_IMPLEMENTED; } void DemuxAbort(void) { return; } DemuxPacket* DemuxRead(void) { return NULL; } PVR_ERROR DialogChannelScan(void) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR DeleteChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR RenameChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR MoveChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR DialogChannelSettings(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR DialogAddChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } -bool OpenRecordedStream(const PVR_RECORDING &recording) { return false; } +PVR_ERROR CallMenuHook(const PVR_MENUHOOK &_UNUSED(menuhook), const PVR_MENUHOOK_DATA &_UNUSED(item)) { return PVR_ERROR_NOT_IMPLEMENTED; } +PVR_ERROR DeleteChannel(const PVR_CHANNEL &_UNUSED(channel)) { return PVR_ERROR_NOT_IMPLEMENTED; } +PVR_ERROR RenameChannel(const PVR_CHANNEL &_UNUSED(channel)) { return PVR_ERROR_NOT_IMPLEMENTED; } +PVR_ERROR MoveChannel(const PVR_CHANNEL &_UNUSED(channel)) { return PVR_ERROR_NOT_IMPLEMENTED; } +PVR_ERROR DialogChannelSettings(const PVR_CHANNEL &_UNUSED(channel)) { return PVR_ERROR_NOT_IMPLEMENTED; } +PVR_ERROR DialogAddChannel(const PVR_CHANNEL &_UNUSED(channel)) { return PVR_ERROR_NOT_IMPLEMENTED; } +bool OpenRecordedStream(const PVR_RECORDING &_UNUSED(recording)) { return false; } void CloseRecordedStream(void) {} -int ReadRecordedStream(unsigned char *pBuffer, unsigned int iBufferSize) { return 0; } -long long SeekRecordedStream(long long iPosition, int iWhence /* = SEEK_SET */) { return 0; } -long long PositionRecordedStream(void) { return -1; } -long long LengthRecordedStream(void) { return 0; } +int ReadRecordedStream(unsigned char *_UNUSED(pBuffer), unsigned int _UNUSED(iBufferSize)) { return 0; } +long long SeekRecordedStream(long long _UNUSED(iPosition), int _UNUSED(iWhence) /* = SEEK_SET */) { return 0; } void DemuxReset(void) {} void DemuxFlush(void) {} -int ReadLiveStream(unsigned char *pBuffer, unsigned int iBufferSize) { return 0; } -long long SeekLiveStream(long long iPosition, int iWhence /* = SEEK_SET */) { return -1; } -long long PositionLiveStream(void) { return -1; } -long long LengthLiveStream(void) { return -1; } -PVR_ERROR SetRecordingPlayCount(const PVR_RECORDING &recording, int count) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR SetRecordingLastPlayedPosition(const PVR_RECORDING &recording, int lastplayedposition) { return PVR_ERROR_NOT_IMPLEMENTED; } -int GetRecordingLastPlayedPosition(const PVR_RECORDING &recording) { return -1; } +long long PositionRecordedStream(void) { return -1; } +long long LengthRecordedStream(void) { return -1; } +PVR_ERROR SetRecordingPlayCount(const PVR_RECORDING &_UNUSED(recording), int _UNUSED(count)) { return PVR_ERROR_NOT_IMPLEMENTED; } +PVR_ERROR SetRecordingLastPlayedPosition(const PVR_RECORDING &_UNUSED(recording), int _UNUSED(lastplayedposition)) { return PVR_ERROR_NOT_IMPLEMENTED; } +int GetRecordingLastPlayedPosition(const PVR_RECORDING &_UNUSED(recording)) { return -1; } +PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY[], int*) { return PVR_ERROR_NOT_IMPLEMENTED; }; unsigned int GetChannelSwitchDelay(void) { return 0; } -void PauseStream(bool bPaused) {} -bool CanPauseStream(void) { return false; } -bool CanSeekStream(void) { return false; } -bool SeekTime(int,bool,double*) { return false; } +void PauseStream(bool _UNUSED(bPaused)) {} +bool SeekTime(int, bool, double*) { return false; } void SetSpeed(int) {}; +time_t GetPlayingTime() { return 0; } +time_t GetBufferTimeStart() { return 0; } +time_t GetBufferTimeEnd() { return 0; } } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/src/client.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/src/client.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/src/client.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/src/client.h 2014-05-04 07:03:11.000000000 +0000 @@ -20,24 +20,49 @@ * */ +#ifndef PVR_DVBVIEWER_CLIENT_H +#define PVR_DVBVIEWER_CLIENT_H + #include "libXBMC_addon.h" #include "libXBMC_pvr.h" +#include "libXBMC_gui.h" +#include "platform/util/StdString.h" + +#ifndef _UNUSED +#if defined(__GNUC__) +# define _UNUSED(x) UNUSED_ ## x __attribute__((unused)) +#elif defined(__LCLINT__) +# define _UNUSED(x) /*@unused@*/ x +#else +# define _UNUSED(x) x +#endif +#endif + +#define STR(x) #x +#define XSTR(x) STR(x) + +/*! + * @brief PVR macros for string exchange + */ +#define PVR_STRCPY(dest, source) do { strncpy(dest, source, sizeof(dest)-1); dest[sizeof(dest)-1] = '\0'; } while(0) +#define PVR_STRCLR(dest) memset(dest, 0, sizeof(dest)) #define DEFAULT_HOST "127.0.0.1" #define DEFAULT_CONNECT_TIMEOUT 30 #define DEFAULT_WEB_PORT 8089 -#define DEFAULT_STREAM_PORT 7522 -#define DEFAULT_RECORDING_PORT 8090 +#define DEFAULT_TSBUFFERPATH "special://userdata/addon_data/pvr.dvbviewer" + +extern CStdString g_strHostname; +extern int g_iPortWeb; +extern CStdString g_strUsername; +extern CStdString g_strPassword; +extern bool g_useFavourites; +extern bool g_useFavouritesFile; +extern CStdString g_favouritesFile; +extern bool g_bUseTimeshift; +extern CStdString g_strTimeshiftBufferPath; +extern bool g_useRTSP; +extern ADDON::CHelper_libXBMC_addon *XBMC; +extern CHelper_libXBMC_pvr *PVR; -extern bool m_bCreated; -extern std::string g_strHostname; -extern int g_iPortStream; -extern int g_iPortWeb; -extern int g_iPortRecording; -extern std::string g_strUsername; -extern std::string g_strPassword; -extern bool g_bUseFavourites; -extern std::string g_strFavouritesPath; -//extern int g_iClientId; -extern ADDON::CHelper_libXBMC_addon * XBMC; -extern CHelper_libXBMC_pvr * PVR; +#endif diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/src/DvbData.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/src/DvbData.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/src/DvbData.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/src/DvbData.cpp 2014-05-04 07:03:11.000000000 +0000 @@ -1,723 +1,1023 @@ #include "DvbData.h" - -#include "client.h" +#include "client.h" +#include "platform/util/util.h" +#include +#include +#include +#include +#include using namespace ADDON; using namespace PLATFORM; -void Dvb::TimerUpdates() +template +void tokenize(const CStdString& str, ContainerT& tokens, + const CStdString& delimiters = " ", const bool trimEmpty = false) { - std::vector newtimer = LoadTimers(); - - for (unsigned int i=0; iLog(LOG_INFO, "%s Removed timer: '%s', ClientIndex: '%d'", __FUNCTION__, m_timers.at(i).strTitle.c_str(), m_timers.at(i).iClientIndex); - m_timers.erase(m_timers.begin()+i); - i=0; - iRemoved++; + if (pos != lastPos || !trimEmpty) + tokens.push_back(typename ContainerT::value_type(str.data() + lastPos, pos - lastPos)); } + lastPos = pos + 1; } - unsigned int iNew=0; +}; - for (unsigned int i=0; iLog(LOG_INFO, "%s New timer: '%s', ClientIndex: '%d'", __FUNCTION__, timer.strTitle.c_str(), m_iClientIndexCounter); - m_timers.push_back(timer); - m_iClientIndexCounter++; - iNew++; - } - } - - XBMC->Log(LOG_INFO, "%s No of timers: removed [%d], untouched [%d], updated '%d', new '%d'", __FUNCTION__, iRemoved, iUnchanged, iUpdated, iNew); - if (iRemoved != 0 || iUpdated != 0 || iNew != 0) - { - XBMC->Log(LOG_INFO, "%s Changes in timerlist detected, trigger an update!", __FUNCTION__); - PVR->TriggerTimerUpdate(); - } -} - -Dvb::Dvb() +Dvb::Dvb() + : m_connected(false), m_backendVersion(0) { - m_bIsConnected = false; - m_strServerName = "DVBViewer"; - CStdString strURL = "", strURLStream = "", strURLRecording = ""; - // simply add user@pass in front of the URL if username/password is set - if ((g_strUsername.length() > 0) && (g_strPassword.length() > 0)) - strURL.Format("%s:%s@", g_strUsername.c_str(), g_strPassword.c_str()); - strURL.Format("http://%s%s:%u/", strURL.c_str(), g_strHostname.c_str(), g_iPortWeb); - m_strURL = strURL.c_str(); - - if ((g_strUsername.length() > 0) && (g_strPassword.length() > 0)) - strURLRecording.Format("%s:%s@", g_strUsername.c_str(), g_strPassword.c_str()); - strURLRecording.Format("http://%s%s:%u/", strURLRecording.c_str(), g_strHostname.c_str(), g_iPortRecording); - m_strURLRecording = strURLRecording.c_str(); - - if ((g_strUsername.length() > 0) && (g_strPassword.length() > 0)) - strURLStream.Format("%s:%s@", g_strUsername.c_str(), g_strPassword.c_str()); - strURLStream.Format("http://%s%s:%u/", strURLStream.c_str(), g_strHostname.c_str(), g_iPortStream); - m_strURLStream = strURLStream.c_str(); - - m_iNumRecordings = 0; - m_iNumChannelGroups = 0; - m_iCurrentChannel = -1; + CStdString strAuth(""); + if (!g_strUsername.empty() && !g_strPassword.empty()) + strAuth.Format("%s:%s@", g_strUsername.c_str(), g_strPassword.c_str()); + m_strURL.Format("http://%s%s:%u/", strAuth.c_str(), g_strHostname.c_str(), + g_iPortWeb); + + m_currentChannel = 0; m_iClientIndexCounter = 1; - m_iUpdateTimer = 0; + m_iUpdateTimer = 0; m_bUpdateTimers = false; - m_bUpdateEPG = false; + m_bUpdateEPG = false; + m_tsBuffer = NULL; +} + +Dvb::~Dvb() +{ + StopThread(); + if (m_tsBuffer) + SAFE_DELETE(m_tsBuffer); + + for (DvbChannels_t::iterator channel = m_channels.begin(); + channel != m_channels.end(); ++channel) + delete *channel; } bool Dvb::Open() { CLockObject lock(m_mutex); - XBMC->Log(LOG_NOTICE, "%s - DVBViewer Addon Configuration options", __FUNCTION__); - XBMC->Log(LOG_NOTICE, "%s - Hostname: '%s'", __FUNCTION__, g_strHostname.c_str()); - XBMC->Log(LOG_NOTICE, "%s - WebPort: '%d'", __FUNCTION__, g_iPortWeb); - XBMC->Log(LOG_NOTICE, "%s - StreamPort: '%d'", __FUNCTION__, g_iPortStream); - - m_bIsConnected = GetDeviceInfo(); + m_connected = CheckBackendVersion(); + if (!m_connected) + return false; - if (!m_bIsConnected) + if (!UpdateBackendStatus(true)) return false; if (!LoadChannels()) return false; - GetPreferredLanguage(); - GetTimeZone(); - TimerUpdates(); - XBMC->Log(LOG_INFO, "%s Starting separate client update thread...", __FUNCTION__); + XBMC->Log(LOG_INFO, "Starting separate client update thread..."); CreateThread(); - - return IsRunning(); + + return IsRunning(); +} + +bool Dvb::IsConnected() +{ + return m_connected; +} + +CStdString Dvb::GetBackendName() +{ + // RS api doesn't provide a reliable way to extract the server name + return "DVBViewer"; +} + +CStdString Dvb::GetBackendVersion() +{ + CStdString version; + version.Format("%u.%u.%u.%u", + m_backendVersion >> 24 & 0xFF, + m_backendVersion >> 16 & 0xFF, + m_backendVersion >> 8 & 0xFF, + m_backendVersion & 0xFF); + return version; +} + +PVR_ERROR Dvb::GetDriveSpace(long long *total, long long *used) +{ + if (!UpdateBackendStatus()) + return PVR_ERROR_SERVER_ERROR; + *total = m_diskspace.total; + *used = m_diskspace.used; + return PVR_ERROR_NO_ERROR; +} + +bool Dvb::SwitchChannel(const PVR_CHANNEL& channel) +{ + m_currentChannel = channel.iUniqueId; + m_bUpdateEPG = true; + return true; } -void *Dvb::Process() +unsigned int Dvb::GetCurrentClientChannel(void) { - XBMC->Log(LOG_DEBUG, "%s - starting", __FUNCTION__); + return m_currentChannel; +} - while(!IsStopped()) +PVR_ERROR Dvb::GetChannels(ADDON_HANDLE handle, bool bRadio) +{ + for (DvbChannels_t::iterator it = m_channels.begin(); + it != m_channels.end(); ++it) { - Sleep(1000); - m_iUpdateTimer++; + DvbChannel *channel = *it; + if (channel->hidden) + continue; + if (channel->radio != bRadio) + continue; - if (m_bUpdateEPG) - { - Sleep(8000); /* Sleep enough time to let the recording service grab the EPG data */ - PVR->TriggerEpgUpdate(m_iCurrentChannel); - m_bUpdateEPG = false; - } + PVR_CHANNEL xbmcChannel; + memset(&xbmcChannel, 0, sizeof(PVR_CHANNEL)); - if ((m_iUpdateTimer > 60) || m_bUpdateTimers) - { - m_iUpdateTimer = 0; - - // Trigger Timer and Recording updates acording to the addon settings - CLockObject lock(m_mutex); - XBMC->Log(LOG_INFO, "%s Perform Updates!", __FUNCTION__); + xbmcChannel.iUniqueId = channel->id; + xbmcChannel.bIsRadio = channel->radio; + xbmcChannel.iChannelNumber = channel->frontendNr; + xbmcChannel.iEncryptionSystem = channel->encrypted; + xbmcChannel.bIsHidden = false; + PVR_STRCPY(xbmcChannel.strChannelName, channel->name.c_str()); + PVR_STRCPY(xbmcChannel.strIconPath, channel->logoURL.c_str()); - if (m_bUpdateTimers) - { - Sleep(500); - m_bUpdateTimers = false; - } - TimerUpdates(); - PVR->TriggerRecordingUpdate(); + if (!channel->radio && !g_useRTSP) + PVR_STRCPY(xbmcChannel.strInputFormat, "video/x-mpegts"); + else + PVR_STRCPY(xbmcChannel.strInputFormat, ""); + + if (!g_bUseTimeshift) + { + // self referencing so GetLiveStreamURL() gets triggered + CStdString streamURL; + streamURL.Format("pvr://stream/tv/%u.ts", channel->backendNr); + PVR_STRCPY(xbmcChannel.strStreamURL, streamURL.c_str()); } - } - CLockObject lock(m_mutex); - m_started.Broadcast(); - //XBMC->Log(LOG_DEBUG, "%s - exiting", __FUNCTION__); + PVR->TransferChannelEntry(handle, &xbmcChannel); + } - return NULL; + return PVR_ERROR_NO_ERROR; } -bool Dvb::LoadChannels() +PVR_ERROR Dvb::GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL& channel, time_t iStart, time_t iEnd) { - ChannelsDat *channel; - int num_channels, channel_pos = 0; + DvbChannel *myChannel = m_channels[channel.iUniqueId - 1]; - m_groups.clear(); - m_iNumChannelGroups = 0; + CStdString url(BuildURL("api/epg.html?lvl=2&channel=%"PRIu64"&start=%f&end=%f", + myChannel->epgId, iStart/86400.0 + DELPHI_DATE, iEnd/86400.0 + DELPHI_DATE)); + CStdString strXML(GetHttpXML(url)); - CStdString url; - url.Format("%sapi/getchannelsdat.html", m_strURL.c_str()); - CStdString strBIN; - strBIN = GetHttpXML(url); - if (strBIN.IsEmpty()) + XMLResults xe; + XMLNode xMainNode = XMLNode::parseString(strXML, NULL, &xe); + if (xe.error != 0) { - XBMC->Log(LOG_ERROR, "%s Unable to load channels.dat", __FUNCTION__); - return false; + XBMC->Log(LOG_ERROR, "Unable to parse EPG. Invalid XML. Error: %s", XMLNode::getError(xe.error)); + return PVR_ERROR_SERVER_ERROR; } - strBIN.erase(0, CHANNELDAT_HEADER_SIZE); - channel = (ChannelsDat*)strBIN.data(); - num_channels = strBIN.size() / sizeof(ChannelsDat); - std::vector channelsdat; - std::vector groupsdat; - DvbChannel datChannel; - DvbChannelGroup datGroup; - char channel_group[26] = ""; + XMLNode xNode = xMainNode.getChildNode("epg"); + int n = xNode.nChildNode("programme"); + XBMC->Log(LOG_DEBUG, "%s Number of EPG entries for channel '%s': %d", + __FUNCTION__, channel.strChannelName, n); - for (int i=0; iFlags & ADDITIONAL_AUDIO_TRACK_FLAG) - { - if (!g_bUseFavourites || !(channel->Flags & VIDEO_FLAG)) - continue; - } + XMLNode xTmp = xNode.getChildNode("programme", i); + entry.startTime = ParseDateTime(xNode.getChildNode("programme", i).getAttribute("start")); + entry.endTime = ParseDateTime(xNode.getChildNode("programme", i).getAttribute("stop")); + + if (iEnd > 1 && iEnd < entry.endTime) + continue; + + if (!GetXMLValue(xTmp, "eventid", entry.iEventId)) + continue; + + if(!GetXMLValue(xTmp.getChildNode("titles"), "title", entry.strTitle, true)) + continue; + + CStdString strTmp, strTmp2; + GetXMLValue(xTmp.getChildNode("descriptions"), "description", strTmp, true); + GetXMLValue(xTmp.getChildNode("events"), "event", strTmp2, true); + if (strTmp.length() > strTmp2.length()) + entry.strPlot = strTmp; else - channel_pos++; + entry.strPlot = strTmp2; - char channel_group_dat[26] = ""; - strncpy(channel_group_dat, channel->Category, channel->Category_len); - if (strcmp(channel_group, channel_group_dat)) - { - memset(channel_group, 0, sizeof(channel_group)); - strncpy(channel_group, channel_group_dat, channel->Category_len); - char* strGroupNameUtf8 = XBMC->UnknownToUTF8(channel_group); - datGroup.strGroupName = strGroupNameUtf8; - groupsdat.push_back(datGroup); - m_iNumChannelGroups++; - XBMC->FreeString(strGroupNameUtf8); - } - - /* EPGChannelID = (TunerType + 1)*2^48 + NID*2^32 + TID*2^16 + SID */ - datChannel.llEpgId = ((uint64_t)(channel->TunerType + 1) << 48) + ((uint64_t)channel->OriginalNetwork_ID << 32) + ((uint64_t)channel->TransportStream_ID << 16) + channel->Service_ID; - datChannel.Encrypted = channel->Flags & ENCRYPTED_FLAG; - /* ChannelID = (tunertype + 1) * 536870912 + APID * 65536 + SID */ - datChannel.iChannelId = ((channel->TunerType + 1) << 29) + (channel->Audio_PID << 16) + channel->Service_ID; - datChannel.bRadio = (channel->Flags & VIDEO_FLAG) == 0; - datChannel.strGroupName = datGroup.strGroupName; - datChannel.iUniqueId = channelsdat.size() + 1; - datChannel.iChannelNumber = channelsdat.size() + 1; - - char channel_name[26] = ""; - CStdString strChannelName = strncpy(channel_name, channel->ChannelName, channel->ChannelName_len); - if (channel->ChannelName_len == 25) - { - if (channel->Root[channel->Root_len] > 0) - { - char channel_root[26] = ""; - CStdString strRoot = strncpy(channel_root, channel->Root, 25); - if (channel->Root_len < 25) - strChannelName.append(strRoot.substr(channel->Root_len + 1, channel->Root[channel->Root_len])); - if (channel->Category[channel->Category_len] > 0) - { - char channel_category[26] = ""; - CStdString strCategory = strncpy(channel_category, channel->Category, 25); - if (channel->Category_len < 25) - strChannelName.append(strCategory.substr(channel->Category_len + 1, channel->Category[channel->Category_len])); - } - } - } - char* strChannelNameUtf8 = XBMC->UnknownToUTF8(strChannelName.c_str()); - datChannel.strChannelName = strChannelNameUtf8; - XBMC->FreeString(strChannelNameUtf8); - - CStdString strTmp; - strTmp.Format("%supnp/channelstream/%d.ts", m_strURLStream.c_str(), channel_pos - 1); - datChannel.strStreamURL = strTmp; + EPG_TAG broadcast; + memset(&broadcast, 0, sizeof(EPG_TAG)); + + broadcast.iUniqueBroadcastId = entry.iEventId; + broadcast.strTitle = entry.strTitle.c_str(); + broadcast.iChannelNumber = channel.iChannelNumber; + broadcast.startTime = entry.startTime; + broadcast.endTime = entry.endTime; + broadcast.strPlotOutline = entry.strPlotOutline.c_str(); + broadcast.strPlot = entry.strPlot.c_str(); + broadcast.strIconPath = ""; // unused + broadcast.iGenreType = 0; // unused + broadcast.iGenreSubType = 0; // unused + broadcast.strGenreDescription = ""; + broadcast.firstAired = 0; // unused + broadcast.iParentalRating = 0; // unused + broadcast.iStarRating = 0; // unused + broadcast.bNotify = false; + broadcast.iSeriesNumber = 0; // unused + broadcast.iEpisodeNumber = 0; // unused + broadcast.iEpisodePartNumber = 0; // unused + broadcast.strEpisodeName = ""; // unused + + PVR->TransferEpgEntry(handle, &broadcast); - strTmp.Format("%sLogos/%s.png", m_strURL.c_str(), URLEncodeInline(datChannel.strChannelName.c_str())); - datChannel.strIconPath = strTmp; + ++iNumEPG; - channelsdat.push_back(datChannel); + XBMC->Log(LOG_DEBUG, "%s loaded EPG entry '%u:%s': start=%u, end=%u", + __FUNCTION__, broadcast.iUniqueBroadcastId, broadcast.strTitle, + entry.startTime, entry.endTime); } - if (g_bUseFavourites) + XBMC->Log(LOG_INFO, "Loaded %u EPG entries for channel '%s'", + iNumEPG, channel.strChannelName); + return PVR_ERROR_NO_ERROR; +} + +unsigned int Dvb::GetChannelsAmount() +{ + return m_channelAmount; +} + + +PVR_ERROR Dvb::GetChannelGroups(ADDON_HANDLE handle, bool bRadio) +{ + for (DvbGroups_t::iterator group = m_groups.begin(); + group != m_groups.end(); ++group) { - CStdString urlFav = g_strFavouritesPath; - if (!XBMC->FileExists(urlFav.c_str(), false)) - urlFav.Format("%sapi/getfavourites.html", m_strURL.c_str()); + if (group->hidden) + continue; + if (group->radio != bRadio) + continue; + PVR_CHANNEL_GROUP tag; + memset(&tag, 0, sizeof(PVR_CHANNEL_GROUP)); + tag.bIsRadio = group->radio; + PVR_STRCPY(tag.strGroupName, group->name.c_str()); - CStdString strXML; - strXML = GetHttpXML(urlFav); + PVR->TransferChannelGroup(handle, &tag); + } - if(!strXML.size()) - { - XBMC->Log(LOG_ERROR, "%s Unable to load favourites.xml.", __FUNCTION__); - return false; - } + return PVR_ERROR_NO_ERROR; +} - RemoveNullChars(strXML); - XMLResults xe; - XMLNode xMainNode = XMLNode::parseString(strXML.c_str(), NULL, &xe); +PVR_ERROR Dvb::GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP& pvrGroup) +{ + unsigned int channelNumberInGroup = 1; - if(xe.error != 0) { - XBMC->Log(LOG_ERROR, "%s Unable to parse favourites.xml. Error: '%s' ", __FUNCTION__, XMLNode::getError(xe.error)); - return false; - } + for (DvbGroups_t::iterator group = m_groups.begin(); + group != m_groups.end(); ++group) + { + if (group->name != pvrGroup.strGroupName) + continue; - XMLNode xNode = xMainNode.getChildNode("settings"); - int m = xNode.nChildNode("section"); + for(std::list::iterator it = group->channels.begin(); + it != group->channels.end(); ++it) + { + DvbChannel *channel = *it; + PVR_CHANNEL_GROUP_MEMBER tag; + memset(&tag, 0, sizeof(PVR_CHANNEL_GROUP_MEMBER)); + PVR_STRCPY(tag.strGroupName, pvrGroup.strGroupName); + tag.iChannelUniqueId = channel->id; + tag.iChannelNumber = channelNumberInGroup++; + + XBMC->Log(LOG_DEBUG, "%s add channel '%s' (%u) to group '%s'", + __FUNCTION__, channel->name.c_str(), channel->backendNr, + group->name.c_str()); - std::vector channelsfav; - std::vector groupsfav; - DvbChannel favChannel; - DvbChannelGroup favGroup; - - for (int i = 0; iUnknownToUTF8(groupName.c_str()); - favGroup.strGroupName = strGroupNameUtf8; - groupsfav.push_back(favGroup); - XBMC->FreeString(strGroupNameUtf8); - } - } + PVR->TransferChannelGroupMember(handle, &tag); } - m_channels = channelsfav; - m_groups = groupsfav; } - else - { - m_channels = channelsdat; - m_groups = groupsdat; - } - - XBMC->Log(LOG_INFO, "%s Loaded %d Channelsgroups", __FUNCTION__, m_iNumChannelGroups); - return true; + return PVR_ERROR_NO_ERROR; } -bool Dvb::IsConnected() +unsigned int Dvb::GetChannelGroupsAmount() { - return m_bIsConnected; + return m_groupAmount; } -CStdString Dvb::GetHttpXML(CStdString& url) + +PVR_ERROR Dvb::GetTimers(ADDON_HANDLE handle) { - CStdString strResult; - void* fileHandle = XBMC->OpenFile(url.c_str(), 0); - if (fileHandle) + for (DvbTimers_t::iterator timer = m_timers.begin(); + timer != m_timers.end(); ++timer) { - char buffer[1024]; - while (int bytesRead = XBMC->ReadFile(fileHandle, buffer, 1024)) - strResult.append(buffer, bytesRead); - XBMC->CloseFile(fileHandle); + PVR_TIMER tag; + memset(&tag, 0, sizeof(PVR_TIMER)); + + tag.iClientChannelUid = timer->iChannelUid; + tag.startTime = timer->startTime; + tag.endTime = timer->endTime; + PVR_STRCPY(tag.strTitle, timer->strTitle.c_str()); + PVR_STRCPY(tag.strDirectory, "/"); // unused + PVR_STRCPY(tag.strSummary, timer->strPlot.c_str()); + tag.state = timer->state; + tag.iPriority = timer->iPriority; + tag.iLifetime = 0; // unused + tag.bIsRepeating = timer->bRepeating; + tag.firstDay = timer->iFirstDay; + tag.iWeekdays = timer->iWeekdays; + tag.iEpgUid = timer->iEpgId; + tag.iMarginStart = 0; // unused + tag.iMarginEnd = 0; // unused + tag.iGenreType = 0; // unused + tag.iGenreSubType = 0; // unused + tag.iClientIndex = timer->iClientIndex; + + PVR->TransferTimerEntry(handle, &tag); } - return strResult; + return PVR_ERROR_NO_ERROR; } -const char * Dvb::GetServerName() +PVR_ERROR Dvb::AddTimer(const PVR_TIMER& timer) { - return m_strServerName.c_str(); + GenerateTimer(timer); + return PVR_ERROR_NO_ERROR; } -int Dvb::GetChannelsAmount() +PVR_ERROR Dvb::UpdateTimer(const PVR_TIMER& timer) { - return m_channels.size(); + GenerateTimer(timer, false); + return PVR_ERROR_NO_ERROR; } -int Dvb::GetTimersAmount() +PVR_ERROR Dvb::DeleteTimer(const PVR_TIMER& timer) { - return m_timers.size(); + GetHttpXML(BuildURL("api/timerdelete.html?id=%d", GetTimerId(timer))); + + if (timer.state == PVR_TIMER_STATE_RECORDING) + PVR->TriggerRecordingUpdate(); + + m_bUpdateTimers = true; + return PVR_ERROR_NO_ERROR; } -unsigned int Dvb::GetRecordingsAmount() { - return m_iNumRecordings; +unsigned int Dvb::GetTimersAmount() +{ + return m_timers.size(); } -PVR_ERROR Dvb::GetChannels(ADDON_HANDLE handle, bool bRadio) + +PVR_ERROR Dvb::GetRecordings(ADDON_HANDLE handle) { - for (unsigned int iChannelPtr = 0; iChannelPtr < m_channels.size(); iChannelPtr++) + CStdString url = BuildURL("api/recordings.html?images=1&nofilename=1"); + CStdString req = GetHttpXML(url); + RemoveNullChars(req); + + XMLResults xe; + XMLNode xMainNode = XMLNode::parseString(req, NULL, &xe); + if (xe.error != 0) { - DvbChannel &channel = m_channels.at(iChannelPtr); - if (channel.bRadio == bRadio) - { - PVR_CHANNEL xbmcChannel; - memset(&xbmcChannel, 0, sizeof(PVR_CHANNEL)); + XBMC->Log(LOG_ERROR, "Unable to parse recordings. Invalid XML. Error: %s", + XMLNode::getError(xe.error)); + return PVR_ERROR_SERVER_ERROR; + } + + XMLNode xNode = xMainNode.getChildNode("recordings"); - xbmcChannel.iUniqueId = channel.iUniqueId; - xbmcChannel.bIsRadio = channel.bRadio; - xbmcChannel.iChannelNumber = channel.iChannelNumber; - strncpy(xbmcChannel.strChannelName, channel.strChannelName.c_str(), sizeof(xbmcChannel.strChannelName)); - strncpy(xbmcChannel.strInputFormat, "", sizeof(xbmcChannel.strInputFormat)); // unused - - CStdString strStream; - strStream.Format("pvr://stream/tv/%i.ts", channel.iUniqueId); - strncpy(xbmcChannel.strStreamURL, strStream.c_str(), sizeof(xbmcChannel.strStreamURL)); //channel.strStreamURL.c_str(); - xbmcChannel.iEncryptionSystem = channel.Encrypted; - - strncpy(xbmcChannel.strIconPath, channel.strIconPath.c_str(), sizeof(xbmcChannel.strIconPath)); - xbmcChannel.bIsHidden = false; + CStdString streamURL, imageURL; + GetXMLValue(xNode, "serverURL", streamURL); + GetXMLValue(xNode, "imageURL", imageURL); - PVR->TransferChannelEntry(handle, &xbmcChannel); - } + int n = xNode.nChildNode("recording"); + XBMC->Log(LOG_DEBUG, "%s Number of recording entries: %d", __FUNCTION__, n); + + // there's no need to merge new recordings in older ones as XBMC does this + // already for us (using strRecordingId). so just parse all recordings again + m_recordings.clear(); + + // insert recordings in reverse order + for (int i = 0; i < n; ++i) + { + XMLNode xTmp = xNode.getChildNode("recording", n - i - 1); + + m_recordings.push_back(DvbRecording()); + DvbRecording *recording = &m_recordings.back(); + + recording->id = xTmp.getAttribute("id"); + GetXMLValue(xTmp, "title", recording->title); + GetXMLValue(xTmp, "channel", recording->channelName); + GetXMLValue(xTmp, "info", recording->plotOutline); + + CStdString tmp; + recording->plot = (GetXMLValue(xTmp, "desc", tmp)) ? tmp + : recording->plotOutline; + + recording->streamURL = BuildExtURL(streamURL, "%s.ts", + recording->id.c_str()); + + if (GetXMLValue(xTmp, "image", tmp)) + recording->thumbnailPath = BuildExtURL(imageURL, "%s", tmp.c_str()); + + CStdString startTime = xTmp.getAttribute("start"); + recording->startTime = ParseDateTime(startTime); + + int hours, mins, secs; + sscanf(xTmp.getAttribute("duration"), "%02d%02d%02d", &hours, &mins, &secs); + recording->duration = hours*60*60 + mins*60 + secs; + + // generate a more unique id + recording->id += "_" + startTime; + + PVR_RECORDING tag; + memset(&tag, 0, sizeof(PVR_RECORDING)); + PVR_STRCPY(tag.strRecordingId, recording->id.c_str()); + PVR_STRCPY(tag.strTitle, recording->title.c_str()); + PVR_STRCPY(tag.strStreamURL, recording->streamURL.c_str()); + PVR_STRCPY(tag.strPlotOutline, recording->plotOutline.c_str()); + PVR_STRCPY(tag.strPlot, recording->plot.c_str()); + PVR_STRCPY(tag.strChannelName, recording->channelName.c_str()); + PVR_STRCPY(tag.strThumbnailPath, recording->thumbnailPath.c_str()); + tag.recordingTime = recording->startTime; + tag.iDuration = recording->duration; + PVR_STRCPY(tag.strDirectory, "/"); // unused + + PVR->TransferRecordingEntry(handle, &tag); + + XBMC->Log(LOG_DEBUG, "%s loaded Recording entry '%s': start=%u, length=%u", + __FUNCTION__, recording->title.c_str(), recording->startTime, + recording->duration); } + XBMC->Log(LOG_INFO, "Loaded %u Recording Entries", m_recordings.size()); + return PVR_ERROR_NO_ERROR; } -Dvb::~Dvb() +PVR_ERROR Dvb::DeleteRecording(const PVR_RECORDING& recinfo) { - StopThread(); - - m_channels.clear(); - m_timers.clear(); - m_recordings.clear(); - m_groups.clear(); - m_bIsConnected = false; + CStdString recid = recinfo.strRecordingId; + CStdString::size_type pos = recid.find('_'); + if (pos != CStdString::npos) + recid.erase(pos); + + // RS api doesn't return a result + GetHttpXML(BuildURL("api/recdelete.html?recid=%s&delfile=1", recid.c_str())); + + PVR->TriggerRecordingUpdate(); + + return PVR_ERROR_NO_ERROR; } -int Dvb::ParseDateTime(CStdString strDate, bool iDateFormat) +unsigned int Dvb::GetRecordingsAmount() { - struct tm timeinfo; + return m_recordings.size(); +} - memset(&timeinfo, 0, sizeof(tm)); - if (iDateFormat) - sscanf(strDate, "%04d%02d%02d%02d%02d%02d", &timeinfo.tm_year, &timeinfo.tm_mon, &timeinfo.tm_mday, &timeinfo.tm_hour, &timeinfo.tm_min, &timeinfo.tm_sec); - else - sscanf(strDate, "%02d.%02d.%04d%02d:%02d:%02d", &timeinfo.tm_mday, &timeinfo.tm_mon, &timeinfo.tm_year, &timeinfo.tm_hour, &timeinfo.tm_min, &timeinfo.tm_sec); - timeinfo.tm_mon -= 1; - timeinfo.tm_year -= 1900; - timeinfo.tm_isdst = -1; - return mktime(&timeinfo); +bool Dvb::OpenLiveStream(const PVR_CHANNEL& channelinfo) +{ + XBMC->Log(LOG_DEBUG, "%s channel=%u", __FUNCTION__, channelinfo.iUniqueId); + + if (channelinfo.iUniqueId == m_currentChannel) + return true; + + SwitchChannel(channelinfo); + if (!g_bUseTimeshift) + return true; + + if (m_tsBuffer) + SAFE_DELETE(m_tsBuffer); + XBMC->Log(LOG_INFO, "Timeshift starts; url=%s", + GetLiveStreamURL(channelinfo).c_str()); + m_tsBuffer = new TimeshiftBuffer(GetLiveStreamURL(channelinfo), + g_strTimeshiftBufferPath); + return m_tsBuffer->IsValid(); +} + +void Dvb::CloseLiveStream(void) +{ + m_currentChannel = 0; + if (m_tsBuffer) + SAFE_DELETE(m_tsBuffer); } -PVR_ERROR Dvb::GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart, time_t iEnd) +int Dvb::ReadLiveStream(unsigned char *pBuffer, unsigned int iBufferSize) { - DvbChannel &myChannel = m_channels.at(channel.iUniqueId-1); + if (!m_tsBuffer) + return 0; + return m_tsBuffer->ReadData(pBuffer, iBufferSize); +} - CStdString url; - url.Format("%sapi/epg.html?lvl=2&channel=%lld&start=%f&end=%f", m_strURL.c_str(), myChannel.llEpgId, iStart/86400.0 + DELPHI_DATE, iEnd/86400.0 + DELPHI_DATE); - - CStdString strXML; - strXML = GetHttpXML(url); +long long Dvb::SeekLiveStream(long long iPosition, int iWhence /* = SEEK_SET */) +{ + if (!m_tsBuffer) + return 0; + return m_tsBuffer->Seek(iPosition, iWhence); +} - int iNumEPG = 0; +long long Dvb::PositionLiveStream(void) +{ + if (!m_tsBuffer) + return 0; + return m_tsBuffer->Position(); +} - XMLResults xe; - XMLNode xMainNode = XMLNode::parseString(strXML.c_str(), NULL, &xe); +long long Dvb::LengthLiveStream(void) +{ + if (!m_tsBuffer) + return 0; + return m_tsBuffer->Length(); +} - if(xe.error != 0) { - XBMC->Log(LOG_ERROR, "%s Unable to parse XML. Error: '%s' ", __FUNCTION__, XMLNode::getError(xe.error)); - return PVR_ERROR_SERVER_ERROR; - } +CStdString& Dvb::GetLiveStreamURL(const PVR_CHANNEL& channelinfo) +{ + SwitchChannel(channelinfo); + return m_channels[channelinfo.iUniqueId - 1]->streamURL; +} - XMLNode xNode = xMainNode.getChildNode("epg"); - int n = xNode.nChildNode("programme"); - XBMC->Log(LOG_INFO, "%s Number of elements: '%d'", __FUNCTION__, n); +void *Dvb::Process() +{ + XBMC->Log(LOG_DEBUG, "%s starting", __FUNCTION__); - for (int i = 0; iTriggerEpgUpdate(m_currentChannel); + m_bUpdateEPG = false; + } - if ((iEnd > 1) && (iEnd < iTmpEnd)) - continue; - - DvbEPGEntry entry; - entry.startTime = iTmpStart; - entry.endTime = iTmpEnd; + if (m_iUpdateTimer > 60 || m_bUpdateTimers) + { + m_iUpdateTimer = 0; - if (!GetInt(xTmp, "eventid", entry.iEventId)) - continue; + // Trigger Timer and Recording updates acording to the addon settings + CLockObject lock(m_mutex); + XBMC->Log(LOG_INFO, "Perform timer/recording updates!"); - entry.iChannelId = channel.iUniqueId; - - if(!GetStringLng(xTmp.getChildNode("titles"), "title", strTmp)) - continue; + if (m_bUpdateTimers) + { + Sleep(500); + m_bUpdateTimers = false; + } + TimerUpdates(); + PVR->TriggerRecordingUpdate(); + } + } - entry.strTitle = strTmp; - - CStdString strTmp2; - GetStringLng(xTmp.getChildNode("descriptions"), "description", strTmp); - GetStringLng(xTmp.getChildNode("events"), "event", strTmp2); - if (strTmp.size() > strTmp2.size()) - entry.strPlot = strTmp; - else - entry.strPlot = strTmp2; + CLockObject lock(m_mutex); + m_started.Broadcast(); - EPG_TAG broadcast; - memset(&broadcast, 0, sizeof(EPG_TAG)); + return NULL; +} - broadcast.iUniqueBroadcastId = entry.iEventId; - broadcast.strTitle = entry.strTitle.c_str(); - broadcast.iChannelNumber = channel.iChannelNumber; - broadcast.startTime = entry.startTime; - broadcast.endTime = entry.endTime; - broadcast.strPlotOutline = entry.strPlotOutline.c_str(); - broadcast.strPlot = entry.strPlot.c_str(); - broadcast.strIconPath = ""; // unused - broadcast.iGenreType = 0; // unused - broadcast.iGenreSubType = 0; // unused - broadcast.strGenreDescription = ""; - broadcast.firstAired = 0; // unused - broadcast.iParentalRating = 0; // unused - broadcast.iStarRating = 0; // unused - broadcast.bNotify = false; - broadcast.iSeriesNumber = 0; // unused - broadcast.iEpisodeNumber = 0; // unused - broadcast.iEpisodePartNumber = 0; // unused - broadcast.strEpisodeName = ""; // unused - PVR->TransferEpgEntry(handle, &broadcast); +CStdString Dvb::GetHttpXML(const CStdString& url) +{ + CStdString strResult; + void* fileHandle = XBMC->OpenFile(url, 0); + if (fileHandle) + { + char buffer[1024]; + while (int bytesRead = XBMC->ReadFile(fileHandle, buffer, 1024)) + strResult.append(buffer, bytesRead); + XBMC->CloseFile(fileHandle); + } + return strResult; +} - iNumEPG++; +CStdString Dvb::URLEncodeInline(const CStdString& strData) +{ + /* Copied from xbmc/URL.cpp */ + CStdString strResult; - XBMC->Log(LOG_INFO, "%s loaded EPG entry '%d:%s' channel '%d' start '%d' end '%d'", __FUNCTION__, broadcast.iUniqueBroadcastId, broadcast.strTitle, entry.iChannelId, entry.startTime, entry.endTime); - } + /* wonder what a good value is here is, depends on how often it occurs */ + strResult.reserve(strData.length() * 2); - XBMC->Log(LOG_INFO, "%s Loaded %u EPG Entries for channel '%s'", __FUNCTION__, iNumEPG, channel.strChannelName); - return PVR_ERROR_NO_ERROR; + for (unsigned int i = 0; i < strData.length(); ++i) + { + int kar = (unsigned char)strData[i]; + //if (kar == ' ') strResult += '+'; // obsolete + if (isalnum(kar) || strchr("-_.!()" , kar) ) // Don't URL encode these according to RFC1738 + { + strResult += kar; + } + else + { + CStdString strTmp; + strTmp.Format("%%%02.2x", kar); + strResult += strTmp; + } + } + return strResult; } -int Dvb::GetChannelNumber(CStdString strChannelId) +bool Dvb::LoadChannels() { - int channel; - sscanf(strChannelId.c_str(), "%d|", &channel); - for (unsigned int i = 0;iLog(LOG_ERROR, "Unable to parse channels. Invalid XML. Error: %s", + XMLNode::getError(xe.error)); + return false; } - return -1; -} -PVR_ERROR Dvb::GetTimers(ADDON_HANDLE handle) -{ - XBMC->Log(LOG_INFO, "%s - timers available '%d'", __FUNCTION__, m_timers.size()); - for (unsigned int i=0; iLog(LOG_INFO, "%s - Transfer timer '%s', ClientIndex '%d'", __FUNCTION__, timer.strTitle.c_str(), timer.iClientIndex); - PVR_TIMER tag; - memset(&tag, 0, sizeof(PVR_TIMER)); - tag.iClientChannelUid = timer.iChannelId; - tag.startTime = timer.startTime; - tag.endTime = timer.endTime; - strncpy(tag.strTitle, timer.strTitle.c_str(), sizeof(tag.strTitle)); - strncpy(tag.strDirectory, "/", sizeof(tag.strDirectory)); // unused - strncpy(tag.strSummary, timer.strPlot.c_str(), sizeof(tag.strSummary)); - tag.state = timer.state; - tag.iPriority = timer.iPriority; - tag.iLifetime = 0; // unused - tag.bIsRepeating = timer.bRepeating; - tag.firstDay = timer.iFirstDay; - tag.iWeekdays = timer.iWeekdays; - tag.iEpgUid = timer.iEpgID; - tag.iMarginStart = 0; // unused - tag.iMarginEnd = 0; // unused - tag.iGenreType = 0; // unused - tag.iGenreSubType = 0; // unused - tag.iClientIndex = timer.iClientIndex; + XMLNode xChannels = xMainNode.getChildNode("channels"); + + CStdString streamURL; + GetXMLValue(xChannels, (g_useRTSP) ? "rtspURL" : "upnpURL", streamURL); + + m_channels.clear(); + m_channelAmount = 0; + m_groups.clear(); + m_groupAmount = 0; + + int n = xChannels.nChildNode("root"); + for (int i = 0; i < n; ++i) + { + XMLNode xRoot = xChannels.getChildNode("root", i); + int num_groups = xRoot.nChildNode("group"); + for (int j = 0; j < num_groups; ++j) + { + XMLNode xGroup = xRoot.getChildNode("group", j); + + m_groups.push_back(DvbGroup()); + DvbGroup *group = &m_groups.back(); + group->name = xGroup.getAttribute("name"); + group->hidden = g_useFavourites; + group->radio = true; + if (!group->hidden) + ++m_groupAmount; + + int num_channels = xGroup.nChildNode("channel"); + for (int k = 0; k < num_channels; ++k) + { + XMLNode xChannel = xGroup.getChildNode("channel", k); + + DvbChannel *channel = new DvbChannel(); + int flags = atoi(xChannel.getAttribute("flags")); + channel->radio = !(flags & VIDEO_FLAG); + channel->encrypted = (flags & ENCRYPTED_FLAG); + channel->name = xChannel.getAttribute("name"); + channel->backendNr = atoi(xChannel.getAttribute("nr")); + channel->epgId = ParseUInt64(xChannel.getAttribute("EPGID")); + channel->hidden = g_useFavourites; + channel->frontendNr = (!g_useFavourites) ? m_channels.size() + 1 : 0; + channel->backendIds.push_back(ParseUInt64(xChannel.getAttribute("ID"))); + + CStdString logoURL; + if (GetXMLValue(xChannel, "logo", logoURL)) + channel->logoURL = BuildURL("%s", logoURL.c_str()); + + if (g_useRTSP) + { + CStdString urlParams; + GetXMLValue(xChannel, "rtsp", urlParams); + channel->streamURL = BuildExtURL(streamURL, "%s", urlParams.c_str()); + } + else + channel->streamURL = BuildExtURL(streamURL, "%u.ts", channel->backendNr); + + int num_subchannels = xChannel.nChildNode("subchannel"); + for (int l = 0; l < num_subchannels; ++l) + { + XMLNode xSubChannel = xChannel.getChildNode("subchannel", l); + channel->backendIds.push_back(ParseUInt64(xSubChannel.getAttribute("ID"))); + } + + //FIXME: PVR_CHANNEL.UniqueId is uint32 but DVB Viewer ids are uint64 + // so generate our own unique ids, at least for this session + channel->id = m_channels.size() + 1; + m_channels.push_back(channel); + group->channels.push_back(channel); + if (!channel->hidden) + ++m_channelAmount; + + if (!channel->radio) + group->radio = false; + } + } + } + + if (g_useFavourites) + { + CStdString url = BuildURL("api/getfavourites.html"); + if (g_useFavouritesFile) + { + if (!XBMC->FileExists(g_favouritesFile, false)) + { + //TODO: print error instead of loading favourites + return false; + } + url = g_favouritesFile; + } + + CStdString req = GetHttpXML(url); + RemoveNullChars(req); + + XMLResults xe; + XMLNode xMainNode = XMLNode::parseString(req, NULL, &xe); + if (xe.error != 0) + { + XBMC->Log(LOG_ERROR, "Unable to parse favourites.xml. Error: %s", + XMLNode::getError(xe.error)); + return false; + } + + m_groups.clear(); + m_groupAmount = 0; + + /* example data: + * + *
+ * Group 1 + * 1234567890123456789|Channel 1 + * 1234567890123456789|Channel 2 + *
+ *
+ * 1234567890123456789|Channel 3 + *
+ * ... + *
+ */ + XMLNode xSettings = xMainNode.getChildNode("settings"); + int n = xSettings.nChildNode("section"); + for (int i = 0; i < n; ++i) + { + DvbGroup *group = NULL; + XMLNode xSection = xSettings.getChildNode("section", i); + int m = xSection.nChildNode("entry"); + for (int j = 0; j < m; ++j) + { + XMLNode xEntry = xSection.getChildNode("entry", j); + // name="Header" doesn't indicate a group alone. see example above + if (CStdString(xEntry.getAttribute("name")) == "Header" && m > 1) + { + m_groups.push_back(DvbGroup()); + group = &m_groups.back(); + group->name = ConvertToUtf8(xEntry.getText()); + group->hidden = false; + group->radio = false; + ++m_groupAmount; + continue; + } + + uint64_t backendId = 0; + std::istringstream ss(xEntry.getText()); + ss >> backendId; + + //TODO: use getchannelbybackendid? + for (DvbChannels_t::iterator it = m_channels.begin(); + it != m_channels.end(); ++it) + { + DvbChannel *channel = *it; + bool found = false; + + for(std::list::iterator it2 = channel->backendIds.begin(); + it2 != channel->backendIds.end(); ++it2) + { + /* legacy support for old 32bit channel ids */ + uint64_t channelId = (backendId > 0xFFFFFFFF) ? *it2 : + *it2 & 0xFFFFFFFF; + if (channelId == backendId) + { + found = true; + break; + } + } + + if (found) + { + channel->hidden = false; + channel->frontendNr = ++m_channelAmount; + if (!ss.eof()) + { + ss.ignore(1); + CStdString channelName; + getline(ss, channelName); + channel->name = ConvertToUtf8(channelName); + } + + if (group) + { + group->channels.push_back(channel); + if (!channel->radio) + group->radio = false; + } + break; + } + } + } + } - PVR->TransferTimerEntry(handle, &tag); + // assign channel number to remaining channels + unsigned int channelNumber = m_channelAmount; + for (DvbChannels_t::iterator it = m_channels.begin(); + it != m_channels.end(); ++it) + { + if (!(*it)->frontendNr) + (*it)->frontendNr = ++channelNumber; + } } - return PVR_ERROR_NO_ERROR; + + XBMC->Log(LOG_INFO, "Loaded (%u/%u) channels in (%u/%u) groups", + m_channelAmount, m_channels.size(), m_groupAmount, m_groups.size()); + // force channel sync as stream urls may have changed (e.g. rstp on/off) + PVR->TriggerChannelUpdate(); + return true; } -std::vector Dvb::LoadTimers() +DvbTimers_t Dvb::LoadTimers() { - CStdString url; - url.Format("%s%s", m_strURL.c_str(), "api/timerlist.html?utf8"); + DvbTimers_t timers; - CStdString strXML; - strXML = GetHttpXML(url); + CStdString url(BuildURL("api/timerlist.html?utf8")); + CStdString strXML(GetHttpXML(url)); RemoveNullChars(strXML); XMLResults xe; - XMLNode xMainNode = XMLNode::parseString(strXML.c_str(), NULL, &xe); - - std::vector timers; - - if(xe.error != 0) { - XBMC->Log(LOG_ERROR, "%s Unable to parse XML. Error: '%s' ", __FUNCTION__, XMLNode::getError(xe.error)); + XMLNode xMainNode = XMLNode::parseString(strXML, NULL, &xe); + if (xe.error != 0) + { + XBMC->Log(LOG_ERROR, "Unable to parse timers. Invalid XML. Error: %s", XMLNode::getError(xe.error)); return timers; } XMLNode xNode = xMainNode.getChildNode("Timers"); int n = xNode.nChildNode("Timer"); + XBMC->Log(LOG_DEBUG, "%s Number of timer entries: %d", __FUNCTION__, n); - XBMC->Log(LOG_INFO, "%s Number of elements: '%d'", __FUNCTION__, n); - - - while(n>0) + for (int i = 0; i < n; ++i) { - int i = n-1; - n--; - XMLNode xTmp = xNode.getChildNode("Timer", i); + XMLNode xTmp = xNode.getChildNode("Timer", n - i - 1); CStdString strTmp; - int iTmp; - - if (GetString(xTmp, "Descr", strTmp)) + if (GetXMLValue(xTmp, "Descr", strTmp)) XBMC->Log(LOG_DEBUG, "%s Processing timer '%s'", __FUNCTION__, strTmp.c_str()); - + DvbTimer timer; - timer.strTitle = strTmp; - timer.iChannelId = GetChannelNumber(xTmp.getChildNode("Channel").getAttribute("ID")); + timer.iChannelUid = GetChannelUid(xTmp.getChildNode("Channel").getAttribute("ID")); + if (timer.iChannelUid == 0) + continue; timer.state = PVR_TIMER_STATE_SCHEDULED; - CStdString DateTime; - DateTime = xNode.getChildNode("timer", i).getAttribute("Date"); - DateTime.append(xNode.getChildNode("timer", i).getAttribute("Start")); + CStdString DateTime = xTmp.getAttribute("Date"); + DateTime.append(xTmp.getAttribute("Start")); timer.startTime = ParseDateTime(DateTime, false); - timer.endTime = timer.startTime + atoi(xNode.getChildNode("timer", i).getAttribute("Dur"))*60; + timer.endTime = timer.startTime + atoi(xTmp.getAttribute("Dur"))*60; - CStdString Weekdays; - Weekdays = xNode.getChildNode("timer", i).getAttribute("Days"); + CStdString Weekdays = xTmp.getAttribute("Days"); timer.iWeekdays = 0; - for (unsigned int i = 0; iLog(LOG_INFO, "%s fetched Timer entry '%s', begin '%d', end '%d'", __FUNCTION__, timer.strTitle.c_str(), timer.startTime, timer.endTime); + XBMC->Log(LOG_DEBUG, "%s loaded Timer entry '%s': start=%u, end=%u", + __FUNCTION__, timer.strTitle.c_str(), timer.startTime, timer.endTime); } - XBMC->Log(LOG_INFO, "%s fetched %u Timer Entries", __FUNCTION__, timers.size()); - return timers; + XBMC->Log(LOG_INFO, "Loaded %u Timer entries", timers.size()); + return timers; } -int Dvb::GetTimerID(const PVR_TIMER &timer) +void Dvb::TimerUpdates() { - unsigned int i=0; - while (iiUpdateState = DVB_UPDATE_STATE_NONE; + + DvbTimers_t newtimers = LoadTimers(); + unsigned int iUpdated = 0; + unsigned int iUnchanged = 0; + for (DvbTimers_t::iterator newtimer = newtimers.begin(); + newtimer != newtimers.end(); ++newtimer) { - if (m_timers.at(i).iClientIndex == timer.iClientIndex) - break; + for (DvbTimers_t::iterator timer = m_timers.begin(); + timer != m_timers.end(); ++timer) + { + if (!timer->like(*newtimer)) + continue; + + if (*timer == *newtimer) + { + timer->iUpdateState = newtimer->iUpdateState = DVB_UPDATE_STATE_FOUND; + ++iUnchanged; + } + else + { + timer->iUpdateState = newtimer->iUpdateState = DVB_UPDATE_STATE_UPDATED; + timer->strTitle = newtimer->strTitle; + timer->strPlot = newtimer->strPlot; + timer->iChannelUid = newtimer->iChannelUid; + timer->startTime = newtimer->startTime; + timer->endTime = newtimer->endTime; + timer->bRepeating = newtimer->bRepeating; + timer->iWeekdays = newtimer->iWeekdays; + timer->iEpgId = newtimer->iEpgId; + timer->iTimerId = newtimer->iTimerId; + timer->iPriority = newtimer->iPriority; + timer->iFirstDay = newtimer->iFirstDay; + timer->state = newtimer->state; + ++iUpdated; + } + } + } + + unsigned int iRemoved = 0; + for (DvbTimers_t::iterator it = m_timers.begin(); it != m_timers.end();) + { + if (it->iUpdateState == DVB_UPDATE_STATE_NONE) + { + XBMC->Log(LOG_DEBUG, "%s Removed timer: '%s', ClientIndex: %u", + __FUNCTION__, it->strTitle.c_str(), it->iClientIndex); + it = m_timers.erase(it); + ++iRemoved; + } else - i++; + ++it; + } + + unsigned int iNew = 0; + for (DvbTimers_t::iterator it = newtimers.begin(); it != newtimers.end(); ++it) + { + if (it->iUpdateState == DVB_UPDATE_STATE_NEW) + { + it->iClientIndex = m_iClientIndexCounter; + XBMC->Log(LOG_DEBUG, "%s New timer: '%s', ClientIndex: %u", + __FUNCTION__, it->strTitle.c_str(), m_iClientIndexCounter); + m_timers.push_back(*it); + ++m_iClientIndexCounter; + ++iNew; + } + } + + XBMC->Log(LOG_DEBUG, "%s Timers update: removed=%u, untouched=%u, updated=%u, new=%u", + __FUNCTION__, iRemoved, iUnchanged, iUpdated, iNew); + + if (iRemoved || iUpdated || iNew) + { + XBMC->Log(LOG_INFO, "Changes in timerlist detected, triggering an update!"); + PVR->TriggerTimerUpdate(); } - DvbTimer &Timer = m_timers.at(i); - return Timer.iTimerID; } -void Dvb::GenerateTimer(const PVR_TIMER &timer, bool bNewTimer) +void Dvb::GenerateTimer(const PVR_TIMER& timer, bool bNewTimer) { - XBMC->Log(LOG_DEBUG, "%s - channelUid=%d title=%s epgid=%d", __FUNCTION__, timer.iClientChannelUid, timer.strTitle, timer.iEpgUid); + XBMC->Log(LOG_DEBUG, "%s iChannelUid=%u title='%s' epgid=%d", + __FUNCTION__, timer.iClientChannelUid, timer.strTitle, timer.iEpgUid); struct tm *timeinfo; time_t startTime = timer.startTime, endTime = timer.endTime; @@ -725,486 +1025,315 @@ time(&startTime); else { - startTime -= timer.iMarginStart*60; - endTime += timer.iMarginEnd*60; + startTime -= timer.iMarginStart * 60; + endTime += timer.iMarginEnd * 60; } - int dor = ((startTime + m_iTimezone*60) / DAY_SECS) + DELPHI_DATE; + int dor = ((startTime + m_timezone * 60) / DAY_SECS) + DELPHI_DATE; timeinfo = localtime(&startTime); - int start = timeinfo->tm_hour*60 + timeinfo->tm_min; + int start = timeinfo->tm_hour * 60 + timeinfo->tm_min; timeinfo = localtime(&endTime); - int stop = timeinfo->tm_hour*60 + timeinfo->tm_min; + int stop = timeinfo->tm_hour * 60 + timeinfo->tm_min; char strWeek[8] = "-------"; - for (int i = 0; i<7; i++) + for (int i = 0; i < 7; ++i) { - if (timer.iWeekdays & (1 << i)) strWeek[i] = 'T'; + if (timer.iWeekdays & (1 << i)) + strWeek[i] = 'T'; } - int iChannelId = m_channels.at(timer.iClientChannelUid-1).iChannelId; - CStdString strTmp; + uint64_t iChannelId = m_channels[timer.iClientChannelUid - 1]->backendIds.front(); + CStdString url; if (bNewTimer) - strTmp.Format("api/timeradd.html?ch=%d&dor=%d&enable=1&start=%d&stop=%d&prio=%d&days=%s&title=%s&encoding=255", iChannelId, dor, start, stop, timer.iPriority, strWeek, URLEncodeInline(timer.strTitle)); + url = BuildURL("api/timeradd.html?ch=%"PRIu64"&dor=%d&enable=1&start=%d&stop=%d&prio=%d&days=%s&title=%s&encoding=255", + iChannelId, dor, start, stop, timer.iPriority, strWeek, URLEncodeInline(timer.strTitle).c_str()); else { - int enabled = 1; - if (timer.state == PVR_TIMER_STATE_CANCELLED) - enabled = 0; - strTmp.Format("api/timeredit.html?id=%d&ch=%d&dor=%d&enable=%d&start=%d&stop=%d&prio=%d&days=%s&title=%s&encoding=255", GetTimerID(timer), iChannelId, dor, enabled, start, stop, timer.iPriority, strWeek, URLEncodeInline(timer.strTitle)); - } - - SendSimpleCommand(strTmp); - m_bUpdateTimers = true; -} - -PVR_ERROR Dvb::AddTimer(const PVR_TIMER &timer) -{ - GenerateTimer(timer); - - return PVR_ERROR_NO_ERROR; -} - -PVR_ERROR Dvb::UpdateTimer(const PVR_TIMER &timer) -{ - GenerateTimer(timer, false); - - return PVR_ERROR_NO_ERROR; -} - -PVR_ERROR Dvb::DeleteTimer(const PVR_TIMER &timer) -{ - CStdString strTmp; - strTmp.Format("api/timerdelete.html?id=%d", GetTimerID(timer)); - SendSimpleCommand(strTmp); - - if (timer.state == PVR_TIMER_STATE_RECORDING) - PVR->TriggerRecordingUpdate(); - - m_bUpdateTimers = true; - - return PVR_ERROR_NO_ERROR; -} - -PVR_ERROR Dvb::GetRecordings(ADDON_HANDLE handle) -{ - m_iNumRecordings = 0; - std::vector recthumbs; - recthumbs = m_recordings; - m_recordings.clear(); - - CStdString url; - url.Format("%s%s", m_strURL.c_str(), "api/recordings.html?utf8"); - - CStdString strXML; - strXML = GetHttpXML(url); - RemoveNullChars(strXML); - - XMLResults xe; - XMLNode xMainNode = XMLNode::parseString(strXML.c_str(), NULL, &xe); - - if(xe.error != 0) { - XBMC->Log(LOG_ERROR, "%s Unable to parse XML. Error: '%s' ", __FUNCTION__, XMLNode::getError(xe.error)); - return PVR_ERROR_SERVER_ERROR; - } - - XMLNode xNode = xMainNode.getChildNode("recordings"); - int n = xNode.nChildNode("recording"); - - XBMC->Log(LOG_INFO, "%s Number of elements: '%d'", __FUNCTION__, n); - - int iNumRecording = 0; - static int iGetRecordingsCount = 0; - int j = n; - - while(n>0) - { - int i = n-1; - n--; - XMLNode xTmp = xNode.getChildNode("recording", i); - CStdString strTmp; - - DvbRecording recording; - if (xNode.getChildNode("recording", i).getAttribute("id")) - recording.strRecordingId = xNode.getChildNode("recording", i).getAttribute("id"); - - if (GetString(xTmp, "title", strTmp)) - recording.strTitle = strTmp; - - CStdString strTmp2; - GetString(xTmp, "desc", strTmp); - GetString(xTmp, "info", strTmp2); - if (strTmp.size() > strTmp2.size()) - recording.strPlot = strTmp; - else - recording.strPlot = strTmp2; - - if (GetString(xTmp, "channel", strTmp)) - recording.strChannelName = strTmp; - - strTmp.Format("%supnp/recordings/%d.ts", m_strURLRecording.c_str(), atoi(recording.strRecordingId.c_str())); - recording.strStreamURL = strTmp; - - recording.startTime = ParseDateTime(xNode.getChildNode("recording", i).getAttribute("start")); - - int hours, mins, secs; - sscanf(xNode.getChildNode("recording", i).getAttribute("duration"), "%02d%02d%02d", &hours, &mins, &secs); - recording.iDuration = hours*60*60 + mins*60 + secs; - - bool bGetThumbnails = true; - if ((iGetRecordingsCount == 0) && (j > MAX_RECORDING_THUMBS - 1)) - bGetThumbnails = false; - - for (unsigned int i=0; i 20) && (recthumbs[i].strThumbnailPath.size() < 100)) - { - recording.strThumbnailPath = recthumbs[i].strThumbnailPath; - bGetThumbnails = false; - break; - } - } - - if (bGetThumbnails) - { - url.Format("%sepg_details.html?aktion=epg_details&recID=%s", m_strURL.c_str(), recording.strRecordingId.c_str()); - CStdString strThumb; - strThumb = GetHttpXML(url); - - unsigned int iThumbnailPos; - iThumbnailPos = strThumb.find_first_of('_', RECORDING_THUMB_POS); - strTmp.Format("%sthumbnails/video/%s_SM.jpg", m_strURL.c_str(), strThumb.substr(RECORDING_THUMB_POS, iThumbnailPos - RECORDING_THUMB_POS).c_str()); - recording.strThumbnailPath = strTmp; - } - - PVR_RECORDING tag; - memset(&tag, 0, sizeof(PVR_RECORDING)); - strncpy(tag.strRecordingId, recording.strRecordingId.c_str(), sizeof(tag.strRecordingId)); - strncpy(tag.strTitle, recording.strTitle.c_str(), sizeof(tag.strTitle)); - strncpy(tag.strStreamURL, recording.strStreamURL.c_str(), sizeof(tag.strStreamURL)); - strncpy(tag.strPlotOutline, recording.strPlotOutline.c_str(), sizeof(tag.strPlotOutline)); - strncpy(tag.strPlot, recording.strPlot.c_str(), sizeof(tag.strPlot)); - strncpy(tag.strChannelName, recording.strChannelName.c_str(), sizeof(tag.strChannelName)); - strncpy(tag.strThumbnailPath, recording.strThumbnailPath.c_str(), sizeof(tag.strThumbnailPath)); - tag.recordingTime = recording.startTime; - tag.iDuration = recording.iDuration; - strncpy(tag.strDirectory, "/", sizeof(tag.strDirectory)); // unused - - PVR->TransferRecordingEntry(handle, &tag); - - m_iNumRecordings++; - iNumRecording++; - m_recordings.push_back(recording); - - XBMC->Log(LOG_INFO, "%s loaded Recording entry '%s', start '%d', length '%d'", __FUNCTION__, tag.strTitle, recording.startTime, recording.iDuration); + int enabled = (timer.state == PVR_TIMER_STATE_CANCELLED) ? 0 : 1; + url = BuildURL("api/timeredit.html?id=%d&ch=%"PRIu64"&dor=%d&enable=%d&start=%d&stop=%d&prio=%d&days=%s&title=%s&encoding=255", + GetTimerId(timer), iChannelId, dor, enabled, start, stop, timer.iPriority, strWeek, URLEncodeInline(timer.strTitle).c_str()); } - iGetRecordingsCount++; - - XBMC->Log(LOG_INFO, "%s Loaded %u Recording Entries", __FUNCTION__, iNumRecording); - - return PVR_ERROR_NO_ERROR; -} - -PVR_ERROR Dvb::DeleteRecording(const PVR_RECORDING &recinfo) -{ - CStdString strTmp; - strTmp.Format("rec_list.html?aktion=delete_rec&recid=%s", recinfo.strRecordingId); - SendSimpleCommand(strTmp); - PVR->TriggerRecordingUpdate(); - - return PVR_ERROR_NO_ERROR; -} - -void Dvb::SendSimpleCommand(const CStdString& strCommandURL) -{ - CStdString url; - url.Format("%s%s", m_strURL.c_str(), strCommandURL.c_str()); GetHttpXML(url); + m_bUpdateTimers = true; } -CStdString Dvb::URLEncodeInline(const CStdString& strData) +int Dvb::GetTimerId(const PVR_TIMER& timer) { - /* Copied from xbmc/URL.cpp */ - - CStdString strResult; - - /* wonder what a good value is here is, depends on how often it occurs */ - strResult.reserve( strData.length() * 2 ); - - for (int i = 0; i < (int)strData.size(); ++i) + for (DvbTimers_t::iterator it = m_timers.begin(); it != m_timers.end(); ++it) { - int kar = (unsigned char)strData[i]; - //if (kar == ' ') strResult += '+'; // obsolete - if (isalnum(kar) || strchr("-_.!()" , kar) ) // Don't URL encode these according to RFC1738 - { - strResult += kar; - } - else - { - CStdString strTmp; - strTmp.Format("%%%02.2x", kar); - strResult += strTmp; - } + if (it->iClientIndex == timer.iClientIndex) + return it->iTimerId; } - return strResult; + return 0; } -bool Dvb::GetInt(XMLNode xRootNode, const char* strTag, int& iIntValue) + +bool Dvb::GetXMLValue(const XMLNode& node, const char* tag, int& value) { - XMLNode xNode = xRootNode.getChildNode(strTag ); + XMLNode xNode(node.getChildNode(tag)); if (xNode.isEmpty()) return false; - iIntValue = atoi(xNode.getText()); + value = atoi(xNode.getText()); return true; } -bool Dvb::GetBoolean(XMLNode xRootNode, const char* strTag, bool& bBoolValue) +bool Dvb::GetXMLValue(const XMLNode& node, const char* tag, bool& value) { - XMLNode xNode = xRootNode.getChildNode(strTag ); - if (xNode.isEmpty()) + XMLNode xNode(node.getChildNode(tag)); + if (xNode.isEmpty()) return false; - CStdString strEnabled = xNode.getText(); - - strEnabled.ToLower(); - if (strEnabled == "off" || strEnabled == "no" || strEnabled == "disabled" || strEnabled == "false" || strEnabled == "0" ) - bBoolValue = false; + CStdString str(xNode.getText()); + str.ToLower(); + if (str == "off" || str == "no" || str == "disabled" || str == "false" || str == "0" ) + value = false; else { - bBoolValue = true; - if (strEnabled != "on" && strEnabled != "yes" && strEnabled != "enabled" && strEnabled != "true") + value = true; + if (str != "on" && str != "yes" && str != "enabled" && str != "true") return false; // invalid bool switch - it's probably some other string. } return true; } -bool Dvb::GetString(XMLNode xRootNode, const char* strTag, CStdString& strStringValue) -{ - XMLNode xNode = xRootNode.getChildNode(strTag ); - if (!xNode.isEmpty()) - { - strStringValue = xNode.getText(); - return true; - } - strStringValue.Empty(); - return false; -} - -bool Dvb::GetStringLng(XMLNode xRootNode, const char* strTag, CStdString& strStringValue) +bool Dvb::GetXMLValue(const XMLNode& node, const char* tag, CStdString& value, + bool localize) { XMLNode xNode; bool found = false; - int n = xRootNode.nChildNode(strTag); - if (n > 1) + for (int i = 0; localize && i < node.nChildNode(tag); ++i) { - for (int i = 0; i", iLanguagePos); - m_strEPGLanguage = strXML.substr(iLanguagePos-4, 3); + /* favourites.xml and timers.xml sometimes have null chars that screw the xml */ + str.erase(std::remove(str.begin(), str.end(), '\0'), str.end()); } -void Dvb::GetTimeZone() +bool Dvb::CheckBackendVersion() { - CStdString url; - url.Format("%s%s", m_strURL.c_str(), "api/status.html"); - - CStdString strXML; - strXML = GetHttpXML(url); + CStdString url(BuildURL("api/version.html")); + CStdString strXML(GetHttpXML(url)); XMLResults xe; - XMLNode xMainNode = XMLNode::parseString(strXML.c_str(), NULL, &xe); - - if(xe.error != 0) { - XBMC->Log(LOG_ERROR, "%s Unable to parse XML. Error: '%s' ", __FUNCTION__, XMLNode::getError(xe.error)); - } - else { - XMLNode xNode = xMainNode.getChildNode("status"); - GetInt(xNode, "timezone", m_iTimezone); + XMLNode xMainNode = XMLNode::parseString(strXML, NULL, &xe); + if (xe.error != 0) + { + XBMC->Log(LOG_ERROR, "Unable to connect to the recording service"); + XBMC->QueueNotification(QUEUE_ERROR, XBMC->GetLocalizedString(30500)); + Sleep(10000); + return false; } -} -void Dvb::RemoveNullChars(CStdString &String) -{ - /* favourites.xml and timers.xml sometimes have null chars that screw the xml */ - for (unsigned int i = 0; iLog(LOG_NOTICE, "Checking backend version..."); + XMLNode xNode = xMainNode.getChildNode("version"); + if (xNode.isEmpty()) { - if (String.data()[i] == '\0') - { - String.erase(i, 1); - i--; - } + XBMC->Log(LOG_ERROR, "Could not parse version from result!"); + return false; } -} + XBMC->Log(LOG_NOTICE, "Version: %s", xNode.getText()); -PVR_ERROR Dvb::GetChannelGroups(ADDON_HANDLE handle) -{ - for(unsigned int iTagPtr = 0; iTagPtr < m_groups.size(); iTagPtr++) + XMLCSTR strVersion = xNode.getAttribute("iver"); + if (strVersion) { - PVR_CHANNEL_GROUP tag; - memset(&tag, 0 , sizeof(PVR_CHANNEL_GROUP)); - - tag.bIsRadio = false; - strncpy(tag.strGroupName, m_groups[iTagPtr].strGroupName.c_str(), sizeof(tag.strGroupName)); - - PVR->TransferChannelGroup(handle, &tag); + std::istringstream ss(strVersion); + ss >> m_backendVersion; } - return PVR_ERROR_NO_ERROR; -} - + if (m_backendVersion < RS_VERSION_NUM) + { + XBMC->Log(LOG_ERROR, "Recording Service version %s or higher required", RS_VERSION_STR); + XBMC->QueueNotification(QUEUE_ERROR, XBMC->GetLocalizedString(30501), RS_VERSION_STR); + Sleep(10000); + return false; + } -unsigned int Dvb::GetNumChannelGroups() { - return m_iNumChannelGroups; + return true; } -PVR_ERROR Dvb::GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group) +bool Dvb::UpdateBackendStatus(bool updateSettings) { - XBMC->Log(LOG_DEBUG, "%s - group '%s'", __FUNCTION__, group.strGroupName); - CStdString strTmp = group.strGroupName; - for (unsigned int i = 0;iLog(LOG_ERROR, "Unable to get backend status. Invalid XML. Error: %s", + XMLNode::getError(xe.error)); + return false; + } - strncpy(tag.strGroupName, group.strGroupName, sizeof(tag.strGroupName)); - tag.iChannelUniqueId = myChannel.iUniqueId; - tag.iChannelNumber = myChannel.iChannelNumber; + XMLNode xNode = xMainNode.getChildNode("status"); + if (updateSettings) + { + GetXMLValue(xNode, "timezone", m_timezone); + GetXMLValue(xNode, "epglang", m_epgLanguage); + } - XBMC->Log(LOG_DEBUG, "%s - add channel %s (%d) to group '%s' channel number %d", - __FUNCTION__, myChannel.strChannelName.c_str(), tag.iChannelUniqueId, group.strGroupName, myChannel.iChannelNumber); + // compute disk space. duplicates are detected by their identical values + typedef std::pair Recfolder_t; + std::set folders; + XMLNode recfolders = xNode.getChildNode("recfolders"); + int n = recfolders.nChildNode("folder"); + m_diskspace.total = m_diskspace.used = 0; + for (int i = 0; i < n; ++i) + { + XMLNode folder = recfolders.getChildNode("folder", i); + + long long size = 0, free = 0; + std::istringstream ss(folder.getAttribute("size")); + ss >> size; + ss.clear(); + ss.str(folder.getAttribute("free")); + ss >> free; - PVR->TransferChannelGroupMember(handle, &tag); + if (folders.insert(std::make_pair(size, free)).second) + { + m_diskspace.total += size / 1024; + m_diskspace.used += (size - free) / 1024; } } - return PVR_ERROR_NO_ERROR; + return true; } -int Dvb::GetCurrentClientChannel(void) +time_t Dvb::ParseDateTime(const CStdString& date, bool iso8601) { - return m_iCurrentChannel; -} + struct tm timeinfo; -const char* Dvb::GetLiveStreamURL(const PVR_CHANNEL &channelinfo) -{ - SwitchChannel(channelinfo); + memset(&timeinfo, 0, sizeof(tm)); + if (iso8601) + sscanf(date, "%04d%02d%02d%02d%02d%02d", &timeinfo.tm_year, + &timeinfo.tm_mon, &timeinfo.tm_mday, &timeinfo.tm_hour, + &timeinfo.tm_min, &timeinfo.tm_sec); + else + sscanf(date, "%02d.%02d.%04d%02d:%02d:%02d", &timeinfo.tm_mday, + &timeinfo.tm_mon, &timeinfo.tm_year, &timeinfo.tm_hour, + &timeinfo.tm_min, &timeinfo.tm_sec); + timeinfo.tm_mon -= 1; + timeinfo.tm_year -= 1900; + timeinfo.tm_isdst = -1; - return m_channels.at(channelinfo.iUniqueId-1).strStreamURL.c_str(); + return mktime(&timeinfo); } -bool Dvb::OpenLiveStream(const PVR_CHANNEL &channelinfo) +uint64_t Dvb::ParseChannelString(const CStdString& str, CStdString& channelName) { - XBMC->Log(LOG_INFO, "%s channel '%u'", __FUNCTION__, channelinfo.iUniqueId); - - if ((int)channelinfo.iUniqueId == m_iCurrentChannel) - return true; + std::vector tokenlist; + tokenize >(str, tokenlist, "|"); + if (tokenlist.size() < 1) + { + XBMC->Log(LOG_ERROR, "Unable to parse channel string: %s", str.c_str()); + return 0; + } - return SwitchChannel(channelinfo); -} + uint64_t channelId = 0; + std::istringstream ss(tokenlist[0]); + ss >> channelId; + if (ss.fail()) + { + XBMC->Log(LOG_ERROR, "Unable to parse channel id: %s", + tokenlist[0].c_str()); + return 0; + } -void Dvb::CloseLiveStream(void) -{ - m_iCurrentChannel = -1; + channelName.clear(); + if (tokenlist.size() >= 2) + channelName = ConvertToUtf8(tokenlist[1]); + return channelId; } -bool Dvb::SwitchChannel(const PVR_CHANNEL &channel) +unsigned int Dvb::GetChannelUid(const CStdString& str) { - m_iCurrentChannel = channel.iUniqueId; - m_bUpdateEPG = true; - return true; + CStdString channelName; + uint64_t channelId = ParseChannelString(str, channelName); + if (channelId == 0) + return 0; + return GetChannelUid(channelId); } -bool Dvb::GetDeviceInfo() +unsigned int Dvb::GetChannelUid(const uint64_t channelId) { - CStdString url; - url.Format("%s%s", m_strURL.c_str(), "api/version.html"); - - CStdString strXML; - strXML = GetHttpXML(url); - - XMLResults xe; - XMLNode xMainNode = XMLNode::parseString(strXML.c_str(), NULL, &xe); - - if(xe.error != 0) + for (DvbChannels_t::iterator it = m_channels.begin(); + it != m_channels.end(); ++it) { - XBMC->Log(LOG_ERROR, "%s Can't connect to the Recording Service", __FUNCTION__); - XBMC->QueueNotification(QUEUE_ERROR, XBMC->GetLocalizedString(30500)); - Sleep(10000); - return false; + DvbChannel *channel = *it; + for(std::list::iterator backendId = channel->backendIds.begin(); + backendId != channel->backendIds.end(); backendId++) + { + if (channelId == *backendId) + return channel->id; + } } + return 0; +} - XMLNode xNode = xMainNode.getChildNode("version"); - - CStdString strTmp;; - - XBMC->Log(LOG_NOTICE, "%s - DeviceInfo", __FUNCTION__); +CStdString Dvb::BuildURL(const char* path, ...) +{ + CStdString url(m_strURL); + va_list argList; + va_start(argList, path); + url.AppendFormatV(path, argList); + va_end(argList); + return url; +} - // Get Version - if (!xNode.getText()) { - XBMC->Log(LOG_ERROR, "%s Could not parse version from result!", __FUNCTION__); - return false; - } - m_strDVBViewerVersion = xNode.getText(); - CStdString strVersion = m_strDVBViewerVersion.substr(30, 2); - if (atoi(strVersion) < RS_MIN_VERSION) +CStdString Dvb::BuildExtURL(const CStdString& baseURL, const char* path, ...) +{ + CStdString url(baseURL); + // simply add user@pass in front of the URL if username/password is set + if (!g_strUsername.empty() && !g_strPassword.empty()) { - XBMC->Log(LOG_ERROR, "%s - Recording Service version 1.%d or higher required", __FUNCTION__, RS_MIN_VERSION); - XBMC->QueueNotification(QUEUE_ERROR, XBMC->GetLocalizedString(30501), RS_MIN_VERSION); - Sleep(10000); - return false; + CStdString strAuth; + strAuth.Format("%s:%s@", g_strUsername.c_str(), g_strPassword.c_str()); + CStdString::size_type pos = url.find("://"); + if (pos != CStdString::npos) + url.insert(pos + strlen("://"), strAuth); } - XBMC->Log(LOG_NOTICE, "%s - Version: %s", __FUNCTION__, m_strDVBViewerVersion.c_str()); - - return true; + va_list argList; + va_start(argList, path); + url.AppendFormatV(path, argList); + va_end(argList); + return url; } -PVR_ERROR Dvb::SignalStatus(PVR_SIGNAL_STATUS &signalStatus) +CStdString Dvb::ConvertToUtf8(const CStdString& src) { - CStdString strXML, url; - url.Format("%s%s", m_strURL.c_str(), "status.html?aktion=status"); - strXML = GetHttpXML(url); - unsigned int iSignalStartPos, iSignalEndPos; - iSignalEndPos = strXML.find("%"); - - unsigned int iAdapterStartPos, iAdapterEndPos; - iAdapterStartPos = strXML.rfind("3\">", iSignalEndPos) + 3; - iAdapterEndPos = strXML.find("<", iAdapterStartPos); - strncpy(signalStatus.strAdapterName, strXML.substr(iAdapterStartPos, iAdapterEndPos - iAdapterStartPos).c_str(), sizeof(signalStatus.strAdapterName)); - - iSignalStartPos = strXML.find_last_of(">", iSignalEndPos) + 1; - if (iSignalEndPos < strXML.size()) - signalStatus.iSignal = (int)(atoi(strXML.substr(iSignalStartPos, iSignalEndPos - iSignalStartPos).c_str()) * 655.35); - strncpy(signalStatus.strAdapterStatus, "OK", sizeof(signalStatus.strAdapterStatus)); + char *tmp = XBMC->UnknownToUTF8(src); + CStdString dest(tmp); + XBMC->FreeString(tmp); + return dest; +} - return PVR_ERROR_NO_ERROR; +uint64_t Dvb::ParseUInt64(const CStdString& str) +{ + uint64_t value = 0; + std::istringstream ss(str); + ss >> value; + if (ss.fail()) + return 0; + return value; } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/src/DvbData.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/src/DvbData.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/src/DvbData.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/src/DvbData.h 2014-05-04 07:03:11.000000000 +0000 @@ -1,283 +1,252 @@ -#pragma once +#pragma once + +#ifndef PVR_DVBVIEWER_DVBDATA_H +#define PVR_DVBVIEWER_DVBDATA_H -#include "platform/util/StdString.h" -#include "xmlParser.h" #include "client.h" +#include "TimeshiftBuffer.h" +#include "xmlParser.h" +#include "platform/util/StdString.h" #include "platform/threads/threads.h" +#include #define CHANNELDAT_HEADER_SIZE (7) #define ENCRYPTED_FLAG (1 << 0) +#define RDS_DATA_FLAG (1 << 2) #define VIDEO_FLAG (1 << 3) +#define AUDIO_FLAG (1 << 4) #define ADDITIONAL_AUDIO_TRACK_FLAG (1 << 7) #define DAY_SECS (24 * 60 * 60) #define DELPHI_DATE (25569) -#define RECORDING_THUMB_POS (143) -#define MAX_RECORDING_THUMBS (20) -#define RS_MIN_VERSION (21) - -struct ChannelsDat -{ - byte TunerType; - byte ChannelGroup; - byte SatModulationSystem; - byte Flags; - unsigned int Frequency; - unsigned int Simbolrate; - unsigned short LNB_LOF; - unsigned short PMT_PID; - unsigned short Reserved1; - byte SatModulation; - byte AVFormat; - byte FEC; - byte Reserved2; - unsigned short Reserved3; - byte Polarity; - byte Reserved4; - unsigned short Reserved5; - byte Tone; - byte Reserved6; - unsigned short DiSEqCExt; - byte DiSEqC; - byte Reserved7; - unsigned short Reserved8; - unsigned short Audio_PID; - unsigned short Reserved9; - unsigned short Video_PID; - unsigned short TransportStream_ID; - unsigned short Teletext_PID; - unsigned short OriginalNetwork_ID; - unsigned short Service_ID; - unsigned short PCR_PID; - byte Root_len; - char Root[25]; - byte ChannelName_len; - char ChannelName[25]; - byte Category_len; - char Category[25]; - byte Encrypted; - byte Reserved10; -}; + +// minimum version required +#define RS_VERSION_MAJOR 1 +#define RS_VERSION_MINOR 25 +#define RS_VERSION_PATCH1 0 +#define RS_VERSION_PATCH2 0 +#define RS_VERSION_NUM (RS_VERSION_MAJOR << 24 | RS_VERSION_MINOR << 16 | \ + RS_VERSION_PATCH1 << 8 | RS_VERSION_PATCH2) +#define RS_VERSION_STR XSTR(RS_VERSION_MAJOR) "." XSTR(RS_VERSION_MINOR) \ + "." XSTR(RS_VERSION_PATCH1) "." XSTR(RS_VERSION_PATCH2) + +/* forward declaration */ +class DvbGroup; typedef enum DVB_UPDATE_STATE { - DVB_UPDATE_STATE_NONE, - DVB_UPDATE_STATE_FOUND, - DVB_UPDATE_STATE_UPDATED, - DVB_UPDATE_STATE_NEW + DVB_UPDATE_STATE_NONE, + DVB_UPDATE_STATE_FOUND, + DVB_UPDATE_STATE_UPDATED, + DVB_UPDATE_STATE_NEW } DVB_UPDATE_STATE; -struct DvbChannelGroup { - std::string strGroupName; - int iGroupState; - - DvbChannelGroup() - { - iGroupState = DVB_UPDATE_STATE_NEW; - } - - bool operator==(const DvbChannelGroup &right) const - { - return (! strGroupName.compare(right.strGroupName)); - } - +class DvbChannel +{ +public: + /*!< @brief unique id passed to xbmc database. see FIXME for more details */ + unsigned int id; + /*!< @brief backend number for generating the stream url */ + unsigned int backendNr; + /*!< @brief channel number on the frontend */ + unsigned int frontendNr; + /*!< @brief list of backend ids (e.g AC3, other languages, ...) */ + std::list backendIds; + uint64_t epgId; + CStdString name; + CStdString streamURL; + CStdString logoURL; + bool radio; + bool hidden; + bool encrypted; }; -struct DvbChannel +class DvbGroup { - bool bRadio; - int iUniqueId; - int iChannelNumber; - int iChannelId; - uint64_t llEpgId; - byte Encrypted; - std::string strGroupName; - std::string strChannelName; - std::string strStreamURL; - std::string strIconPath; - int iChannelState; - - DvbChannel() - { - iChannelState = DVB_UPDATE_STATE_NEW; - } - - bool operator==(const DvbChannel &right) const - { - bool bChanged = true; - bChanged = bChanged && (bRadio == right.bRadio); - bChanged = bChanged && (iUniqueId == right.iUniqueId); - bChanged = bChanged && (iChannelNumber == right.iChannelNumber); - bChanged = bChanged && (! strGroupName.compare(right.strGroupName)); - bChanged = bChanged && (! strChannelName.compare(right.strChannelName)); - bChanged = bChanged && (! strStreamURL.compare(right.strStreamURL)); - bChanged = bChanged && (! strIconPath.compare(right.strIconPath)); - - return bChanged; - } - +public: + CStdString name; + std::list channels; + bool radio; + bool hidden; }; -struct DvbEPGEntry +struct DvbEPGEntry { int iEventId; - std::string strTitle; - int iChannelId; + CStdString strTitle; + unsigned int iChannelUid; time_t startTime; time_t endTime; - std::string strPlotOutline; - std::string strPlot; + CStdString strPlotOutline; + CStdString strPlot; }; -struct DvbTimer +class DvbTimer { - std::string strTitle; - std::string strPlot; - int iChannelId; - time_t startTime; - time_t endTime; - bool bRepeating; - int iWeekdays; - int iEpgID; - int iTimerID; - int iPriority; - int iFirstDay; - PVR_TIMER_STATE state; - int iUpdateState; - unsigned int iClientIndex; - +public: DvbTimer() { iUpdateState = DVB_UPDATE_STATE_NEW; } - - bool like(const DvbTimer &right) const + + bool like(const DvbTimer& right) const { bool bChanged = true; - bChanged = bChanged && (startTime == right.startTime); - bChanged = bChanged && (endTime == right.endTime); - bChanged = bChanged && (iChannelId == right.iChannelId); - bChanged = bChanged && (bRepeating == right.bRepeating); - bChanged = bChanged && (iWeekdays == right.iWeekdays); - bChanged = bChanged && (iEpgID == right.iEpgID); - + bChanged = bChanged && (startTime == right.startTime); + bChanged = bChanged && (endTime == right.endTime); + bChanged = bChanged && (iChannelUid == right.iChannelUid); + bChanged = bChanged && (bRepeating == right.bRepeating); + bChanged = bChanged && (iWeekdays == right.iWeekdays); + bChanged = bChanged && (iEpgId == right.iEpgId); return bChanged; } - - bool operator==(const DvbTimer &right) const + + bool operator==(const DvbTimer& right) const { bool bChanged = true; - bChanged = bChanged && (startTime == right.startTime); - bChanged = bChanged && (endTime == right.endTime); - bChanged = bChanged && (iChannelId == right.iChannelId); - bChanged = bChanged && (bRepeating == right.bRepeating); - bChanged = bChanged && (iWeekdays == right.iWeekdays); - bChanged = bChanged && (iEpgID == right.iEpgID); - bChanged = bChanged && (state == right.state); - bChanged = bChanged && (! strTitle.compare(right.strTitle)); - bChanged = bChanged && (! strPlot.compare(right.strPlot)); - + bChanged = bChanged && like(right); + bChanged = bChanged && (state == right.state); + bChanged = bChanged && (strTitle == right.strTitle); + bChanged = bChanged && (strPlot == right.strPlot); return bChanged; } + +public: + CStdString strTitle; + CStdString strPlot; + unsigned int iChannelUid; + time_t startTime; + time_t endTime; + bool bRepeating; + int iWeekdays; + int iEpgId; + int iTimerId; + int iPriority; + int iFirstDay; + PVR_TIMER_STATE state; + DVB_UPDATE_STATE iUpdateState; + unsigned int iClientIndex; }; struct DvbRecording { - std::string strRecordingId; + CStdString id; time_t startTime; - int iDuration; - std::string strTitle; - std::string strStreamURL; - std::string strPlot; - std::string strPlotOutline; - std::string strChannelName; - std::string strThumbnailPath; -}; - -class Dvb : public PLATFORM::CThread + int duration; + CStdString title; + CStdString streamURL; + CStdString plot; + CStdString plotOutline; + CStdString channelName; + CStdString thumbnailPath; +}; + +typedef std::vector DvbChannels_t; +typedef std::vector DvbGroups_t; +typedef std::vector DvbTimers_t; +typedef std::vector DvbRecordings_t; + +class Dvb + : public PLATFORM::CThread { -private: +public: + Dvb(void); + ~Dvb(); - // members - std::string m_strDVBViewerVersion; - bool m_bIsConnected; - std::string m_strServerName; - std::string m_strURL; - std::string m_strURLStream; - std::string m_strURLRecording; - std::string m_strEPGLanguage; - int m_iTimezone; - int m_iNumRecordings; - int m_iNumChannelGroups; - int m_iCurrentChannel; - unsigned int m_iUpdateTimer; - bool m_bUpdateTimers; - bool m_bUpdateEPG; - std::vector m_channels; - std::vector m_timers; - std::vector m_recordings; - std::vector m_groups; - std::vector m_locations; + bool Open(); + bool IsConnected(); - unsigned int m_iClientIndexCounter; + CStdString GetBackendName(); + CStdString GetBackendVersion(); + PVR_ERROR GetDriveSpace(long long *total, long long *used); - PLATFORM::CMutex m_mutex; - PLATFORM::CCondition m_started; - + bool SwitchChannel(const PVR_CHANNEL& channel); + unsigned int GetCurrentClientChannel(void); + PVR_ERROR GetChannels(ADDON_HANDLE handle, bool bRadio); + PVR_ERROR GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL& channel, time_t iStart, time_t iEnd); + unsigned int GetChannelsAmount(void); - // functions + PVR_ERROR GetChannelGroups(ADDON_HANDLE handle, bool bRadio); + PVR_ERROR GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP& group); + unsigned int GetChannelGroupsAmount(void); + + PVR_ERROR GetTimers(ADDON_HANDLE handle); + PVR_ERROR AddTimer(const PVR_TIMER& timer); + PVR_ERROR UpdateTimer(const PVR_TIMER& timer); + PVR_ERROR DeleteTimer(const PVR_TIMER& timer); + unsigned int GetTimersAmount(void); + + PVR_ERROR GetRecordings(ADDON_HANDLE handle); + PVR_ERROR DeleteRecording(const PVR_RECORDING& recinfo); + unsigned int GetRecordingsAmount(); + + bool OpenLiveStream(const PVR_CHANNEL& channelinfo); + void CloseLiveStream(); + int ReadLiveStream(unsigned char *pBuffer, unsigned int iBufferSize); + long long SeekLiveStream(long long iPosition, int iWhence /* = SEEK_SET */); + long long PositionLiveStream(void); + long long LengthLiveStream(void); + CStdString& GetLiveStreamURL(const PVR_CHANNEL& channelinfo); + +protected: + virtual void *Process(void); - CStdString GetHttpXML(CStdString& url); - int GetChannelNumber(CStdString strChannelId); +private: + // functions + CStdString GetHttpXML(const CStdString& url); CStdString URLEncodeInline(const CStdString& strData); - void SendSimpleCommand(const CStdString& strCommandURL); bool LoadChannels(); - std::vector LoadTimers(); + DvbTimers_t LoadTimers(); void TimerUpdates(); - void GenerateTimer(const PVR_TIMER &timer, bool bNewtimer = true); - int GetTimerID(const PVR_TIMER &timer); + void GenerateTimer(const PVR_TIMER& timer, bool bNewtimer = true); + int GetTimerId(const PVR_TIMER& timer); // helper functions - static bool GetInt(XMLNode xRootNode, const char* strTag, int& iIntValue); - static bool GetBoolean(XMLNode xRootNode, const char* strTag, bool& bBoolValue); - static bool GetString(XMLNode xRootNode, const char* strTag, CStdString& strStringValue); - bool GetStringLng(XMLNode xRootNode, const char* strTag, CStdString& strStringValue); - void GetPreferredLanguage(); - void GetTimeZone(); - void RemoveNullChars(CStdString &String); - bool GetDeviceInfo(); + bool GetXMLValue(const XMLNode& node, const char* tag, int& value); + bool GetXMLValue(const XMLNode& node, const char* tag, bool& value); + bool GetXMLValue(const XMLNode& node, const char* tag, CStdString& value, + bool localize = false); + void RemoveNullChars(CStdString& str); + bool CheckBackendVersion(); + bool UpdateBackendStatus(bool updateSettings = false); + time_t ParseDateTime(const CStdString& strDate, bool iso8601 = true); + uint64_t ParseChannelString(const CStdString& str, CStdString& channelName); + unsigned int GetChannelUid(const CStdString& str); + unsigned int GetChannelUid(const uint64_t channelId); + CStdString BuildURL(const char* path, ...); + CStdString BuildExtURL(const CStdString& baseURL, const char* path, ...); + CStdString ConvertToUtf8(const CStdString& src); + uint64_t ParseUInt64(const CStdString& str); +private: + bool m_connected; + unsigned int m_backendVersion; -protected: - virtual void *Process(void); + int m_timezone; + CStdString m_epgLanguage; + struct { long long total, used; } m_diskspace; + + CStdString m_strURL; + unsigned int m_currentChannel; + + /* channels + active (not hidden) channels */ + DvbChannels_t m_channels; + unsigned int m_channelAmount; + + /* channel groups + active (not hidden) groups */ + DvbGroups_t m_groups; + unsigned int m_groupAmount; -public: - Dvb(void); - ~Dvb(); + unsigned int m_iUpdateTimer; + bool m_bUpdateTimers; + bool m_bUpdateEPG; + DvbRecordings_t m_recordings; + TimeshiftBuffer *m_tsBuffer; - const char * GetServerName(); - bool IsConnected(); - int GetChannelsAmount(void); - PVR_ERROR GetChannels(ADDON_HANDLE handle, bool bRadio); - int ParseDateTime(CStdString strDate, bool iDateFormat = true); - PVR_ERROR GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart, time_t iEnd); - int GetCurrentClientChannel(void); - int GetTimersAmount(void); - PVR_ERROR GetTimers(ADDON_HANDLE handle); - PVR_ERROR AddTimer(const PVR_TIMER &timer); - PVR_ERROR UpdateTimer(const PVR_TIMER &timer); - PVR_ERROR DeleteTimer(const PVR_TIMER &timer); - unsigned int GetRecordingsAmount(); - PVR_ERROR GetRecordings(ADDON_HANDLE handle); - PVR_ERROR DeleteRecording(const PVR_RECORDING &recinfo); - unsigned int GetNumChannelGroups(void); - PVR_ERROR GetChannelGroups(ADDON_HANDLE handle); - PVR_ERROR GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group); - PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS &signalStatus); - const char* GetLiveStreamURL(const PVR_CHANNEL &channelinfo); - bool OpenLiveStream(const PVR_CHANNEL &channelinfo); - void CloseLiveStream(); - bool SwitchChannel(const PVR_CHANNEL &channel); - bool Open(); - void Action(); + DvbTimers_t m_timers; + unsigned int m_iClientIndexCounter; + + PLATFORM::CMutex m_mutex; + PLATFORM::CCondition m_started; }; +#endif diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/src/TimeshiftBuffer.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/src/TimeshiftBuffer.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/src/TimeshiftBuffer.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/src/TimeshiftBuffer.cpp 2014-05-04 07:03:11.000000000 +0000 @@ -0,0 +1,100 @@ +#include "TimeshiftBuffer.h" +#include "client.h" +#include "platform/util/util.h" + +using namespace ADDON; + +TimeshiftBuffer::TimeshiftBuffer(CStdString streampath, CStdString bufferpath) + : m_bufferPath(bufferpath) +{ + m_streamHandle = XBMC->OpenFile(streampath, 0); + m_bufferPath += "/tsbuffer.ts"; + m_filebufferWriteHandle = XBMC->OpenFileForWrite(m_bufferPath, true); + Sleep(100); + m_filebufferReadHandle = XBMC->OpenFile(m_bufferPath, 0); + m_shifting = true; + CreateThread(); +} + +TimeshiftBuffer::~TimeshiftBuffer(void) +{ + Stop(); + if (IsRunning()) + StopThread(); + + if (m_filebufferWriteHandle) + XBMC->CloseFile(m_filebufferWriteHandle); + if (m_filebufferReadHandle) + XBMC->CloseFile(m_filebufferReadHandle); + if (m_streamHandle) + XBMC->CloseFile(m_streamHandle); +} + +bool TimeshiftBuffer::IsValid() +{ + return (m_streamHandle != NULL); +} + +void TimeshiftBuffer::Stop() +{ + m_shifting = false; +} + +void *TimeshiftBuffer::Process() +{ + XBMC->Log(LOG_DEBUG, "TimeShiftProcess:: thread started"); + byte buffer[STREAM_READ_BUFFER_SIZE]; + int bytesRead = STREAM_READ_BUFFER_SIZE; + + while (m_shifting) + { + bytesRead = XBMC->ReadFile(m_streamHandle, buffer, sizeof(buffer)); + XBMC->WriteFile(m_filebufferWriteHandle, buffer, bytesRead); + } + XBMC->Log(LOG_DEBUG, "TimeShiftProcess:: thread stopped"); + return NULL; +} + +long long TimeshiftBuffer::Seek(long long iPosition, int iWhence) +{ + if (m_filebufferReadHandle) + return XBMC->SeekFile(m_filebufferReadHandle, iPosition, iWhence); + return 0; +} + +long long TimeshiftBuffer::Position() +{ + if (m_filebufferReadHandle) + return XBMC->GetFilePosition(m_filebufferReadHandle); + return 0; +} + +long long TimeshiftBuffer::Length() +{ + if (m_filebufferReadHandle) + return XBMC->GetFileLength(m_filebufferReadHandle); + return 0; +} + +int TimeshiftBuffer::ReadData(unsigned char *pBuffer, unsigned int iBufferSize) +{ + unsigned int totalReadBytes = 0; + unsigned int totalTimeWaited = 0; + if (m_filebufferReadHandle) + { + unsigned int read = XBMC->ReadFile(m_filebufferReadHandle, pBuffer, iBufferSize); + totalReadBytes += read; + + while (read < iBufferSize && totalTimeWaited < BUFFER_READ_TIMEOUT) + { + Sleep(BUFFER_READ_WAITTIME); + totalTimeWaited += BUFFER_READ_WAITTIME; + read = XBMC->ReadFile(m_filebufferReadHandle, pBuffer, iBufferSize - totalReadBytes); + totalReadBytes += read; + } + + if (totalTimeWaited > BUFFER_READ_TIMEOUT) + XBMC->Log(LOG_DEBUG, "Timeshifterbuffer timed out, waited : %d", totalTimeWaited); + } + return totalReadBytes; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/src/TimeshiftBuffer.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/src/TimeshiftBuffer.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.dvbviewer/src/TimeshiftBuffer.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvbviewer/src/TimeshiftBuffer.h 2014-05-04 07:03:11.000000000 +0000 @@ -0,0 +1,35 @@ +#pragma once + +#ifndef PVR_DVBVIEWER_TIMESHIFTBUFFER_H +#define PVR_DVBVIEWER_TIMESHIFTBUFFER_H + +#include "platform/util/StdString.h" +#include "platform/threads/threads.h" + +#define STREAM_READ_BUFFER_SIZE 8192 +#define BUFFER_READ_TIMEOUT 10000 +#define BUFFER_READ_WAITTIME 50 + +class TimeshiftBuffer : public PLATFORM::CThread +{ +public: + TimeshiftBuffer(CStdString streampath, CStdString bufferpath); + ~TimeshiftBuffer(void); + int ReadData(unsigned char *pBuffer, unsigned int iBufferSize); + bool IsValid(); + long long Seek(long long iPosition, int iWhence); + long long Position(); + long long Length(); + void Stop(void); + +private: + virtual void *Process(void); + + CStdString m_bufferPath; + void *m_streamHandle; + void *m_filebufferReadHandle; + void *m_filebufferWriteHandle; + bool m_shifting; +}; + +#endif diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/addon.xml.in xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/addon.xml.in --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/addon.xml.in 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/addon.xml.in 2014-05-04 06:40:42.000000000 +0000 @@ -1,110 +1,170 @@ - + + XBMC se voorprogram vir Tvheadend XBMC's frontend for Tvheadend + XBMC клиент за DVBViewer + Frontal de l'XBMC pel Tvheadend Rozhraní XBMC pro Tvheadend + Blaen XBMC ar gyfer Tvheadend XBMC's frontend til Tvheadend - XBMC's Zugang zu Tvheadend + XBMC Oberfläche für Tvheadend Το frontend του XBMC για το Tvheadend XBMC's frontend for Tvheadend + XBMC's frontend for Tvheadend Interfaz XBMC para Tvheadend Interfaz XBMC para Tvheadend + XBMC esi Tvheadend'ile XBMC:n Tvheadend-tuki Enregistreur Vidéo XBMC pour Tvheadend + Frontal XBMC pour Tvheadend Interface do XBMC para Tvheadend ממשק קדמי XBMC עבורTvheadend + XBMC sučelje za Tvheadend XBMC TVHeadend előtér-kiszolgáló + Frontend XBMC untuk Tvheadend Frontend di XBMC per Tvheadend TVheadend 用 XBMC フロントエンド + XBMC-ის სამომხმარებლო მხარე Tvheadend-თვის Tvheadend 을 위한 XBMC 프론트엔드 XBMC sąsaja skirta Tvheadend + XBMC galasistēma Tvheadend XBMC's frontend for Tvheadend + Bahagian hadapan XBMC untuk XBMC's frontend voor Tvheadend - Interfejs XBMC dla Tvheadend + XBMC sitt frontend for Tvheadend + Klient XBMC dla Tvheadend Frontend XBMC para Tvheadend Frontend XBMC para Tvheadend Frontend XBMC pentru Tvheadend Интерфейс XBMC для Tvheadend XBMC rozhranie pre Tvheadend XBMC-jev vmesnik za Tvheadend + Frontend i XBMC'së për Tvheadend XBMC's frontend för Tvheadend - XBMC的Tvheadend前端 + Tvheadend காண XBMC முன்நிலை + Интерфейси XBMC барои Tvheadend + XBMC'nin Tvheadend için arayüzü + Накладка на XBMC для Tvheadend + Giao tiếp XBMC cho Tvheadend + XBMC 的 Tvheadend 前端 + XBMC的前端Tvheadend Tvheadend voorprogram; ondersteun stroom van Lewendige TV & Opnames, EPG, Tydhouers Tvheadend frontend; supporting streaming of Live TV & Recordings, EPG, Timers + Tvheadend клиент. Поддържа стрийминг и записване на телевизия, електронен програмен справочник и броячи. + Interfície per al Tvheadend; suportant fluxes de TV en directe i enregistraments, EPG, temporitzadors Rozhraní Tvheadend. Podporuje proudové vysílání živého vysílání a nahrávek, poslech kanálů rádia, EPG, a časovače. + Blaen Tvheadend: cefnogi ffrydio Teledu Byw a Recordio, Amserlenni, Amseryddion Tvheadend frontend; understøtter streaming af direkte TV og optagelser, EPG og timere - Erlaubt die Wiedergabe von Live TV und Aufnahmen mittels Tvheadend auf XBMC. Desweiteren werden EPG und Timer unterstützt. + Tvheadend Oberfläche; Unterstützung von Live TV & Aufnahmen, EPG und Timern. Frontend για το Tvheadend. Υποστηρίζει ροές Live TV & Εγγραφές, EPG, Χρονοδιακόπτες Tvheadend frontend; supporting streaming of Live TV & Recordings, EPG, Timers + Tvheadend frontend; supporting streaming of Live TV & Recordings, EPG, Timers Interfaz Tvheadend; soporta la reproducción de TV en vivo, grabación, guía de programación, temporizadores Interfaz Tvheadend; soporta la reproducción de TV en vivo, grabación, guía de programación, temporizadores + Tvheadend esi. Toetab telekanalite striimimist ja salvestamist ning elektroonilist saatekava. Tvheadend; tukee reaaliaikaisen television ja nauhoituksien streamausta, EPGtä ja nauhoituksien ajastusta. - Enregistreur Vidéo pourTvheadend supportant la lecture en continu du direct télévision et des enregistrements, les guides de programme TV, les minuteries - Interface Tvheadend; soporta a transmisión de TV ao vivo e Gravacións, EPG, temporizadores + Enregistreur Vidéo pour Tvheadend supportant la lecture en continu du direct télévision et des enregistrements, les guides de programme TV, les minuteries + Frontal pour Tvheadend, prenant en charge la lecture en transit des télés en direct & les enregistrements, le GÉP et minuteries. + Interface Tvheadend; soporta a transmisión de TV ao vivo e Gravacións, Guía, temporizadores ממשק קדמיTvheadend:תומך בטלוויזיה חיה והקלטות. לוחות שידורים,והקלטה מתוזמנת. + Tvheadend pozadinski softver podržava gledanje i snimanje TV programa, elektronski programski vodič (EPG) i zakazano snimanje. TVHeadend előtér-kiszolgáló. Élő adások és felvételek sugárzásának támogatása EPG-vel és időzítéssel + Frontend Tvheadend; mendukung menangkap siaran TV Live & Rekaman, EPG, Timer Frontend di Tvheadend; supporta lo streaming di Live TV & Registrazione, EPG, Timers TVheadend フロントエンドです。ライブTVストリーミング、録画、EPG、タイマーをサポートしています。 + Tvheadend-ის სამომხმარებლო მხარე მხარს უჭერს Live TV სტრიმინგსა და ჩანაწერებს, EPG-სა და თაიმერებს. Tvheadend 프론트엔드; TV 시청 & 녹화, EPG, 타이머 지원 Tvheadend sąsaja remia transliacijos Live TV & Įrašus, EPG, Laikmačiai + Tvheadend galasistēma; atbalsta tieštaides TV un ierakstu straumēšanu, EPG, taimerus Tvheadend frontend; supporting streaming of Live TV & Recordings, EPG, Timers + Bahagian hadapan Tvheadend; menyokong penstirman Langsung & Rakaman, EPG, Pemasa TV Tvheadend frontend, het ondersteunen streaming van Live TV & Recordings, EPG, Timers - Warstwa prezentacji Tvheadend; wspiera TV na żywo i nagrywanie, EPG oraz liczniki czasu + Tvheadend frontend; støtte for visning av direkte TV og opptakk, EPG, tidstakere + Klient Tvheadend. Wspiera strumieniowanie kanałów telewizyjnych, nagrywanie, planowanie nagrań oraz funkcje przewodnika TV. Frontend Tvheadend; suporta transmissão de TV em Directo e Gravações, EPG, Temporizadores Tvheadend; suporta streaming de TV Ao Vivo e Gravada, EPG, Agendamentos Frontend Tvheadend; se poate difuza în flux a televiziunii în direct și a înregistrăriilor, EPG, Cronometre Интерфейс для Tvheadend. Поддерживает просмотр и запись ТВ, EPG и таймеры Rozhranie pre Tvheadend; je podporované streamovanie živého televízneho vysielania a nahrávok, EPG, časovačov Vmesnik za Tvheadend; podpira pretakanje televizije v živo & posnetkov, EPG, časovnike + Tvheadend frotnend përkrahën transmetimin e Live TV'së, EPG'së dhe "timer'ë" Tvheadend frontend; stödjer strömning av direktsänd TV & inspelningar, EPG, Timers - Tvheadend前端,支持直播电视播放和录制、电子节目单、定时器 + NextPVR முன்நிலை. லைவ் டிவி & பதிவுகளின் ஸ்ட்ரீமிங், EPG கேட்கவும் துணைபுரிகிறது. + Интерфейси Tvheadend; дастгирии ҷараёни Сабтҳо, Вақтсанҷҳо, Live TV ва EPG + Tvheadend arayüzü; Canlı Yayın içi akış desteği & Kayıt yapabilme, EPG, Zamanlayıcılar + Накладка для Tvheadend; підтримує стрім потоку Live TV і записування, EPG (телегіду), таймерів + Giao tiếp cho Tvheadend; hỗ trợ truyền phát và thu chương trình Live TV, hẹn giờ, và hiển thị lịch chiếu (EPG) + Tvheadend 前端,支持直播电视和录像流媒体、电子节目单、定时器 + Tvheadend前端,支援的串流媒體包含有直播電視和錄製節目,電子節目表,定時器 等 Hierdie is onstabiele sagteware! Die outeurs is op geen manier verantwoordelik vir gefaalde opnames, inkorrekte tydhouers, vermorsde ure, of enige ander ongewensde effekte... This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. + Тази програма е нестабилна! Авторите не носят отговорност за неуспешно записване, некоректни броячи, пропиляното време и други нежелани ефекти. + Això és programari inestable! Els autors no són de cap manera responsables dels enregistraments que han fallat, temporitzadors incorrectes, hores perdudes, o qualssevol altres efectes no desitjats.. Tento software není stabilní. Autoři nejsou žádným způsobem zodpovědní za selhání při nahrávání, neplatné časovače, ztracený čas, či jakékoliv jiné nežádoucí události... + Mae hwn yn feddalwedd ansad! Nid yw'r awduron yn gyfrifol mewn unrhyw ffordd am fethu recordio, amseru gwallus, oriau wedi eu gwastraffu nac effeithiau anymunol eraill. Dette er ustabil software! Ophavsmændene er på ingen måde ansvarlige for mislykkede optagelser, ukorrekte timere, spildte timer, eller andre uønskede konsekvenser. - Diese Software ist noch in der Entwicklung! Die Autoren sind nicht für fehlgeschlagene Aufnahmen, falsche Timer, verschwendete Zeit oder andere ungewollte Effekte verantwortlich. + Dies ist instabile Software! Die Autoren sind in keiner Weise verantwortlich für fehlgeschlagene Aufnahmen, falsche Timer, verschwendete Zeit oder andere ungewünschte Effekte. Ασταθές πρόγραμμα! Οι δημιουργοί δεν είναι σε καμία περίπτωση υπεύθυνοι για αποτυχημένες εγγραφές, λανθασμένους χρονοδιακόπτες, χαμένες ώρες, ή κάθε είδους ανεπιθύμητα αποτελέσματα.. This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. + This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. ¡Este software es inestable! Los autores no se responsabilizan de grabaciones fallidas, temporizadores incorrectos, horas perdidas, o cualquier otro efecto no deseado... ¡Este software es inestable! Los autores no se responsabilizan por grabaciones fallidas, temporizadores incorrectos, horas perdidas, o cualquier otro efecto no deseado.. ¡Esto es software inestable! Los autores no son de ninguna manera responsables por grabaciones fallidas, temporizadores incorrectos, horas perdidas o cualquier otro efecto no deseado... + See on ebastabiilne tarkvara! Autorid ei ole kuidagi moodi vastutavad nurjunud salvestiste, ebaõige aegrelee, raisatud tundide ega muude soovimatute asjade eest. Tämä on epävakaa ohjelma! Ohjelman kirjoittavat eivät vastaa millään tavalla epäonnistuneista nauhoituksista, ajastimen väärästä toiminnasta, hukatusta ajasta tai muista ei-halutuista tapahtumista. Ce programme est instable ! Les auteurs ne sont en aucun cas responsables de l'échec des enregistrements, des minuteries inexactes, du temps perdu ou tous autres effets indésirables. + Ce logiciel est instable! Les auteurs ne sont aucunement responsables des enregistrements défaillants, des minuteries erronées, des heures perdues ou tout autre effet indésirable. Este é software non estable, os autores non se fan responsábeis dos erros na gravacións, temporizadores incorrectos, e outros efectos non desexados. זוהי תוכנה בלתי יציבה!מחברי התכנה אינם אחראים להקלטות כושלות,מתזמני הקלטות שגויים,שעות מבוזבזות,או כל תוצאה בלתי רצויה... + Ovo je nestabilan softver! Autori nisu ni na koji način odgovorni za neuspjelo snimanje, netočna vremena snimanja, izgubljene sate, ili bilo koje druge nepoželjne učinke... Ez nem stabil szoftver! A készítők nem vállalnak felelősséget, a hibás felvételért, rossz időzítésért, elvesztegetett időért... + Ini merupakan software yang tidak stabil! Penulis tidak bertanggung jawab untuk rekaman gagal, timer salah, waktu terbuang, atau efek tak diinginkan lainnya... Þetta er óstöðugur hugbúnaður! Höfundarnir eru á engann hátt ábyrgir fyrir misheppnuðum upptökum, röngum upptökutímum, klukkustundum sem að fóru í súginn eða nokkrum öðrum óæskilegum áhrifum. Questo software è instabile! Gli autori non sono in alcun modo responsabili per registrazioni fallite, timers incorretti, ore perse, o qualsiasi altro effetto indesiderato. これは不安定なソフトウェアです!本プログラムの作者は、録画の失敗、正確に作動しなかったタイマー、無駄にした時間、その他あらゆる好ましくない結果について責任を負わないものとします。 + ეს არის არასტაბილური პროგრამული უზრუნველყოფა! ავტორები არ არიან პასუხისმგებელი შეცდომებზე, არასწორ EPG-ზე, დაკარგულ დროზე ან სხვა ხარვეზებზე 이 소프트웨어는 불안정합니다! 제작자는 녹화 실패, 부정확한 타이머, 시간 낭비 및 기타 예상하지 못한 결과에 대해 책임지지 않습니다.. Tai yra nestabili programinė įranga! Autorius jokiu būdu neatsakingas už nepavykusius įrašus, neteisingus laikmačius, iššvaistytas valandas, ar nutikus kitiems nepageidaujamiems poveikiams ...[COLOR=red](xbmc.lt siūlo/rekomenduoja testuojant šį priedą persijungti į Anglų [orinali] kalbą)[/COLOR] + Šī ir nestabila programmatūra! Autori nav nekādā vaidā atbildīgi par nesanākušiem ierakstiem, nepareiziem taimeriem, iztērētām stundām vai jebkādiem citiem nevēlamiem efektiem.. This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects. + Ini merupakan perisian tidak stabil! Pengarang tidak bertanggungjawab atas kegagalan rakaman, pemasa tidak betul, masa yang dibazirkan, atau apa jua kesan yang tidak dikehendaki.. Dit is mogelijk onstabiele software! De auteurs zijn op geen enkele wijze verantwoordelijk voor de mislukte opnames, onjuiste timers, verspilde uren, of een andere ongewenste effecten .. - To oprogramowanie jest niestabilne! Autorzy w żaden sposób nie odpowiadają za nieudane nagrania, źle działające liczniki czasu, stracone godziny czy też jakiekolwiek inne niepożądane efekty. + Dette er ustabilt programvare! Forfatterne er ikke ansvarlig på noen måte for ødelagte opptak, feile timere, bortkastede timer, eller andre uønskede hendinger... + Oprogramowanie nadal jest w fazie rozwoju i jest niestabilne! Autorzy w żaden sposób nie są odpowiedzialni za błędne nagrania, błędy planowaniu nagrań, zmarnowany czas ani jakiekolwiek inne niepożądane efekty. Este software é instável! Os autores não são de forma alguma responsáveis por gravações falhadas, temporizadores incorrectos, horas desperdiçadas, ou qualquer outro tipo de efeitos indesejáveis.. Este é um software instável! Os autores não são responsáveis por falhas nas gravações, agendamentos incorretos, horas desperdiçadas, ou quaisquer outros efeitos indesejáveis... Acest software nu este stabil! Autorii nu sunt în niciun caz responsabili pentru înregistrările eșuate, cronometre incorecte, ore pierdute sau orice alt efect nedorit. Это нестабильная программа! Авторы не несут ответственности за неудачную запись, неправильные таймеры, потраченное время и другие нежелательные последствия. Tento softvér nie je stabilný! Autori nenesú žiadnu zodpovednosť za chybné nahrávky vysielania, nesprávne časovače alebo iné neželané udalosti spôsobené týmto softvérom.. To je nestabilna programska oprema! Avtorji niso odgovorni za neuspela snemanja, nepravilne časovnike, zapravljen čas in katerikoli drug neželen učinek... + Ky program nuk është ende stabil! Autorët e këtij programi nuk janë në as një menyr përgjegjës për rregistrime të gabuara, timer të pasaktë, kohë të humbur ose efekte të tilla të padëshirueshme. + Овај софтвер је нестабилан! Аутори ни на који начин нису одговорни за неуспела снимања, неисправна заказана снимања, изгубљене сате или друге нежељене ефекте. Detta är ostabil programvara! Upphovsmännen är inte ansvariga för felaktiga inspelningar, inkorrekta timers, slösad tid eller andra oönskade effekter.. - 这是不稳定版的软件!作者不对录制失败、错误定时造成时间浪费或其它不良影响负责。 + இந்த நிலையற்ற மென்பொருள்! தோல்வியடைந்தது பதிவுகள், தவறான டைமர்கள், வீணாகி மணி, அல்லது வேறு எந்த விரும்பத்தகாத விளைவுகலுக்கு இதன் ஆசிரியர்கள் பொறுப்பு இல்லை. + Ин нармафзори ноустувор аст! Муаллифон барои вайрониҳои сабт, вақтсанҷҳои нодуруст, соатҳои бефоида ва дигар таъсирҳои номатлуб ҷавобгар намебошанд. + Bu stabil olmayan program! Yapımcılar hatalı kayıtlardan, bozuk sürelerden, harcanan vakitten veya herhangi bir olumsuz etkiden dolayı sorumlu tutulamaz. + Це нестабільна програма! Автори не несуть відповідальності за попсуті записи, неправильні таймери, втрачений час та інші небажані ефекти. + Đây là phần mềm không ổn định! Các tác giả không chịu trách nhiệm đối với bản ghi âm thất bại, giờ không chính xác, giờ lãng phí, hoặc bất kỳ tác dụng không mong muốn khác.. + 这是不稳定版的软件!作者不对录像失败、错误定时造成时间浪费或其它不良影响负责。 + 這是測試版軟體!其原創作者並無法對於以下情況負責,包含:錄影失敗,不正確的定時設定,多餘時數,或任何產生的其它不良影響... @OS@ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/changelog.txt xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/changelog.txt --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/changelog.txt 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/changelog.txt 2014-05-04 06:40:42.000000000 +0000 @@ -1,3 +1,30 @@ +1.9.27 +- fix channel icons for recordings + +1.9.24 +- add EDL support + +1.9.23 +- add timeshift buffer functions + +1.8.21 + +- fixed connection being dropped incorrectly, when a packet size timed out with a one or more bytes read, but less than 4 bytes read +- tvheadend uses it's own byte order. don't use ntohl + +1.8.20 + +- sync with PVR API v1.8.1 +- use XBMC's new callback methods for codec ids + +1.8.19 + +- sync with PVR API v1.8.0 + +1.7.19 + +- bump after PVR API version bump + 1.6.19 - add timeshift skip support (FF/RW still not working) diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Afrikaans/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Afrikaans/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Afrikaans/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Afrikaans/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Afrikaans (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/af/)\n" +"Language-Team: Afrikaans (http://www.transifex.com/projects/p/xbmc-main/language/af/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Albanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Albanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Albanian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Albanian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,77 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Albanian (http://www.transifex.com/projects/p/xbmc-main/language/sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Tvheadend hostname or IP address" +msgstr "Tvheadend hostname ose adresa IP" + +msgctxt "#30001" +msgid "HTTP port" +msgstr "HTTP porti" + +msgctxt "#30002" +msgid "HTSP port" +msgstr "HTSP porti" + +msgctxt "#30003" +msgid "Username" +msgstr "Emër-përdoruesi" + +msgctxt "#30004" +msgid "Password" +msgstr "Fjalkalimi" + +msgctxt "#30006" +msgid "Connect timeout in seconds" +msgstr "Timeout i lidhjes në sekonda" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Timeout i përgjigjjes në eskonda" + +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Cilësimet e transkodimit për Tvheadend" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Cilësimet e transkodimit" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Aktivo transkodimin" + +msgctxt "#30103" +msgid "Audio codec" +msgstr "Audio codec'i" + +msgctxt "#30104" +msgid "Video codec" +msgstr "Video codec'i" + +msgctxt "#30105" +msgid "Resolution" +msgstr "Zbërthimi" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "U ndërpre nga '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "U rilidh me '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Amharic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Amharic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Amharic/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Amharic/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Amharic (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/am/)\n" +"Language-Team: Amharic (http://www.transifex.com/projects/p/xbmc-main/language/am/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -33,6 +32,22 @@ msgid "Password" msgstr "የመግቢያ ቃል" +msgctxt "#30006" +msgid "Connect timeout in seconds" +msgstr "ግንኙነት ማስቆሚያ በ ሰከንዶች" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "መመለሻ ጊዜ በ ሰከንዶች" + +msgctxt "#30103" +msgid "Audio codec" +msgstr "የ ድምፅ codec" + +msgctxt "#30104" +msgid "Video codec" +msgstr "የ ቪዲዮ codec" + msgctxt "#30105" msgid "Resolution" msgstr "Resolution" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Arabic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Arabic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Arabic/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Arabic/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Arabic (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ar/)\n" +"Language-Team: Arabic (http://www.transifex.com/projects/p/xbmc-main/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Azerbaijani/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Azerbaijani/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Azerbaijani/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Azerbaijani/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Azerbaijani (http://www.transifex.com/projects/p/xbmc-main/language/az/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: az\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30105" +msgid "Resolution" +msgstr "Əksetmə qabiliyyəti" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Basque/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Basque/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Basque/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Basque/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Basque (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/eu/)\n" +"Language-Team: Basque (http://www.transifex.com/projects/p/xbmc-main/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Belarusian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Belarusian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Belarusian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Belarusian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Belarusian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/be/)\n" +"Language-Team: Belarusian (http://www.transifex.com/projects/p/xbmc-main/language/be/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Bosnian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Bosnian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Bosnian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Bosnian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Bosnian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/bs/)\n" +"Language-Team: Bosnian (http://www.transifex.com/projects/p/xbmc-main/language/bs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Bulgarian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Bulgarian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Bulgarian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Bulgarian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,30 +1,61 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Bulgarian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/bg/)\n" +"Language-Team: Bulgarian (http://www.transifex.com/projects/p/xbmc-main/language/bg/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bg\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "Tvheadend hostname or IP address" +msgstr "Tvheadend хост или IP адрес" + +msgctxt "#30001" +msgid "HTTP port" +msgstr "HTTP порт" + +msgctxt "#30002" +msgid "HTSP port" +msgstr "HTSP порт" + msgctxt "#30003" msgid "Username" -msgstr "Потребител" +msgstr "Потребителско име" msgctxt "#30004" msgid "Password" msgstr "Парола" +msgctxt "#30006" +msgid "Connect timeout in seconds" +msgstr "Таймаут при свързване в секунди" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Таймаут за отговор в секунди" + +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Настройки за Tvheadend прекодиране" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Настройки за прекодиране" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Включи прекодирането" + msgctxt "#30103" msgid "Audio codec" msgstr "Аудио кодек" @@ -36,3 +67,11 @@ msgctxt "#30105" msgid "Resolution" msgstr "Резолюция" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Изключен от '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Повторно свързан с '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Burmese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Burmese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Burmese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Burmese/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Burmese (http://www.transifex.com/projects/p/xbmc-main/language/my/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30003" +msgid "Username" +msgstr "အသုံးပြုသူအမည်" + +msgctxt "#30004" +msgid "Password" +msgstr "စကားဝှက်" + +msgctxt "#30105" +msgid "Resolution" +msgstr "Resolution" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Catalan/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Catalan/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Catalan/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Catalan/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,22 +1,33 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Catalan (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ca/)\n" +"Language-Team: Catalan (http://www.transifex.com/projects/p/xbmc-main/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "Tvheadend hostname or IP address" +msgstr "Nom de màquina o IP del Tvheadend" + +msgctxt "#30001" +msgid "HTTP port" +msgstr "Port HTTP" + +msgctxt "#30002" +msgid "HTSP port" +msgstr "Port HTSP" + msgctxt "#30003" msgid "Username" msgstr "Nom d'usuari" @@ -25,6 +36,26 @@ msgid "Password" msgstr "Contrasenya" +msgctxt "#30006" +msgid "Connect timeout in seconds" +msgstr "Temps d'espera de connexió en segons" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Temps d'espera de la resposta en segons" + +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Configuració de la transcodificació del Tvheadend" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Configuració de la transcodificació" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Habilita la transcodificació" + msgctxt "#30103" msgid "Audio codec" msgstr "Còdec d'àudio" @@ -36,3 +67,11 @@ msgctxt "#30105" msgid "Resolution" msgstr "Resolució" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Desconnectat de '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Reconnectat a '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Chinese (Simple)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Chinese (Simple)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Chinese (Simple)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Chinese (Simple)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Chinese (Simple) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/zh/)\n" +"Language-Team: Chinese (Simple) (http://www.transifex.com/projects/p/xbmc-main/language/zh/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,15 +18,15 @@ msgctxt "#30000" msgid "Tvheadend hostname or IP address" -msgstr "Tvheadend主机名或IP地址" +msgstr "Tvheadend 主机名或 IP 地址" msgctxt "#30001" msgid "HTTP port" -msgstr "HTTP端口" +msgstr "HTTP 端口" msgctxt "#30002" msgid "HTSP port" -msgstr "HTSP端口" +msgstr "HTSP 端口" msgctxt "#30003" msgid "Username" @@ -47,7 +46,7 @@ msgctxt "#30100" msgid "Tvheadend transcoding settings" -msgstr "Tvheadend转码设置" +msgstr "Tvheadend 转码设置" msgctxt "#30101" msgid "Transcoding settings" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Chinese (Traditional)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Chinese (Traditional)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Chinese (Traditional)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Chinese (Traditional)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,22 +1,33 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Chinese (Traditional) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/zh_TW/)\n" +"Language-Team: Chinese (Traditional) (http://www.transifex.com/projects/p/xbmc-main/language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0;\n" +msgctxt "#30000" +msgid "Tvheadend hostname or IP address" +msgstr "Tvheadend主機名稱或IP位址" + +msgctxt "#30001" +msgid "HTTP port" +msgstr "HTTP端口" + +msgctxt "#30002" +msgid "HTSP port" +msgstr "HTSP端口" + msgctxt "#30003" msgid "Username" msgstr "帳號" @@ -25,6 +36,26 @@ msgid "Password" msgstr "密碼" +msgctxt "#30006" +msgid "Connect timeout in seconds" +msgstr "連接超時(秒)" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "回應超時(秒)" + +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Tvheadend轉碼設定" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "轉碼設定" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "啟動轉碼" + msgctxt "#30103" msgid "Audio codec" msgstr "音效編碼" @@ -36,3 +67,11 @@ msgctxt "#30105" msgid "Resolution" msgstr "解析度" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "從 '%s' 斷開連線" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "從 '%s' 重新連線" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Croatian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Croatian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Croatian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Croatian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,38 +1,77 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Croatian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/hr/)\n" +"Language-Team: Croatian (http://www.transifex.com/projects/p/xbmc-main/language/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +msgctxt "#30000" +msgid "Tvheadend hostname or IP address" +msgstr "Tvheadend naziv računala ili IP adresa" + +msgctxt "#30001" +msgid "HTTP port" +msgstr "HTTP ulaz" + +msgctxt "#30002" +msgid "HTSP port" +msgstr "HTSP ulaz" + msgctxt "#30003" msgid "Username" msgstr "Korisničko ime" msgctxt "#30004" msgid "Password" -msgstr "Zaporka" +msgstr "Lozinka" + +msgctxt "#30006" +msgid "Connect timeout in seconds" +msgstr "Istek vremena u sekundama" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Vrijeme odaziva u sekundama" + +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Tvheadend postavke predkôdiranja" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Postavke predkôdiranja" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Omogući predkôdiranje" msgctxt "#30103" msgid "Audio codec" -msgstr "Audio kodek" +msgstr "Zvučni kôdek" msgctxt "#30104" msgid "Video codec" -msgstr "Video kodek" +msgstr "Video kôdek" msgctxt "#30105" msgid "Resolution" -msgstr "Razlučljivost" +msgstr "Razlučivost" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Odspojen s '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Ponovno povezan s '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Czech/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Czech/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Czech/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Czech/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Czech (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/cs/)\n" +"Language-Team: Czech (http://www.transifex.com/projects/p/xbmc-main/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Danish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Danish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Danish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Danish/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Danish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/da/)\n" +"Language-Team: Danish (http://www.transifex.com/projects/p/xbmc-main/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -45,6 +44,18 @@ msgid "Response timeout in seconds" msgstr "Tidsfrist for svar i sekunder" +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Tvheadend indstillinger til transcoding" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Transcoding-indstillinger" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Aktiver transcoding" + msgctxt "#30103" msgid "Audio codec" msgstr "Lyd-codec" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Dutch/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Dutch/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Dutch/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Dutch/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Dutch (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/nl/)\n" +"Language-Team: Dutch (http://www.transifex.com/projects/p/xbmc-main/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -45,6 +44,18 @@ msgid "Response timeout in seconds" msgstr "Antwoord timeout in seconden" +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Tvheadend transcoderingsinstellingen" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Transcoderingsinstellingen" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Gebruik transcodering" + msgctxt "#30103" msgid "Audio codec" msgstr "Audiocodec" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/English/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/English/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/English/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/English/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: English (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/en/)\n" +"Language-Team: English (http://www.transifex.com/projects/p/xbmc-main/language/en/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/English (Australia)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/English (Australia)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/English (Australia)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/English (Australia)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (Australia) (http://www.transifex.com/projects/p/xbmc-main/language/en_AU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30003" +msgid "Username" +msgstr "Username" + +msgctxt "#30004" +msgid "Password" +msgstr "Password" + +msgctxt "#30105" +msgid "Resolution" +msgstr "Resolution" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/English (New Zealand)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/English (New Zealand)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/English (New Zealand)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/English (New Zealand)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,77 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (New Zealand) (http://www.transifex.com/projects/p/xbmc-main/language/en_NZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_NZ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Tvheadend hostname or IP address" +msgstr "Tvheadend hostname or IP address" + +msgctxt "#30001" +msgid "HTTP port" +msgstr "HTTP port" + +msgctxt "#30002" +msgid "HTSP port" +msgstr "HTSP port" + +msgctxt "#30003" +msgid "Username" +msgstr "Username" + +msgctxt "#30004" +msgid "Password" +msgstr "Password" + +msgctxt "#30006" +msgid "Connect timeout in seconds" +msgstr "Connect timeout in seconds" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Response timeout in seconds" + +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Tvheadend transcoding settings" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Transcoding settings" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Enable transcoding" + +msgctxt "#30103" +msgid "Audio codec" +msgstr "Audio codec" + +msgctxt "#30104" +msgid "Video codec" +msgstr "Video codec" + +msgctxt "#30105" +msgid "Resolution" +msgstr "Resolution" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Disconnected from '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Reconnected to '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/English (US)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/English (US)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/English (US)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/English (US)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,37 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (US) (http://www.transifex.com/projects/p/xbmc-main/language/en_US/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_US\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30003" +msgid "Username" +msgstr "Username" + +msgctxt "#30004" +msgid "Password" +msgstr "Password" + +msgctxt "#30103" +msgid "Audio codec" +msgstr "Audio codec" + +msgctxt "#30104" +msgid "Video codec" +msgstr "Video codec" + +msgctxt "#30105" +msgid "Resolution" +msgstr "Resolution" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Esperanto/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Esperanto/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Esperanto/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Esperanto/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Esperanto (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/eo/)\n" +"Language-Team: Esperanto (http://www.transifex.com/projects/p/xbmc-main/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Estonian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Estonian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Estonian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Estonian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,22 +1,33 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Estonian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/et/)\n" +"Language-Team: Estonian (http://www.transifex.com/projects/p/xbmc-main/language/et/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: et\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "Tvheadend hostname or IP address" +msgstr "Tvheadend hosti nimi või IP aadress" + +msgctxt "#30001" +msgid "HTTP port" +msgstr "HTTP port" + +msgctxt "#30002" +msgid "HTSP port" +msgstr "HTSP port" + msgctxt "#30003" msgid "Username" msgstr "Kasutajanimi" @@ -25,6 +36,26 @@ msgid "Password" msgstr "Salasõna" +msgctxt "#30006" +msgid "Connect timeout in seconds" +msgstr "Ühenduse aegumine sekundites" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Vastuse aegumine sekundites" + +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Tvheadendi transkodeerimis seaded" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Transkodeerimis seaded" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Luba transkodeerimine" + msgctxt "#30103" msgid "Audio codec" msgstr "Audio koodek" @@ -36,3 +67,11 @@ msgctxt "#30105" msgid "Resolution" msgstr "Resolutsioon" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "'%s' lahti ühendatud" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "'%s' uuesti ühendatud" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Faroese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Faroese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Faroese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Faroese/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Faroese (http://www.transifex.com/projects/p/xbmc-main/language/fo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30003" +msgid "Username" +msgstr "Brúkaranavn" + +msgctxt "#30004" +msgid "Password" +msgstr "Loyniorð" + +msgctxt "#30105" +msgid "Resolution" +msgstr "Skermstødd" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Finnish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Finnish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Finnish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Finnish/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Finnish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fi/)\n" +"Language-Team: Finnish (http://www.transifex.com/projects/p/xbmc-main/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/French/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/French/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/French/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/French/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: French (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fr/)\n" +"Language-Team: French (http://www.transifex.com/projects/p/xbmc-main/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -45,6 +44,18 @@ msgid "Response timeout in seconds" msgstr "Temporisation de réponse en secondes" +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Paramètres de transcodage pour Tvheadend" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Paramètres de transcodage" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Activer le transcodage" + msgctxt "#30103" msgid "Audio codec" msgstr "Codec audio" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/French (Canada)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/French (Canada)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/French (Canada)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/French (Canada)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,77 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: French (Canada) (http://www.transifex.com/projects/p/xbmc-main/language/fr_CA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_CA\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Tvheadend hostname or IP address" +msgstr "Nom d'hôte ou adresse IP de Tvheadend " + +msgctxt "#30001" +msgid "HTTP port" +msgstr "Port HTTP" + +msgctxt "#30002" +msgid "HTSP port" +msgstr "Port HTSP" + +msgctxt "#30003" +msgid "Username" +msgstr "Nom d'utilisateur" + +msgctxt "#30004" +msgid "Password" +msgstr "Mot de passe" + +msgctxt "#30006" +msgid "Connect timeout in seconds" +msgstr "Délai d'attente de connexion en secondes" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Délai d'attente de réponse en secondes" + +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Paramètres de transcodage de Tvheadend" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Paramètres de transcodage" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Activer le transcodage" + +msgctxt "#30103" +msgid "Audio codec" +msgstr "Codec audio" + +msgctxt "#30104" +msgid "Video codec" +msgstr "Codec vidéo" + +msgctxt "#30105" +msgid "Resolution" +msgstr "Résolution" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Se déconnecter de « %s »" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Se reconnecter à « %s »" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Galician/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Galician/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Galician/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Galician/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Galician (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/gl/)\n" +"Language-Team: Galician (http://www.transifex.com/projects/p/xbmc-main/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -45,6 +44,18 @@ msgid "Response timeout in seconds" msgstr "Tempo de espera da resposta en segundos" +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Axustes da transcodificación de Tvheadend" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Axustes da transcodificación" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Habilitar a transcodificación" + msgctxt "#30103" msgid "Audio codec" msgstr "Códec de audio" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Georgian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Georgian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Georgian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Georgian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,77 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Georgian (http://www.transifex.com/projects/p/xbmc-main/language/ka/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ka\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Tvheadend hostname or IP address" +msgstr "Tvheadend-ის სერვერის სახელი ან IP მისამართი" + +msgctxt "#30001" +msgid "HTTP port" +msgstr "HTTP პორტი" + +msgctxt "#30002" +msgid "HTSP port" +msgstr "HTSP პორტი" + +msgctxt "#30003" +msgid "Username" +msgstr "მომხმარებელი" + +msgctxt "#30004" +msgid "Password" +msgstr "პაროლი" + +msgctxt "#30006" +msgid "Connect timeout in seconds" +msgstr "შეერთების დაგვიანება წამებში" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "პასუხის დაგვიანება წამებში" + +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Tvheadend ტრანსკოდირების პარამეტრები" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "ტრანსკოდირების პარამეტრები" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "ტრანსკოდირების ჩართვა" + +msgctxt "#30103" +msgid "Audio codec" +msgstr "აუდიო კოდეკი" + +msgctxt "#30104" +msgid "Video codec" +msgstr "ვიდეო კოდეკი" + +msgctxt "#30105" +msgid "Resolution" +msgstr "გარჩევადობა" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "'%s' გამოირთო" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "'%s' ისევ შეერთდა" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/German/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/German/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/German/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/German/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: German (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/de/)\n" +"Language-Team: German (http://www.transifex.com/projects/p/xbmc-main/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,7 +18,7 @@ msgctxt "#30000" msgid "Tvheadend hostname or IP address" -msgstr "Tvheadend Hostname oder IP" +msgstr "Tvheadend Hostname oder IP-Adresse" msgctxt "#30001" msgid "HTTP port" @@ -39,11 +38,11 @@ msgctxt "#30006" msgid "Connect timeout in seconds" -msgstr "Verbindungszeit Überschreitung in Sekunden" +msgstr "Verbindungs-Timeout in Sekunden" msgctxt "#30007" msgid "Response timeout in seconds" -msgstr "Antwortzeit Überschreitung in Sekunden" +msgstr "Antwort-Timeout in Sekunden" msgctxt "#30100" msgid "Tvheadend transcoding settings" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Greek/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Greek/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Greek/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Greek/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Greek (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/el/)\n" +"Language-Team: Greek (http://www.transifex.com/projects/p/xbmc-main/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Haitian (Haitian Creole)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Haitian (Haitian Creole)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Haitian (Haitian Creole)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Haitian (Haitian Creole)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Haitian (Haitian Creole) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ht/)\n" +"Language-Team: Haitian (Haitian Creole) (http://www.transifex.com/projects/p/xbmc-main/language/ht/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Hebrew/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Hebrew/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Hebrew/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Hebrew/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hebrew (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/he/)\n" +"Language-Team: Hebrew (http://www.transifex.com/projects/p/xbmc-main/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -45,6 +44,18 @@ msgid "Response timeout in seconds" msgstr "מגבלת זמן לתגובה בשניות" +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "הגדרות Tvheadend transcoding" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "הגדרות Transcoding" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "הפעל Transcoding" + msgctxt "#30103" msgid "Audio codec" msgstr "מקודד שמע" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Hindi (Devanagiri)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Hindi (Devanagiri)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Hindi (Devanagiri)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Hindi (Devanagiri)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hindi (Devanagiri) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/hi/)\n" +"Language-Team: Hindi (Devanagiri) (http://www.transifex.com/projects/p/xbmc-main/language/hi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Hungarian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Hungarian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Hungarian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Hungarian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hungarian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/hu/)\n" +"Language-Team: Hungarian (http://www.transifex.com/projects/p/xbmc-main/language/hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Icelandic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Icelandic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Icelandic/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Icelandic/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Icelandic (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/is/)\n" +"Language-Team: Icelandic (http://www.transifex.com/projects/p/xbmc-main/language/is/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Indonesian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Indonesian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Indonesian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Indonesian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,22 +1,33 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Indonesian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/id/)\n" +"Language-Team: Indonesian (http://www.transifex.com/projects/p/xbmc-main/language/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: id\n" "Plural-Forms: nplurals=1; plural=0;\n" +msgctxt "#30000" +msgid "Tvheadend hostname or IP address" +msgstr "Hostname atau alamat IP Tvheadend" + +msgctxt "#30001" +msgid "HTTP port" +msgstr "Port HTTP" + +msgctxt "#30002" +msgid "HTSP port" +msgstr "Port HTSP" + msgctxt "#30003" msgid "Username" msgstr "NamaPengguna" @@ -25,6 +36,42 @@ msgid "Password" msgstr "Password" +msgctxt "#30006" +msgid "Connect timeout in seconds" +msgstr "Timeout Koneksi dalam detik" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Timeout response dalam deti" + +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Pengaturan transcoding Tvheadend" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Pengaturan Transcoding" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Fungsikan Transcoding" + +msgctxt "#30103" +msgid "Audio codec" +msgstr "Kodek Audio" + +msgctxt "#30104" +msgid "Video codec" +msgstr "Kodek video" + msgctxt "#30105" msgid "Resolution" msgstr "Resolusi" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Terputus dari '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Tersambung lagi pada '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Italian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Italian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Italian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Italian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Italian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/it/)\n" +"Language-Team: Italian (http://www.transifex.com/projects/p/xbmc-main/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Japanese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Japanese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Japanese/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Japanese/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Japanese (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ja/)\n" +"Language-Team: Japanese (http://www.transifex.com/projects/p/xbmc-main/language/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -45,6 +44,18 @@ msgid "Response timeout in seconds" msgstr "レスポンスのタイムアウト (秒)" +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Tvheadend のトランスコードを設定" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "トランスコード設定" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "トランスコードを有効化" + msgctxt "#30103" msgid "Audio codec" msgstr "オーディオコーデック" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Korean/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Korean/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Korean/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Korean/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Korean (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ko/)\n" +"Language-Team: Korean (http://www.transifex.com/projects/p/xbmc-main/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -45,6 +44,18 @@ msgid "Response timeout in seconds" msgstr "응답시간 제한 (초)" +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Tvheadend 트랜스코딩 설정" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "트랜스코딩 설정" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "트랜스코딩 사용" + msgctxt "#30103" msgid "Audio codec" msgstr "오디오 코덱" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Latvian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Latvian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Latvian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Latvian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,77 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Latvian (http://www.transifex.com/projects/p/xbmc-main/language/lv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Tvheadend hostname or IP address" +msgstr "Tvheadend saimniekvārds vai IP adrese" + +msgctxt "#30001" +msgid "HTTP port" +msgstr "HTTP ports" + +msgctxt "#30002" +msgid "HTSP port" +msgstr "HTSP ports" + +msgctxt "#30003" +msgid "Username" +msgstr "LIetotājvārds" + +msgctxt "#30004" +msgid "Password" +msgstr "Parole" + +msgctxt "#30006" +msgid "Connect timeout in seconds" +msgstr "Savienojuma noilgums sekundēs" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Atbildes noilgums sekundēs" + +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Tvheadend pārkodēšanas iestatījumi" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Transkodēšanas iestatījumi" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Ieslēgt transkodēšanu" + +msgctxt "#30103" +msgid "Audio codec" +msgstr "Audio kodeks" + +msgctxt "#30104" +msgid "Video codec" +msgstr "Video kodeks" + +msgctxt "#30105" +msgid "Resolution" +msgstr "Izšķirtspēja" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Atvienots no '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Atkal savienots '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Lithuanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Lithuanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Lithuanian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Lithuanian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Lithuanian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/lt/)\n" +"Language-Team: Lithuanian (http://www.transifex.com/projects/p/xbmc-main/language/lt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Macedonian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Macedonian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Macedonian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Macedonian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Macedonian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/mk/)\n" +"Language-Team: Macedonian (http://www.transifex.com/projects/p/xbmc-main/language/mk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Malay/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Malay/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Malay/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Malay/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,77 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Malay (http://www.transifex.com/projects/p/xbmc-main/language/ms/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Tvheadend hostname or IP address" +msgstr "Nama hos atau alamat IP Tvheadend" + +msgctxt "#30001" +msgid "HTTP port" +msgstr "Port HTTP" + +msgctxt "#30002" +msgid "HTSP port" +msgstr "Port HTSP" + +msgctxt "#30003" +msgid "Username" +msgstr "Nama Pengguna" + +msgctxt "#30004" +msgid "Password" +msgstr "Kata Laluan" + +msgctxt "#30006" +msgid "Connect timeout in seconds" +msgstr "Had masa tamat sambung dalam saat" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Had masa tamat respons dalam saat" + +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Tetapan transkod " + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Tetapan transkod" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Benarkan transkod" + +msgctxt "#30103" +msgid "Audio codec" +msgstr "Kodeks audio" + +msgctxt "#30104" +msgid "Video codec" +msgstr "Kodeks video" + +msgctxt "#30105" +msgid "Resolution" +msgstr "Resolusi" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Terputus dari '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Bersambung semula dengan '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Malayalam/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Malayalam/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Malayalam/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Malayalam/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Malayalam (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ml/)\n" +"Language-Team: Malayalam (http://www.transifex.com/projects/p/xbmc-main/language/ml/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Maltese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Maltese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Maltese/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Maltese/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Maltese (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/mt/)\n" +"Language-Team: Maltese (http://www.transifex.com/projects/p/xbmc-main/language/mt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Maori/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Maori/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Maori/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Maori/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,37 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Maori (http://www.transifex.com/projects/p/xbmc-main/language/mi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mi\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30003" +msgid "Username" +msgstr "Ingoa kaiwhakamahi" + +msgctxt "#30004" +msgid "Password" +msgstr "Kupuhipa" + +msgctxt "#30103" +msgid "Audio codec" +msgstr "Kōtēke Ororongo" + +msgctxt "#30104" +msgid "Video codec" +msgstr "Kōtēke Ataata" + +msgctxt "#30105" +msgid "Resolution" +msgstr "Taumira" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Norwegian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Norwegian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Norwegian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Norwegian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,22 +1,33 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Norwegian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/no/)\n" +"Language-Team: Norwegian (http://www.transifex.com/projects/p/xbmc-main/language/no/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: no\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "Tvheadend hostname or IP address" +msgstr "Tvheadend vertsnavn eller IP-adresse" + +msgctxt "#30001" +msgid "HTTP port" +msgstr "HTTP-port" + +msgctxt "#30002" +msgid "HTSP port" +msgstr "HTSP-port" + msgctxt "#30003" msgid "Username" msgstr "Brukernavn" @@ -25,6 +36,26 @@ msgid "Password" msgstr "Passord" +msgctxt "#30006" +msgid "Connect timeout in seconds" +msgstr "Tidsavbrudd ved tilkobling" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Tidsavbrudd ved venting på respons" + +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Innstillinger for Tvheadend-transkoding" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Innstillinger for transkoding" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Aktiver transkoding" + msgctxt "#30103" msgid "Audio codec" msgstr "Lydkodek" @@ -36,3 +67,11 @@ msgctxt "#30105" msgid "Resolution" msgstr "Oppløsning" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Koblet fra '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Koblet til på nytt til '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Persian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Persian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Persian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Persian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Persian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fa/)\n" +"Language-Team: Persian (http://www.transifex.com/projects/p/xbmc-main/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Persian (Iran)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Persian (Iran)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Persian (Iran)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Persian (Iran)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Persian (Iran) (http://www.transifex.com/projects/p/xbmc-main/language/fa_IR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa_IR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30003" +msgid "Username" +msgstr "نام کاربری" + +msgctxt "#30004" +msgid "Password" +msgstr "رمز عبور" + +msgctxt "#30105" +msgid "Resolution" +msgstr "رزولیشن" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Polish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Polish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Polish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Polish/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Polish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pl/)\n" +"Language-Team: Polish (http://www.transifex.com/projects/p/xbmc-main/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,7 +18,7 @@ msgctxt "#30000" msgid "Tvheadend hostname or IP address" -msgstr "Nazwa hosta lub IP Tvheadend " +msgstr "Nazwa hosta lub IP" msgctxt "#30001" msgid "HTTP port" @@ -31,7 +30,7 @@ msgctxt "#30003" msgid "Username" -msgstr "Użytkownik" +msgstr "Nazwa użytkownika" msgctxt "#30004" msgid "Password" @@ -75,4 +74,4 @@ msgctxt "#30501" msgid "Reconnected to '%s'" -msgstr "Połącz ponownie z '%s'" +msgstr "Połączono ponownie z '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Portuguese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Portuguese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Portuguese/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Portuguese/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Portuguese (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pt/)\n" +"Language-Team: Portuguese (http://www.transifex.com/projects/p/xbmc-main/language/pt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -45,6 +44,18 @@ msgid "Response timeout in seconds" msgstr "Tempo limite para resposta em segundos" +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Definições de transcodificação Tvheadend" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Definições de transcodificação" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Activar transcodificação" + msgctxt "#30103" msgid "Audio codec" msgstr "Codec de áudio" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Portuguese (Brazil)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Portuguese (Brazil)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Portuguese (Brazil)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Portuguese (Brazil)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pt_BR/)\n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/xbmc-main/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Romanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Romanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Romanian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Romanian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Romanian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ro/)\n" +"Language-Team: Romanian (http://www.transifex.com/projects/p/xbmc-main/language/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -45,6 +44,18 @@ msgid "Response timeout in seconds" msgstr "Așteptare răspuns în secunde" +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Setări transcodare Tvheadend" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Setări transcodare" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Activare transcodare" + msgctxt "#30103" msgid "Audio codec" msgstr "Codec audio" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Russian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Russian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Russian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Russian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Russian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ru/)\n" +"Language-Team: Russian (http://www.transifex.com/projects/p/xbmc-main/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -45,6 +44,18 @@ msgid "Response timeout in seconds" msgstr "Ожидание ответа (сек.)" +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Настройки транскодинга Tvheadend" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Настройки транскодирования" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Включить транскодинг" + msgctxt "#30103" msgid "Audio codec" msgstr "Кодек аудио" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Serbian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Serbian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Serbian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Serbian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Serbian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sr/)\n" +"Language-Team: Serbian (http://www.transifex.com/projects/p/xbmc-main/language/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Serbian (Cyrillic)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Serbian (Cyrillic)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Serbian (Cyrillic)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Serbian (Cyrillic)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Serbian (Cyrillic) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sr_RS/)\n" +"Language-Team: Serbian (Cyrillic) (http://www.transifex.com/projects/p/xbmc-main/language/sr_RS/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Slovak/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Slovak/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Slovak/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Slovak/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Slovak (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sk/)\n" +"Language-Team: Slovak (http://www.transifex.com/projects/p/xbmc-main/language/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Slovenian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Slovenian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Slovenian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Slovenian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Slovenian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sl/)\n" +"Language-Team: Slovenian (http://www.transifex.com/projects/p/xbmc-main/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -39,11 +38,23 @@ msgctxt "#30006" msgid "Connect timeout in seconds" -msgstr "Najdaljši čas povezave v sekundah" +msgstr "Časovni pretek povezave v sekundah" msgctxt "#30007" msgid "Response timeout in seconds" -msgstr "Najdaljši čas odgovora v sekundah" +msgstr "Časovni pretek odgovora v sekundah" + +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Nastavitve pretvarjanja za Tvheadend" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Nastavitve pretvarjanja" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Vključi pretvarjanje" msgctxt "#30103" msgid "Audio codec" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Spanish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Spanish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Spanish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Spanish/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es/)\n" +"Language-Team: Spanish (http://www.transifex.com/projects/p/xbmc-main/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Spanish (Argentina)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Spanish (Argentina)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Spanish (Argentina)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Spanish (Argentina)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es_AR/)\n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/xbmc-main/language/es_AR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Spanish (Mexico)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Spanish (Mexico)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Spanish (Mexico)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Spanish (Mexico)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es_MX/)\n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/xbmc-main/language/es_MX/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Spanish (Venezuela)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Spanish (Venezuela)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Spanish (Venezuela)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Spanish (Venezuela)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Spanish (Venezuela) (http://www.transifex.com/projects/p/xbmc-main/language/es_VE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_VE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30105" +msgid "Resolution" +msgstr "Resolución" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Swedish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Swedish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Swedish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Swedish/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Swedish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sv/)\n" +"Language-Team: Swedish (http://www.transifex.com/projects/p/xbmc-main/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Tajik/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Tajik/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Tajik/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Tajik/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,77 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Tajik (http://www.transifex.com/projects/p/xbmc-main/language/tg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Tvheadend hostname or IP address" +msgstr "Суроғаи IP ва номи мизбони Tvheadend" + +msgctxt "#30001" +msgid "HTTP port" +msgstr "Порти HTTP" + +msgctxt "#30002" +msgid "HTSP port" +msgstr "Порти HTSP" + +msgctxt "#30003" +msgid "Username" +msgstr "Номи корбар" + +msgctxt "#30004" +msgid "Password" +msgstr "Парол" + +msgctxt "#30006" +msgid "Connect timeout in seconds" +msgstr "Хотимаи вақти пайваст дар сонияҳо" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Хотимаи вақти посух дар сонияҳо" + +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Танзимоти рамзгузории Tvheadend" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Танзимоти рамзгузорӣ" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Фаъол кардани рамзгузорӣ" + +msgctxt "#30103" +msgid "Audio codec" +msgstr "Кодеки аудио" + +msgctxt "#30104" +msgid "Video codec" +msgstr "Кодеки видео" + +msgctxt "#30105" +msgid "Resolution" +msgstr "Возеҳӣ" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Пайваст бо '%s' қатъ шудааст" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Пайваст бо '%s' барқарор шудааст" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Tamil (India)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Tamil (India)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Tamil (India)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Tamil (India)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,77 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Tamil (India) (http://www.transifex.com/projects/p/xbmc-main/language/ta_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Tvheadend hostname or IP address" +msgstr "Tvheadend பின்தள புரவலன் பெயர் அல்லது ஐபி" + +msgctxt "#30001" +msgid "HTTP port" +msgstr "HTTP துறை" + +msgctxt "#30002" +msgid "HTSP port" +msgstr "HTSP துறை" + +msgctxt "#30003" +msgid "Username" +msgstr "பயனர்பெயர்" + +msgctxt "#30004" +msgid "Password" +msgstr "அடையாளச் சொல்" + +msgctxt "#30006" +msgid "Connect timeout in seconds" +msgstr "எத்தனை நொடியில் இணைப்பை முடித்தல்" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "எத்தனை நொடியில் பதில் எதிபார்ப்பை முடித்தல்" + +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Tvheadend டிரான்ஸ்கோடிங்கு அமைப்புகள்" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "டிரான்ஸ்கோடிங்கு அமைப்புகள்" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "டிரான்ஸ்கோடிங்கு செயல்படுத்து" + +msgctxt "#30103" +msgid "Audio codec" +msgstr "கேட்பொலி கோடெக் குறியாக்கி / விலக்கி" + +msgctxt "#30104" +msgid "Video codec" +msgstr "நிகழ்பட கோடெக் குறியாக்கி / விலக்கி" + +msgctxt "#30105" +msgid "Resolution" +msgstr "திரைத்திறன்" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "'%s' இருந்து துண்டிக்கப்பட்டது" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "'%s' க்கு மறுஇணைப்பு" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Telugu/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Telugu/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Telugu/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Telugu/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Telugu (http://www.transifex.com/projects/p/xbmc-main/language/te/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: te\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30003" +msgid "Username" +msgstr "వాడుకరి పేరు" + +msgctxt "#30004" +msgid "Password" +msgstr "సంకేతపదం" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Thai/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Thai/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Thai/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Thai/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Thai (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/th/)\n" +"Language-Team: Thai (http://www.transifex.com/projects/p/xbmc-main/language/th/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Turkish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Turkish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Turkish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Turkish/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,22 +1,33 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Turkish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/tr/)\n" +"Language-Team: Turkish (http://www.transifex.com/projects/p/xbmc-main/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=1; plural=0;\n" +msgctxt "#30000" +msgid "Tvheadend hostname or IP address" +msgstr "Tvheadend ana bilgisayar adı veya IP adresi" + +msgctxt "#30001" +msgid "HTTP port" +msgstr "HTTP portu" + +msgctxt "#30002" +msgid "HTSP port" +msgstr "HTSP portu" + msgctxt "#30003" msgid "Username" msgstr "Kullanıcı adı" @@ -25,6 +36,26 @@ msgid "Password" msgstr "Parola" +msgctxt "#30006" +msgid "Connect timeout in seconds" +msgstr "Saniye cinsinden bağlantı zaman aşımı" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Saniye cinsinden yanıt zaman aşımı süresi" + +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Tvheadend dönüştürme ayarları" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Dönüştürme ayarları" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Dönüştürmeyi etkinleştir" + msgctxt "#30103" msgid "Audio codec" msgstr "Ses codec" @@ -36,3 +67,11 @@ msgctxt "#30105" msgid "Resolution" msgstr "Çözünürlük" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "'%s' Bağlantı kesilecek" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Tekrar bağlanmaya '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Ukrainian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Ukrainian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Ukrainian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Ukrainian/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -1,22 +1,33 @@ # XBMC Media Center language file # Addon Name: Tvheadend HTSP Client # Addon id: pvr.hts -# Addon version: 1.6.11 # Addon Provider: Lars Op den Kamp, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Ukrainian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/uk/)\n" +"Language-Team: Ukrainian (http://www.transifex.com/projects/p/xbmc-main/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +msgctxt "#30000" +msgid "Tvheadend hostname or IP address" +msgstr "Назва сервера Tvheadend або його IP адреса" + +msgctxt "#30001" +msgid "HTTP port" +msgstr "Порт HTTP" + +msgctxt "#30002" +msgid "HTSP port" +msgstr "Порт HTSP" + msgctxt "#30003" msgid "Username" msgstr "Ім'я користувача" @@ -25,6 +36,26 @@ msgid "Password" msgstr "Пароль" +msgctxt "#30006" +msgid "Connect timeout in seconds" +msgstr "Перерва у зв’язку в секундах" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Затримка відклику в секундах" + +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Налаштування конвертування з Tvheadend" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Налаштування конвертування" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Включити конвертування" + msgctxt "#30103" msgid "Audio codec" msgstr "Кодування аудіо" @@ -36,3 +67,11 @@ msgctxt "#30105" msgid "Resolution" msgstr "Роздільна здатність" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Від’єднано від '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Знову з’єднано з '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Uzbek/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Uzbek/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Uzbek/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Uzbek/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Uzbek (http://www.transifex.com/projects/p/xbmc-main/language/uz/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uz\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30003" +msgid "Username" +msgstr "Foydalanuvchi nomi" + +msgctxt "#30004" +msgid "Password" +msgstr "Maxfiy so'z" + +msgctxt "#30105" +msgid "Resolution" +msgstr "Ekran o'lchamlari" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Vietnamese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Vietnamese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Vietnamese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Vietnamese/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,77 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Vietnamese (http://www.transifex.com/projects/p/xbmc-main/language/vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Tvheadend hostname or IP address" +msgstr "Tên miền hoặc địa chỉ IP của Tvheadend" + +msgctxt "#30001" +msgid "HTTP port" +msgstr "Cổng HTTP" + +msgctxt "#30002" +msgid "HTSP port" +msgstr "Cổng HTSP" + +msgctxt "#30003" +msgid "Username" +msgstr "Tên truy cập" + +msgctxt "#30004" +msgid "Password" +msgstr "Mật khẩu" + +msgctxt "#30006" +msgid "Connect timeout in seconds" +msgstr "Số giây tự ngắt kết nối" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Số giây tự ngắt chờ" + +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Thiết lập bộ chuyển mã của Tvheadend" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Thiết lập bộ chuyển mã" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Sử dụng bộ chuyển mã" + +msgctxt "#30103" +msgid "Audio codec" +msgstr "Bộ giải mã Audio" + +msgctxt "#30104" +msgid "Video codec" +msgstr "Bộ giải mã Video" + +msgctxt "#30105" +msgid "Resolution" +msgstr "Độ phân giải" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Đã ngắt kết nối từ '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Đã kết nối lại tới '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Vietnamese (Viet Nam)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Vietnamese (Viet Nam)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Vietnamese (Viet Nam)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Vietnamese (Viet Nam)/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/projects/p/xbmc-main/language/vi_VN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi_VN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30004" +msgid "Password" +msgstr "Mật khẩu" + +msgctxt "#30105" +msgid "Resolution" +msgstr "Độ phân giải" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Welsh/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Welsh/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/language/Welsh/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/language/Welsh/strings.po 2014-05-04 06:40:42.000000000 +0000 @@ -0,0 +1,77 @@ +# XBMC Media Center language file +# Addon Name: Tvheadend HTSP Client +# Addon id: pvr.hts +# Addon Provider: Lars Op den Kamp, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Welsh (http://www.transifex.com/projects/p/xbmc-main/language/cy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" + +msgctxt "#30000" +msgid "Tvheadend hostname or IP address" +msgstr "Enw gwesteiwr neu gyfeiriad IP Tvheadend" + +msgctxt "#30001" +msgid "HTTP port" +msgstr "Porth HTTP" + +msgctxt "#30002" +msgid "HTSP port" +msgstr "Porth HTSP" + +msgctxt "#30003" +msgid "Username" +msgstr "Enw defnyddiwr" + +msgctxt "#30004" +msgid "Password" +msgstr "Cyfrinair" + +msgctxt "#30006" +msgid "Connect timeout in seconds" +msgstr "Amser allan cysylltu mewn eiliadau" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Ymateb amser allan mewn eiliadau" + +msgctxt "#30100" +msgid "Tvheadend transcoding settings" +msgstr "Gosodiadau trawscodio Tvheadend" + +msgctxt "#30101" +msgid "Transcoding settings" +msgstr "Gosodiadau trawscodio" + +msgctxt "#30102" +msgid "Enable transcoding" +msgstr "Galluogi trawscodio" + +msgctxt "#30103" +msgid "Audio codec" +msgstr "Codec sain" + +msgctxt "#30104" +msgid "Video codec" +msgstr "Codec fideo" + +msgctxt "#30105" +msgid "Resolution" +msgstr "Cydraniad" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Datgysylltwyd o '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Ail gysylltwyd â '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/settings.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/settings.xml --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/addon/resources/settings.xml 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/addon/resources/settings.xml 2014-01-04 10:28:12.000000000 +0000 @@ -9,7 +9,7 @@ - - + + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/Makefile.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/Makefile.am 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/Makefile.am 2014-01-04 10:28:12.000000000 +0000 @@ -10,7 +10,7 @@ LIBNAME = libtvheadend-addon lib_LTLIBRARIES = libtvheadend-addon.la -LIBS = @abs_top_builddir@/lib/libhts/libhts.la -ldl +LIBS = @abs_top_srcdir@/lib/libhts/libhts.la -ldl include ../Makefile.include.am diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/project/VS2010Express/pvrclient_tvheadend.vcxproj xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/project/VS2010Express/pvrclient_tvheadend.vcxproj --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/project/VS2010Express/pvrclient_tvheadend.vcxproj 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/project/VS2010Express/pvrclient_tvheadend.vcxproj 2014-01-04 10:28:12.000000000 +0000 @@ -50,7 +50,7 @@ Level3 Disabled ..\..\..\..\xbmc;..\..\..\..\lib;..\..\..\..\lib\platform\windows;..\..\..\..\lib\libhts\Win32\include - _WINDLL;_CRT_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;_WINSOCKAPI_;USE_DEMUX;%(PreprocessorDefinitions) + _WINDLL;TARGET_WINDOWS;_CRT_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;_WINSOCKAPI_;USE_DEMUX;%(PreprocessorDefinitions) MultiThreadedDebug
@@ -65,7 +65,7 @@ true true ..\..\..\..\xbmc;..\..\..\..\lib;..\..\..\..\lib\platform\windows - _WINDLL;_CRT_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;_WINSOCKAPI_;USE_DEMUX;%(PreprocessorDefinitions) + _WINDLL;TARGET_WINDOWS;_CRT_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;_WINSOCKAPI_;USE_DEMUX;%(PreprocessorDefinitions) MultiThreaded
diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/src/client.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/src/client.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/src/client.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/src/client.cpp 2014-03-04 10:06:13.000000000 +0000 @@ -41,21 +41,22 @@ * Default values are defined inside client.h * and exported to the other source files. */ -std::string g_strHostname = DEFAULT_HOST; -int g_iPortHTSP = DEFAULT_HTSP_PORT; -int g_iPortHTTP = DEFAULT_HTTP_PORT; -int g_iConnectTimeout = DEFAULT_CONNECT_TIMEOUT; -int g_iResponseTimeout = DEFAULT_RESPONSE_TIMEOUT; -bool g_bTranscode = DEFAULT_TRANSCODE; -CodecID g_iAudioCodec = DEFAULT_AUDIO_CODEC; -CodecID g_iVideoCodec = DEFAULT_VIDEO_CODEC; -int g_iResolution = DEFAULT_RESOLUTION; -std::string g_strUsername = ""; -std::string g_strPassword = ""; -std::string g_strUserPath = ""; -std::string g_strClientPath = ""; +std::string g_strHostname = DEFAULT_HOST; +int g_iPortHTSP = DEFAULT_HTSP_PORT; +int g_iPortHTTP = DEFAULT_HTTP_PORT; +int g_iConnectTimeout = DEFAULT_CONNECT_TIMEOUT; +int g_iResponseTimeout = DEFAULT_RESPONSE_TIMEOUT; +bool g_bTranscode = DEFAULT_TRANSCODE; +CodecDescriptor g_audioCodec; +CodecDescriptor g_videoCodec; +int g_iResolution = DEFAULT_RESOLUTION; +std::string g_strUsername = ""; +std::string g_strPassword = ""; +std::string g_strUserPath = ""; +std::string g_strClientPath = ""; CHelper_libXBMC_addon *XBMC = NULL; +CHelper_libXBMC_codec *CODEC = NULL; CHelper_libXBMC_pvr *PVR = NULL; CHelper_libXBMC_gui *GUI = NULL; PVR_MENUHOOK *menuHook = NULL; @@ -106,8 +107,6 @@ else g_strPassword = ""; - free (buffer); - /* read setting "htsp_port" from settings.xml */ if (!XBMC->GetSetting("htsp_port", &g_iPortHTSP)) g_iPortHTSP = DEFAULT_HTSP_PORT; @@ -128,17 +127,23 @@ if (!XBMC->GetSetting("transcode", &g_bTranscode)) g_bTranscode = DEFAULT_TRANSCODE; - /* read setting "audio_codec" from settings.xml */ - if (!XBMC->GetSetting("audio_codec", &g_iAudioCodec)) - g_iAudioCodec = DEFAULT_AUDIO_CODEC; - - /* read setting "video_codec" from settings.xml */ - if (!XBMC->GetSetting("video_codec", &g_iVideoCodec)) - g_iVideoCodec = DEFAULT_VIDEO_CODEC; + /* read setting "audio_codec_name" from settings.xml */ + if (XBMC->GetSetting("audio_codec_name", buffer)) + g_audioCodec = CodecDescriptor::GetCodecByName(buffer); + else + g_audioCodec = CodecDescriptor::GetCodecByName(DEFAULT_AUDIO_CODEC); + + /* read setting "video_codec_name" from settings.xml */ + if (XBMC->GetSetting("video_codec_name", buffer)) + g_videoCodec = CodecDescriptor::GetCodecByName(buffer); + else + g_videoCodec = CodecDescriptor::GetCodecByName(DEFAULT_VIDEO_CODEC); /* read setting "resolution" from settings.xml */ if (!XBMC->GetSetting("resolution", &g_iResolution)) g_iResolution = DEFAULT_RESOLUTION; + + free(buffer); } ADDON_STATUS ADDON_Create(void* hdl, void* props) @@ -163,10 +168,20 @@ return ADDON_STATUS_PERMANENT_FAILURE; } + CODEC = new CHelper_libXBMC_codec; + if (!CODEC->RegisterMe(hdl)) + { + SAFE_DELETE(CODEC); + SAFE_DELETE(GUI); + SAFE_DELETE(XBMC); + return ADDON_STATUS_PERMANENT_FAILURE; + } + PVR = new CHelper_libXBMC_pvr; if (!PVR->RegisterMe(hdl)) { SAFE_DELETE(PVR); + SAFE_DELETE(CODEC); SAFE_DELETE(GUI); SAFE_DELETE(XBMC); return ADDON_STATUS_PERMANENT_FAILURE; @@ -184,6 +199,7 @@ if (!HTSPData->Open()) { SAFE_DELETE(HTSPData); + SAFE_DELETE(CODEC); SAFE_DELETE(PVR); SAFE_DELETE(GUI); SAFE_DELETE(XBMC); @@ -218,6 +234,7 @@ { m_bCreated = false; SAFE_DELETE(HTSPData); + SAFE_DELETE(CODEC); SAFE_DELETE(PVR); SAFE_DELETE(GUI); SAFE_DELETE(XBMC); @@ -322,23 +339,23 @@ return ADDON_STATUS_OK; } } - else if (str == "video_codec") + else if (str == "video_codec_name") { - int iNewValue = *(int*) settingValue + 1; - if (g_iVideoCodec != iNewValue) + string tmp_strCodecname = g_videoCodec.Name(); + if (tmp_strCodecname != (const char*) settingValue) { - XBMC->Log(LOG_INFO, "%s - Changed Setting 'video_codec' from %u to %u", __FUNCTION__, g_iVideoCodec, iNewValue); - g_iVideoCodec = (CodecID)iNewValue; + XBMC->Log(LOG_INFO, "%s - Changed Setting 'video_codec' from %s to %s", __FUNCTION__, tmp_strCodecname.c_str(), (const char*) settingValue); + g_videoCodec = CodecDescriptor::GetCodecByName((const char*) settingValue); return ADDON_STATUS_OK; } } - else if (str == "audio_codec") + else if (str == "audio_codec_name") { - int iNewValue = *(int*) settingValue + 1; - if (g_iAudioCodec != iNewValue) + string tmp_strCodecname = g_audioCodec.Name(); + if (tmp_strCodecname != (const char*) settingValue) { - XBMC->Log(LOG_INFO, "%s - Changed Setting 'audio_codec' from %u to %u", __FUNCTION__, g_iAudioCodec, iNewValue); - g_iAudioCodec = (CodecID)iNewValue; + XBMC->Log(LOG_INFO, "%s - Changed Setting 'audio_codec' from %s to %s", __FUNCTION__, tmp_strCodecname.c_str(), (const char*) settingValue); + g_audioCodec = CodecDescriptor::GetCodecByName((const char*) settingValue); return ADDON_STATUS_OK; } } @@ -354,6 +371,10 @@ { } +void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ +} + /*********************************************************** * PVR Client AddOn specific public library functions ***********************************************************/ @@ -370,6 +391,18 @@ return strMinApiVersion; } +const char* GetGUIAPIVersion(void) +{ + static const char *strGuiApiVersion = XBMC_GUI_API_VERSION; + return strGuiApiVersion; +} + +const char* GetMininumGUIAPIVersion(void) +{ + static const char *strMinGuiApiVersion = XBMC_GUI_MIN_API_VERSION; + return strMinGuiApiVersion; +} + PVR_ERROR GetAddonCapabilities(PVR_ADDON_CAPABILITIES* pCapabilities) { pCapabilities->bSupportsEPG = true; @@ -381,6 +414,7 @@ pCapabilities->bHandlesInputStream = true; pCapabilities->bHandlesDemuxing = true; pCapabilities->bSupportsRecordingFolders = true; + pCapabilities->bSupportsRecordingEdl = true; return PVR_ERROR_NO_ERROR; } @@ -603,7 +637,7 @@ return HTSPData->GetChannelGroupMembers(handle, group); } -PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook) +PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_MENUHOOK_DATA &item) { if (!HTSPData || !HTSPData->IsConnected()) return PVR_ERROR_SERVER_ERROR; @@ -694,6 +728,14 @@ HTSPData->DemuxFlush(); } +PVR_ERROR GetRecordingEdl(const PVR_RECORDING &recording, PVR_EDL_ENTRY entries[], int *size) +{ + if (!HTSPData || !HTSPData->IsConnected()) + return PVR_ERROR_SERVER_ERROR; + + return HTSPData->GetEdl(recording, &*entries, size); +} + /** UNUSED API FUNCTIONS */ PVR_ERROR DialogChannelScan(void) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR DeleteChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } @@ -712,5 +754,7 @@ int GetRecordingLastPlayedPosition(const PVR_RECORDING &recording) { return -1; } unsigned int GetChannelSwitchDelay(void) { return 0; } void PauseStream(bool bPaused) {} - +time_t GetPlayingTime() { return 0; } +time_t GetBufferTimeStart() { return 0; } +time_t GetBufferTimeEnd() { return 0; } } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/src/client.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/src/client.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/src/client.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/src/client.h 2014-01-04 10:28:12.000000000 +0000 @@ -22,17 +22,24 @@ #include "platform/os.h" #include "libXBMC_addon.h" +#include "libXBMC_codec.h" #include "libXBMC_pvr.h" #include "libXBMC_gui.h" -#include "avcodec.h" + +extern ADDON::CHelper_libXBMC_addon* XBMC; +extern CHelper_libXBMC_codec* CODEC; +extern CHelper_libXBMC_pvr* PVR; +extern CHelper_libXBMC_gui* GUI; + +#include "HTSPTypes.h" #define DEFAULT_HOST "127.0.0.1" #define DEFAULT_HTTP_PORT 9981 #define DEFAULT_HTSP_PORT 9982 #define DEFAULT_CONNECT_TIMEOUT 6 #define DEFAULT_RESPONSE_TIMEOUT 4 -#define DEFAULT_VIDEO_CODEC CODEC_ID_H264 -#define DEFAULT_AUDIO_CODEC CODEC_ID_NONE +#define DEFAULT_VIDEO_CODEC "H264" +#define DEFAULT_AUDIO_CODEC "UNKNOWN" #define DEFAULT_RESOLUTION 480 #define DEFAULT_TRANSCODE false #define HTSP_DEBUGGING 0 @@ -49,12 +56,8 @@ extern std::string g_szUserPath; extern std::string g_szClientPath; extern bool g_bTranscode; -extern CodecID g_iAudioCodec; -extern CodecID g_iVideoCodec; +extern CodecDescriptor g_audioCodec; +extern CodecDescriptor g_videoCodec; extern int g_iResolution; -extern ADDON::CHelper_libXBMC_addon * XBMC; -extern CHelper_libXBMC_pvr * PVR; -extern CHelper_libXBMC_gui * GUI; - uint32_t HTSPNextSequenceNumber(void); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/src/GUIDialogTranscode.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/src/GUIDialogTranscode.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/src/GUIDialogTranscode.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/src/GUIDialogTranscode.cpp 2014-03-04 10:06:13.000000000 +0000 @@ -103,47 +103,23 @@ m_spinVideoCodec->Clear(); m_spinResolution->Clear(); - m_spinAudioCodec->AddLabel("Passthrough", CODEC_ID_NONE); - m_spinVideoCodec->AddLabel("Passthrough", CODEC_ID_NONE); + m_spinAudioCodec->AddLabel("Passthrough", XBMC_INVALID_CODEC_ID); + m_spinVideoCodec->AddLabel("Passthrough", XBMC_INVALID_CODEC_ID); - for (CodecVector::iterator it = m_codecs.begin(); it != m_codecs.end(); ++it) + int iSelectedAudio(0), iSelectedVideo(0); + for (unsigned int iPtr = 0; iPtr < m_codecs.size(); iPtr++) { - switch (*it) + if (m_codecs.at(iPtr).Codec().codec_type == XBMC_CODEC_TYPE_AUDIO) { - case CODEC_ID_MP2: - m_spinAudioCodec->AddLabel("MPEG-2 Audio", CODEC_ID_MP2); - break; - - case CODEC_ID_AAC: - m_spinAudioCodec->AddLabel("AAC", CODEC_ID_AAC); - break; - - case CODEC_ID_AC3: - m_spinAudioCodec->AddLabel("AC3", CODEC_ID_AC3); - break; - - case CODEC_ID_VORBIS: - m_spinAudioCodec->AddLabel("Vorbis", CODEC_ID_VORBIS); - break; - - case CODEC_ID_MPEG2VIDEO: - m_spinVideoCodec->AddLabel("MPEG-2 Video", CODEC_ID_MPEG2VIDEO); - break; - - case CODEC_ID_MPEG4: - m_spinVideoCodec->AddLabel("MPEG-4", CODEC_ID_MPEG4); - break; - - case CODEC_ID_VP8: - m_spinVideoCodec->AddLabel("VP8", CODEC_ID_VP8); - break; - - case CODEC_ID_H264: - m_spinVideoCodec->AddLabel("H264", CODEC_ID_H264); - break; - - default: - break; + m_spinAudioCodec->AddLabel(m_codecs.at(iPtr).Name().c_str(), iPtr); + if (m_codecs.at(iPtr).Codec().codec_id == g_audioCodec.Codec().codec_id) + iSelectedAudio = iPtr; + } + else if (m_codecs.at(iPtr).Codec().codec_type == XBMC_CODEC_TYPE_VIDEO) + { + m_spinVideoCodec->AddLabel(m_codecs.at(iPtr).Name().c_str(), iPtr); + if (m_codecs.at(iPtr).Codec().codec_id == g_videoCodec.Codec().codec_id) + iSelectedVideo = iPtr; } } @@ -168,8 +144,8 @@ m_spinResolution->SetValue(720); m_radioTranscode->SetSelected(g_bTranscode); - m_spinAudioCodec->SetValue(g_iAudioCodec); - m_spinVideoCodec->SetValue(g_iVideoCodec); + m_spinAudioCodec->SetValue(iSelectedAudio); + m_spinVideoCodec->SetValue(iSelectedVideo); return true; } @@ -189,8 +165,8 @@ { g_bTranscode = m_radioTranscode->IsSelected(); g_iResolution = m_spinResolution->GetValue(); - g_iAudioCodec = (CodecID) m_spinAudioCodec->GetValue(); - g_iVideoCodec = (CodecID) m_spinVideoCodec->GetValue(); + g_audioCodec = m_codecs.at(m_spinAudioCodec->GetValue()); + g_videoCodec = m_codecs.at(m_spinVideoCodec->GetValue()); m_window->Close(); @@ -215,6 +191,6 @@ || actionId == ADDON_ACTION_PREVIOUS_MENU) return OnClick(BUTTON_CANCEL); else - return true; + return false; } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/src/HTSPConnection.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/src/HTSPConnection.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/src/HTSPConnection.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/src/HTSPConnection.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -269,6 +269,8 @@ { void* buf; uint32_t l; + uint8_t lb[4]; + size_t bytes_read; // get the first queued message if any if(m_queue.size()) @@ -288,19 +290,28 @@ } // read the size - if (m_socket->Read(&l, 4, iInitialTimeout) != 4) + if ((bytes_read = m_socket->Read(&lb, 4, iInitialTimeout)) != 4) { // timed out if(m_socket->GetErrorNumber() == ETIMEDOUT) - return NULL; + { + // we did read something. try to finish the read + if (bytes_read > 0) + bytes_read += m_socket->Read(&lb + bytes_read, 4 - bytes_read, iDatapacketTimeout); + else + return NULL; + } // read error, close the connection - XBMC->Log(LOG_ERROR, "%s - failed to read packet size (%s)", __FUNCTION__, m_socket->GetError().c_str()); - TriggerReconnect(); - return NULL; + if (bytes_read != 4) + { + XBMC->Log(LOG_ERROR, "%s - failed to read packet size (%s)", __FUNCTION__, m_socket->GetError().c_str()); + TriggerReconnect(); + return NULL; + } } - l = ntohl(l); + l = (lb[0] << 24) + (lb[1] << 16) + (lb[2] << 8) + lb[3]; // empty message if(l == 0) @@ -629,7 +640,7 @@ { { CLockObject lock(m_mutex); - msg = ReadMessage(5); + msg = ReadMessage(5, g_iResponseTimeout * 1000); } if(msg == NULL || msg->hm_data == NULL) { diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/src/HTSPData.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/src/HTSPData.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/src/HTSPData.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/src/HTSPData.cpp 2014-05-04 06:40:43.000000000 +0000 @@ -37,6 +37,14 @@ DVR_PRIO_UNIMPORTANT, } dvr_prio_t; +typedef enum { + DVR_ACTION_TYPE_CUT, + DVR_ACTION_TYPE_MUTE, + DVR_ACTION_TYPE_SCENE, + DVR_ACTION_TYPE_COMBREAK, + +} dvr_action_type_t; + using namespace std; using namespace ADDON; using namespace PLATFORM; @@ -187,29 +195,9 @@ if (f->hmf_type != HMF_STR) continue; - if (!strcmp("AAC", f->hmf_str)) - v.push_back(CODEC_ID_AAC); - - else if (!strcmp("MPEG2AUDIO", f->hmf_str)) - v.push_back(CODEC_ID_MP2); - - else if (!strcmp("AC3", f->hmf_str)) - v.push_back(CODEC_ID_AC3); - - else if (!strcmp("VORBIS", f->hmf_str)) - v.push_back(CODEC_ID_VORBIS); - - else if (!strcmp("MPEG2VIDEO", f->hmf_str)) - v.push_back(CODEC_ID_MPEG2VIDEO); - - else if (!strcmp("H264", f->hmf_str)) - v.push_back(CODEC_ID_H264); - - else if (!strcmp("VP8", f->hmf_str)) - v.push_back(CODEC_ID_VP8); - - else if (!strcmp("MPEG4VIDEO", f->hmf_str)) - v.push_back(CODEC_ID_MPEG4); + CodecDescriptor codec = CodecDescriptor::GetCodecByName(f->hmf_str); + if (codec.Codec().codec_type != XBMC_CODEC_TYPE_UNKNOWN) + v.push_back(codec); } return v; @@ -310,13 +298,19 @@ CStdString strRecordingId; CStdString strDirectory = "/"; std::string strChannelName = ""; + std::string strIconPath = ""; /* lock */ { CLockObject lock(m_mutex); + + /* determine channel name and icon */ SChannels::const_iterator itr = m_channels.find(recording.channel); if (itr != m_channels.end()) - strChannelName = itr->second.name.c_str(); + { + strChannelName = itr->second.name; + strIconPath = itr->second.icon; + } /* HTSPv7+ - use HTSP */ if (GetProtocol() >= 7) @@ -331,7 +325,7 @@ if (recording.path != "") { - size_t i, idx = recording.path.rfind("/"); + size_t idx = recording.path.rfind("/"); if (idx == 0 || idx == std::string::npos) { strDirectory = "/"; } else { @@ -350,6 +344,7 @@ strncpy(tag.strDirectory, strDirectory.c_str(), sizeof(tag.strDirectory) - 1); strncpy(tag.strPlot, recording.description.c_str(), sizeof(tag.strPlot) - 1); strncpy(tag.strChannelName, strChannelName.c_str(), sizeof(tag.strChannelName) - 1); + strncpy(tag.strIconPath, strIconPath.c_str(), sizeof(tag.strIconPath) - 1); tag.recordingTime = recording.start; tag.iDuration = recording.stop - recording.start; @@ -1447,3 +1442,89 @@ if (m_demux && CanTimeshift()) m_demux->SetSpeed(speed); } + +PVR_ERROR CHTSPData::GetEdl(const PVR_RECORDING &recording, PVR_EDL_ENTRY entries[], int *size) +{ + if (GetProtocol() < 12) return PVR_ERROR_NOT_IMPLEMENTED; + + XBMC->Log(LOG_DEBUG, "%s - dvrEntryId:%s", __FUNCTION__, recording.strRecordingId); + + htsmsg_t *msg = htsmsg_create_map(); + htsmsg_add_str(msg, "method", "getDvrCutpoints"); + htsmsg_add_u32(msg, "id", atoi(recording.strRecordingId)); + + CHTSResult result; + ReadResult(msg, result); + if (result.status != PVR_ERROR_NO_ERROR) + { + XBMC->Log(LOG_ERROR, "%s - Failed to get EDL data.", __FUNCTION__); + return result.status; + } + + htsmsg_t *edlList = htsmsg_get_list(result.message, "cutpoints"); + if(!edlList) + { + XBMC->Log(LOG_DEBUG, "%s - No EDL list found.", __FUNCTION__); + *size = 0; + return PVR_ERROR_NO_ERROR; + } + + htsmsg_field_t *field; + int index = 0; + HTSMSG_FOREACH(field, edlList) + { + if(field->hmf_type != HMF_MAP) + continue; + + if(index < *size) + { + htsmsg_t *edl = &field->hmf_msg; + + // start and end are in milliseconds + unsigned int start, end, type; + + if (htsmsg_get_u32(edl, "start", &start) != 0 || + htsmsg_get_u32(edl, "end", &end) != 0 || + htsmsg_get_u32(edl, "type", &type) != 0) + { + continue; + } + + PVR_EDL_ENTRY entry; + entry.start = start; + entry.end = end; + + switch(type) + { + case DVR_ACTION_TYPE_CUT: + entry.type = PVR_EDL_TYPE_CUT; + break; + case DVR_ACTION_TYPE_MUTE: + entry.type = PVR_EDL_TYPE_MUTE; + break; + case DVR_ACTION_TYPE_SCENE: + entry.type = PVR_EDL_TYPE_SCENE; + break; + case DVR_ACTION_TYPE_COMBREAK: + entry.type = PVR_EDL_TYPE_COMBREAK; + break; + default: + entry.type = PVR_EDL_TYPE_COMBREAK; + break; + } + + XBMC->Log(LOG_DEBUG, "%s - EDL: start: %d, end: %d, action: %d", __FUNCTION__, entry.start, entry.end, entry.type); + + entries[index] = entry; + index++; + } + else + { + XBMC->Log(LOG_ERROR, "%s - Maximum number of EDL entries reached for recordingId: %s", __FUNCTION__, recording.strRecordingId); + break; + } + } + *size = index; + + return PVR_ERROR_NO_ERROR; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/src/HTSPData.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/src/HTSPData.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/src/HTSPData.h 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/src/HTSPData.h 2014-03-04 10:06:13.000000000 +0000 @@ -92,6 +92,7 @@ DemuxPacket* DemuxRead(void); bool SeekTime(int time,bool backward,double *startpts); void SetSpeed(int speed); + PVR_ERROR GetEdl(const PVR_RECORDING &recinfo, PVR_EDL_ENTRY entries[], int *size); private: SChannels GetChannels(); SChannels GetChannels(int tag); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/src/HTSPDemux.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/src/HTSPDemux.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/src/HTSPDemux.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/src/HTSPDemux.cpp 2014-01-04 10:28:19.000000000 +0000 @@ -21,11 +21,13 @@ #include "client.h" #include "HTSPConnection.h" -#include "avcodec.h" // For codec id's #include "HTSPDemux.h" +#include -#define READ_TIMEOUT 20000 +#define READ_TIMEOUT_MS 20000 +#define STREAM_PROPS_TIMEOUT_MS 500 +using namespace std; using namespace ADDON; using namespace PLATFORM; @@ -39,10 +41,6 @@ { m_seekEvent = new CEvent; m_seekTime = -1; - for (unsigned int i = 0; i < PVR_STREAM_MAX_STREAMS; i++) - m_Streams.stream[i].iCodecType = AVMEDIA_TYPE_UNKNOWN; - m_Streams.iStreamCount = 0; - m_StreamIndex.clear(); } CHTSPDemux::~CHTSPDemux() @@ -52,10 +50,9 @@ bool CHTSPDemux::Open(const PVR_CHANNEL &channelinfo) { - m_channel = channelinfo.iUniqueId; - m_bIsRadio = channelinfo.bIsRadio; - m_bIsOpen = false; - m_Streams.iStreamCount = 0; + m_channel = channelinfo.iUniqueId; + m_bIsRadio = channelinfo.bIsRadio; + m_bIsOpen = false; if(!m_session->CheckConnection(g_iConnectTimeout * 1000)) return false; @@ -63,8 +60,7 @@ if(!SendSubscribe(++m_subs, m_channel)) return false; - m_bIsOpen = true; - return m_bIsOpen; + return true; } void CHTSPDemux::Close() @@ -86,37 +82,16 @@ bool CHTSPDemux::GetStreamProperties(PVR_STREAM_PROPERTIES* props) { - props->iStreamCount = m_Streams.iStreamCount; - for (unsigned int i = 0; i < m_Streams.iStreamCount; i++) - { - props->stream[i].iPhysicalId = m_Streams.stream[i].iPhysicalId; - props->stream[i].iCodecType = m_Streams.stream[i].iCodecType; - props->stream[i].iCodecId = m_Streams.stream[i].iCodecId; - props->stream[i].strLanguage[0] = m_Streams.stream[i].strLanguage[0]; - props->stream[i].strLanguage[1] = m_Streams.stream[i].strLanguage[1]; - props->stream[i].strLanguage[2] = m_Streams.stream[i].strLanguage[2]; - props->stream[i].strLanguage[3] = m_Streams.stream[i].strLanguage[3]; - props->stream[i].iIdentifier = m_Streams.stream[i].iIdentifier; - props->stream[i].iFPSScale = m_Streams.stream[i].iFPSScale; - props->stream[i].iFPSRate = m_Streams.stream[i].iFPSRate; - props->stream[i].iHeight = m_Streams.stream[i].iHeight; - props->stream[i].iWidth = m_Streams.stream[i].iWidth; - props->stream[i].fAspect = m_Streams.stream[i].fAspect; - props->stream[i].iChannels = m_Streams.stream[i].iChannels; - props->stream[i].iSampleRate = m_Streams.stream[i].iSampleRate; - props->stream[i].iBlockAlign = m_Streams.stream[i].iBlockAlign; - props->stream[i].iBitRate = m_Streams.stream[i].iBitRate; - props->stream[i].iBitsPerSample = m_Streams.stream[i].iBitsPerSample; - } - return (props->iStreamCount > 0); + CLockObject lock(m_mutex); + if (!m_startedCondition.Wait(m_mutex, m_bIsOpen, STREAM_PROPS_TIMEOUT_MS)) + return false; + return m_streams.GetProperties(props); } void CHTSPDemux::Abort() { - m_Streams.iStreamCount = 0; - for (unsigned int i = 0; i < PVR_STREAM_MAX_STREAMS; i++) - m_Streams.stream[i].iCodecType = AVMEDIA_TYPE_UNKNOWN; - m_StreamIndex.clear(); + CLockObject lock(m_mutex); + m_streams.Clear(); } void CHTSPDemux::Flush(void) @@ -218,15 +193,7 @@ else pkt->pts = DVD_NOPTS_VALUE; - pkt->iStreamId = -1; - for(unsigned int i = 0; i < m_Streams.iStreamCount; i++) - { - if(m_Streams.stream[i].iPhysicalId == (unsigned int)index) - { - pkt->iStreamId = i; - break; - } - } + pkt->iStreamId = m_streams.GetStreamId((unsigned int)index); // drop packets with an invalid stream id if (pkt->iStreamId < 0) @@ -252,8 +219,8 @@ } else { - m_channel = channelinfo.iUniqueId; - m_Streams.iStreamCount = 0; + m_channel = channelinfo.iUniqueId; + m_streams.Clear(); return true; } @@ -268,6 +235,10 @@ strncpy(qualityinfo.strAdapterName, m_SourceInfo.si_adapter.c_str(), sizeof(qualityinfo.strAdapterName)); strncpy(qualityinfo.strAdapterStatus, m_Quality.fe_status.c_str(), sizeof(qualityinfo.strAdapterStatus)); + strncpy(qualityinfo.strServiceName, m_SourceInfo.si_service.c_str(), sizeof(qualityinfo.strServiceName)); + strncpy(qualityinfo.strProviderName, m_SourceInfo.si_provider.c_str(), sizeof(qualityinfo.strProviderName)); + strncpy(qualityinfo.strMuxName, m_SourceInfo.si_mux.c_str(), sizeof(qualityinfo.strMuxName)); + qualityinfo.iSignal = (uint16_t)m_Quality.fe_signal; qualityinfo.iSNR = (uint16_t)m_Quality.fe_snr; qualityinfo.iBER = (uint32_t)m_Quality.fe_ber; @@ -279,7 +250,9 @@ inline void HTSPResetDemuxStreamInfo(PVR_STREAM_PROPERTIES::PVR_STREAM &stream) { memset(&stream, 0, sizeof(stream)); - stream.iIdentifier = -1; + stream.iIdentifier = -1; + stream.iCodecType = XBMC_CODEC_TYPE_UNKNOWN; + stream.iCodecId = XBMC_INVALID_CODEC_ID; } inline void HTSPSetDemuxStreamInfoAudio(PVR_STREAM_PROPERTIES::PVR_STREAM &stream, htsmsg_t *msg) @@ -318,9 +291,7 @@ void CHTSPDemux::ParseSubscriptionStart(htsmsg_t *m) { - PVR_STREAM_PROPERTIES newStreams; - newStreams.iStreamCount = 0; - std::map newStreamIndex; + vector newStreams; htsmsg_t *streams; htsmsg_field_t *f; @@ -339,20 +310,12 @@ return; } - m_Streams.iStreamCount = 0; - HTSMSG_FOREACH(f, streams) { uint32_t index; const char* type; htsmsg_t* sub; - if (newStreams.iStreamCount >= PVR_STREAM_MAX_STREAMS) - { - XBMC->Log(LOG_ERROR, "%s - max amount of streams reached", __FUNCTION__); - break; - } - if (f->hmf_type != HMF_MAP) continue; @@ -364,89 +327,27 @@ if (htsmsg_get_u32(sub, "index", &index)) continue; - XBMC->Log(LOG_DEBUG, "%s - id: %d, type: %s", __FUNCTION__, index, type); - bool bValidStream(true); - HTSPResetDemuxStreamInfo(newStreams.stream[newStreams.iStreamCount]); + XbmcPvrStream newStream; + m_streams.GetStreamData(index, &newStream); - std::map::iterator it = m_StreamIndex.find(index); - if (it != m_StreamIndex.end()) + CodecDescriptor codecId = CodecDescriptor::GetCodecByName(type); + if (codecId.Codec().codec_type != XBMC_CODEC_TYPE_UNKNOWN) { - memcpy((void*)&newStreams.stream[newStreams.iStreamCount], (void*)&m_Streams.stream[m_StreamIndex[index]], - sizeof(PVR_STREAM_PROPERTIES::PVR_STREAM)); - } + newStream.iCodecType = codecId.Codec().codec_type; + newStream.iCodecId = codecId.Codec().codec_id; - if(!strcmp(type, "AC3")) - { - newStreams.stream[newStreams.iStreamCount].iCodecType = AVMEDIA_TYPE_AUDIO; - newStreams.stream[newStreams.iStreamCount].iCodecId = CODEC_ID_AC3; - } - else if(!strcmp(type, "EAC3")) - { - newStreams.stream[newStreams.iStreamCount].iCodecType = AVMEDIA_TYPE_AUDIO; - newStreams.stream[newStreams.iStreamCount].iCodecId = CODEC_ID_EAC3; - } - else if(!strcmp(type, "MPEG2AUDIO")) - { - newStreams.stream[newStreams.iStreamCount].iCodecType = AVMEDIA_TYPE_AUDIO; - newStreams.stream[newStreams.iStreamCount].iCodecId = CODEC_ID_MP2; - } - else if(!strcmp(type, "AAC")) - { - newStreams.stream[newStreams.iStreamCount].iCodecType = AVMEDIA_TYPE_AUDIO; - newStreams.stream[newStreams.iStreamCount].iCodecId = CODEC_ID_AAC; - } - else if(!strcmp(type, "AACLATM")) - { - newStreams.stream[newStreams.iStreamCount].iCodecType = AVMEDIA_TYPE_AUDIO; - newStreams.stream[newStreams.iStreamCount].iCodecId = CODEC_ID_AAC_LATM; - } - else if(!strcmp(type, "VORBIS")) - { - newStreams.stream[newStreams.iStreamCount].iCodecType = AVMEDIA_TYPE_AUDIO; - newStreams.stream[newStreams.iStreamCount].iCodecId = CODEC_ID_VORBIS; - } - else if(!strcmp(type, "MPEG2VIDEO")) - { - newStreams.stream[newStreams.iStreamCount].iCodecType = AVMEDIA_TYPE_VIDEO; - newStreams.stream[newStreams.iStreamCount].iCodecId = CODEC_ID_MPEG2VIDEO; - } - else if(!strcmp(type, "H264")) - { - newStreams.stream[newStreams.iStreamCount].iCodecType = AVMEDIA_TYPE_VIDEO; - newStreams.stream[newStreams.iStreamCount].iCodecId = CODEC_ID_H264; - } - else if(!strcmp(type, "VP8")) - { - newStreams.stream[newStreams.iStreamCount].iCodecType = AVMEDIA_TYPE_VIDEO; - newStreams.stream[newStreams.iStreamCount].iCodecId = CODEC_ID_VP8; - } - else if(!strcmp(type, "MPEG4VIDEO")) - { - newStreams.stream[newStreams.iStreamCount].iCodecType = AVMEDIA_TYPE_VIDEO; - newStreams.stream[newStreams.iStreamCount].iCodecId = CODEC_ID_MPEG4; - } - else if(!strcmp(type, "DVBSUB")) - { - uint32_t composition_id = 0, ancillary_id = 0; - htsmsg_get_u32(sub, "composition_id", &composition_id); - htsmsg_get_u32(sub, "ancillary_id" , &ancillary_id); - - newStreams.stream[newStreams.iStreamCount].iCodecType = AVMEDIA_TYPE_SUBTITLE; - newStreams.stream[newStreams.iStreamCount].iCodecId = CODEC_ID_DVB_SUBTITLE; - newStreams.stream[newStreams.iStreamCount].iIdentifier = (composition_id & 0xffff) | ((ancillary_id & 0xffff) << 16); - HTSPSetDemuxStreamInfoLanguage(newStreams.stream[newStreams.iStreamCount], sub); - } - else if(!strcmp(type, "TEXTSUB")) - { - newStreams.stream[newStreams.iStreamCount].iCodecType = AVMEDIA_TYPE_SUBTITLE; - newStreams.stream[newStreams.iStreamCount].iCodecId = CODEC_ID_TEXT; - HTSPSetDemuxStreamInfoLanguage(newStreams.stream[newStreams.iStreamCount], sub); - } - else if(!strcmp(type, "TELETEXT")) - { - newStreams.stream[newStreams.iStreamCount].iCodecType = AVMEDIA_TYPE_SUBTITLE; - newStreams.stream[newStreams.iStreamCount].iCodecId = CODEC_ID_DVB_TELETEXT; + if (codecId.Codec().codec_type == XBMC_CODEC_TYPE_SUBTITLE) + { + if (!strcmp(type, "DVBSUB")) + { + uint32_t composition_id = 0, ancillary_id = 0; + htsmsg_get_u32(sub, "composition_id", &composition_id); + htsmsg_get_u32(sub, "ancillary_id" , &ancillary_id); + newStream.iIdentifier = (composition_id & 0xffff) | ((ancillary_id & 0xffff) << 16); + } + HTSPSetDemuxStreamInfoLanguage(newStream, sub); + } } else { @@ -455,84 +356,27 @@ if (bValidStream) { - newStreamIndex[index] = newStreams.iStreamCount; - newStreams.stream[newStreams.iStreamCount].iPhysicalId = index; - if (newStreams.stream[newStreams.iStreamCount].iCodecType == AVMEDIA_TYPE_AUDIO) + XBMC->Log(LOG_DEBUG, "%s - id: %d, type: %s, codec: %u", __FUNCTION__, index, codecId.Name().c_str(), codecId.Codec().codec_id); + + newStream.iPhysicalId = index; + if (codecId.Codec().codec_type == XBMC_CODEC_TYPE_AUDIO) { - HTSPSetDemuxStreamInfoAudio(newStreams.stream[newStreams.iStreamCount], sub); - HTSPSetDemuxStreamInfoLanguage(newStreams.stream[newStreams.iStreamCount], sub); + HTSPSetDemuxStreamInfoAudio(newStream, sub); + HTSPSetDemuxStreamInfoLanguage(newStream, sub); } - else if (newStreams.stream[newStreams.iStreamCount].iCodecType == AVMEDIA_TYPE_VIDEO) - HTSPSetDemuxStreamInfoVideo(newStreams.stream[newStreams.iStreamCount], sub); - ++newStreams.iStreamCount; - } - } + else if (codecId.Codec().codec_type == XBMC_CODEC_TYPE_VIDEO) + HTSPSetDemuxStreamInfoVideo(newStream, sub); - std::map::iterator itl, itr; - // delete streams we don't have in streams - itl = m_StreamIndex.begin(); - while (itl != m_StreamIndex.end()) - { - itr = newStreamIndex.find(itl->first); - if (itr == newStreamIndex.end()) - { - m_Streams.stream[itl->second].iCodecType = AVMEDIA_TYPE_UNKNOWN; - m_Streams.stream[itl->second].iCodecId = CODEC_ID_NONE; - m_StreamIndex.erase(itl); - itl = m_StreamIndex.begin(); + newStreams.push_back(newStream); } else - ++itl; - } - // copy known streams - for (itl = m_StreamIndex.begin(); itl != m_StreamIndex.end(); ++itl) - { - itr = newStreamIndex.find(itl->first); - memcpy((void*)&m_Streams.stream[itl->second], (void*)&newStreams.stream[itr->second], - sizeof(PVR_STREAM_PROPERTIES::PVR_STREAM)); - newStreamIndex.erase(itr); - } - - // place video stream at pos 0 - for (itr = newStreamIndex.begin(); itr != newStreamIndex.end(); ++itr) - { - if (newStreams.stream[itr->second].iCodecType == AVMEDIA_TYPE_VIDEO) - break; - } - if (itr != newStreamIndex.end()) - { - m_StreamIndex[itr->first] = 0; - memcpy((void*)&m_Streams.stream[0], (void*)&newStreams.stream[itr->second], - sizeof(PVR_STREAM_PROPERTIES::PVR_STREAM)); - newStreamIndex.erase(itr); - } - - // fill the gaps or append after highest index - while (!newStreamIndex.empty()) - { - // find first unused index - unsigned int i; - for (i = 0; i < PVR_STREAM_MAX_STREAMS; i++) { - if (m_Streams.stream[i].iCodecType == (unsigned)AVMEDIA_TYPE_UNKNOWN) - break; + XBMC->Log(LOG_DEBUG, "%s - id: %d, type: %s, ignored", __FUNCTION__, index, type); } - itr = newStreamIndex.begin(); - m_StreamIndex[itr->first] = i; - memcpy((void*)&m_Streams.stream[i], (void*)&newStreams.stream[itr->second], - sizeof(PVR_STREAM_PROPERTIES::PVR_STREAM)); - newStreamIndex.erase(itr); - } - - // set streamCount - m_Streams.iStreamCount = 0; - for (itl = m_StreamIndex.begin(); itl != m_StreamIndex.end(); ++itl) - { - if (itl->second > m_Streams.iStreamCount) - m_Streams.iStreamCount = itl->second; } - if (!m_StreamIndex.empty()) - m_Streams.iStreamCount++; + + CLockObject lock(m_mutex); + m_streams.UpdateStreams(newStreams); DemuxPacket* pkt = PVR->AllocateDemuxPacket(0); pkt->iStreamId = DMX_SPECIALID_STREAMCHANGE; @@ -549,12 +393,16 @@ { XBMC->Log(LOG_INFO, "%s - subscription started on an unknown device", __FUNCTION__); } + + m_bIsOpen = true; + m_startedCondition.Signal(); } void CHTSPDemux::ParseSubscriptionStop(htsmsg_t *m) { XBMC->Log(LOG_INFO, "%s - subscription ended on adapter %s", __FUNCTION__, m_SourceInfo.si_adapter.c_str()); - m_Streams.iStreamCount = 0; + CLockObject lock(m_mutex); + m_streams.Clear(); /* reset the signal status */ m_Quality.fe_status = ""; @@ -625,8 +473,8 @@ bool CHTSPDemux::SendSubscribe(int subscription, int channel) { - const char *audioCodec; - const char *videoCodec; + const char* audioCodec(NULL); + const char* videoCodec(NULL); XBMC->Log(LOG_INFO, "%s - subscribe to channel '%d', subscription %d", __FUNCTION__, channel, subscription); @@ -638,44 +486,8 @@ if(g_bTranscode) { - switch(g_iAudioCodec) - { - case CODEC_ID_MP2: - audioCodec = "MPEG2AUDIO"; - break; - case CODEC_ID_AAC: - audioCodec = "AAC"; - break; - case CODEC_ID_AC3: - audioCodec = "AC3"; - break; - case CODEC_ID_VORBIS: - audioCodec = "VORBIS"; - break; - default: - audioCodec = "UNKNOWN"; - break; - } - - switch(g_iVideoCodec) - { - case CODEC_ID_MPEG2VIDEO: - videoCodec = "MPEG2VIDEO"; - break; - case CODEC_ID_H264: - videoCodec = "H264"; - break; - case CODEC_ID_VP8: - videoCodec = "VP8"; - break; - case CODEC_ID_MPEG4: - videoCodec = "MPEG4VIDEO"; - break; - default: - videoCodec = "UNKNOWN"; - break; - } - + audioCodec = g_audioCodec.Name().c_str() ? g_audioCodec.Name().c_str() : "UNKNOWN"; + videoCodec = g_videoCodec.Name().c_str() ? g_videoCodec.Name().c_str() : "UNKNOWN"; htsmsg_add_u32(m, "maxResolution", g_iResolution); htsmsg_add_str(m, "audioCodec" , audioCodec); htsmsg_add_str(m, "videoCodec" , videoCodec); @@ -689,7 +501,7 @@ } // TODO get this from the pvr api. hardcoded to 10 seconds now - m_session->SetReadTimeout(READ_TIMEOUT); + m_session->SetReadTimeout(READ_TIMEOUT_MS); Flush(); XBMC->Log(LOG_DEBUG, "%s - new subscription for channel %d (%d)", __FUNCTION__, m_channel, m_subs); @@ -705,7 +517,7 @@ htsmsg_add_s32(m, "speed" , speed); if (m_session->ReadSuccess(m, "pause subscription")) { - m_session->SetReadTimeout(speed == 0 ? -1 : READ_TIMEOUT); + m_session->SetReadTimeout(speed == 0 ? -1 : READ_TIMEOUT_MS); return true; } return false; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/src/HTSPDemux.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/src/HTSPDemux.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/src/HTSPDemux.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/src/HTSPDemux.h 2014-01-04 10:28:12.000000000 +0000 @@ -25,6 +25,7 @@ #include "HTSPConnection.h" #include "platform/util/buffer.h" #include "platform/threads/mutex.h" +#include "xbmc_stream_utils.hpp" class CHTSPDemux : public CHTSPConnectionCallback { @@ -68,14 +69,15 @@ int m_channel; int m_tag; std::string m_Status; - PVR_STREAM_PROPERTIES m_Streams; + ADDON::XbmcStreamProperties m_streams; SChannels m_channels; SQueueStatus m_QueueStatus; SQuality m_Quality; SSourceInfo m_SourceInfo; - std::map m_StreamIndex; PLATFORM::SyncedBuffer m_demuxPacketBuffer; bool m_bIsOpen; PLATFORM::CEvent* m_seekEvent; double m_seekTime; + PLATFORM::CMutex m_mutex; + PLATFORM::CCondition m_startedCondition; }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/src/HTSPTypes.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/src/HTSPTypes.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.hts/src/HTSPTypes.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.hts/src/HTSPTypes.h 2014-01-04 10:28:19.000000000 +0000 @@ -25,64 +25,12 @@ #include #include #include - -#include "avcodec.h" - -typedef std::vector CodecVector; - #include "platform/util/StdString.h" +#include "libXBMC_codec.h" +#include "client.h" +#include "xbmc_codec_descriptor.hpp" -typedef struct htsmsg htsmsg_t; - -template -class const_circular_iter : - public std::iterator< typename std::iterator_traits::iterator_category, - typename std::iterator_traits::value_type, - typename std::iterator_traits::difference_type, - typename std::iterator_traits::pointer, - typename std::iterator_traits::reference> -{ -protected: - T begin; - T end; - T iter; - -public: - typedef typename std::iterator_traits::value_type value_type; - typedef typename std::iterator_traits::difference_type difference_type; - typedef typename std::iterator_traits::pointer pointer; - typedef typename std::iterator_traits::reference reference; - - const_circular_iter(const const_circular_iter& src) : begin(src.begin), end(src.end), iter(src.iter) {}; - const_circular_iter(const T& b, const T& e) : begin(b), end(e), iter(b) {}; - const_circular_iter(const T& b, const T& e, const T& c) : begin(b), end(e), iter(c) {}; - const_circular_iter& operator++() - { - if(begin == end) - return(*this); - ++iter; - if (iter == end) - iter = begin; - return(*this); - } - - const_circular_iter& operator--() - { - if(begin == end) - return(*this); - if (iter == begin) - iter = end; - iter--; - return(*this); - } - - reference operator*() const { return (*iter); } - const pointer operator->() const { return &(*iter); } - bool operator==(const const_circular_iter& rhs) const { return (iter == rhs.iter); } - bool operator==(const T& rhs) const { return (iter == rhs); } - bool operator!=(const const_circular_iter& rhs) const { return ! operator==(rhs); } - bool operator!=(const T& rhs) const { return ! operator==(rhs); } -}; +typedef std::vector CodecVector; struct STag { diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.iptvsimple/addon/addon.xml.in xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/addon/addon.xml.in --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.iptvsimple/addon/addon.xml.in 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/addon/addon.xml.in 2014-01-28 20:43:50.000000000 +0000 @@ -1,17 +1,18 @@ - + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.iptvsimple/addon/changelog.txt xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/addon/changelog.txt --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.iptvsimple/addon/changelog.txt 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/addon/changelog.txt 2014-01-28 20:43:50.000000000 +0000 @@ -1,9 +1,19 @@ -v1.6.1 +v1.9.3 +- added setting to disable cache m3u/epg +- added support for programme in epg +- added possibility to specify logo path as URL +- changed tvg-logo should contains full logo filename (with extention) +- changed don't try download xmltv if it doesn't load after 3 attempt. + +v1.9.2 +- add timeshift buffer functions + +v1.8.1 - fixed issue with BOM header in EPG XML - fixed issue with update channels if they are changed in m3u - added setting starting number of channels -v1.6.0 +v1.8.0 - Initial version - Supports m3u as Live TV streams source and XMLTV as EPG source -- Supports Live TV, Radio channels and EPG \ No newline at end of file +- Supports Live TV, Radio channels and EPG diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.iptvsimple/addon/resources/language/English/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/addon/resources/language/English/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.iptvsimple/addon/resources/language/English/strings.po 2013-10-31 06:59:44.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/addon/resources/language/English/strings.po 2014-01-28 20:43:50.000000000 +0000 @@ -20,7 +20,7 @@ #settings labels msgctxt "#30000" -msgid "File Location" +msgid "Location" msgstr "" msgctxt "#30001" @@ -67,6 +67,14 @@ msgid "EPG Time Shift (hours)" msgstr "" +msgctxt "#30025" +msgid "Cache m3u at local storage" +msgstr "" + +msgctxt "#30026" +msgid "Cache XMLTV at local storage" +msgstr "" + msgctxt "#30030" msgid "Channels Logos" msgstr "" @@ -74,3 +82,7 @@ msgctxt "#30031" msgid "Channels Logos Folder" msgstr "" + +msgctxt "#30032" +msgid "Channels Logos Base URL" +msgstr "" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.iptvsimple/addon/resources/settings.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/addon/resources/settings.xml --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.iptvsimple/addon/resources/settings.xml 2013-10-31 06:59:44.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/addon/resources/settings.xml 2014-01-28 20:43:50.000000000 +0000 @@ -6,6 +6,7 @@ + @@ -15,14 +16,16 @@ - - --> + + - + + + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.iptvsimple/src/client.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/src/client.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.iptvsimple/src/client.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/src/client.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -56,6 +56,8 @@ int g_iEPGTimeShift = 0; int g_iStartNumber = 1; bool g_bTSOverride = true; +bool g_bCacheM3U = false; +bool g_bCacheEPG = false; extern std::string PathCombine(const std::string &strPath, const std::string &strFileName) { @@ -94,10 +96,24 @@ { iPathType = 1; } - CStdString strSettingName = iPathType ? "m3uUrl" : "m3uPath"; - if (XBMC->GetSetting(strSettingName, &buffer)) + if (iPathType) { - g_strM3UPath = buffer; + if (XBMC->GetSetting("m3uUrl", &buffer)) + { + g_strM3UPath = buffer; + } + if (!XBMC->GetSetting("m3uCache", &g_bCacheM3U)) + { + g_bCacheM3U = true; + } + } + else + { + if (XBMC->GetSetting("m3uPath", &buffer)) + { + g_strM3UPath = buffer; + } + g_bCacheM3U = false; } if (g_strM3UPath == "") { @@ -111,29 +127,39 @@ { iPathType = 1; } - strSettingName = iPathType ? "epgUrl" : "epgPath"; - if (XBMC->GetSetting(strSettingName, &buffer)) + if (iPathType) { - g_strTvgPath = buffer; + if (XBMC->GetSetting("epgUrl", &buffer)) + { + g_strTvgPath = buffer; + } + if (!XBMC->GetSetting("epgCache", &g_bCacheEPG)) + { + g_bCacheEPG = true; + } } - // BUG! xbmc does not return slider value - //float dTimeShift; - //if (XBMC->GetSetting("epgTimeShift", &dTimeShift)) - //{ - // g_iEPGTimeShift = (int)(dTimeShift * 3600.0); // hours to seconds - //} - int itmpShift; - if (XBMC->GetSetting("epgTimeShift_", &itmpShift)) + else { - itmpShift -= 12; - g_iEPGTimeShift = (int)(itmpShift * 3600.0); // hours to seconds + if (XBMC->GetSetting("epgPath", &buffer)) + { + g_strTvgPath = buffer; + } + g_bCacheEPG = false; + } + float fShift; + if (XBMC->GetSetting("epgTimeShift", &fShift)) + { + g_iEPGTimeShift = (int)(fShift * 3600.0); // hours to seconds } if (!XBMC->GetSetting("epgTSOverride", &g_bTSOverride)) { g_bTSOverride = true; } - - if (XBMC->GetSetting("logoPath", &buffer)) + if (!XBMC->GetSetting("logoPathType", &iPathType)) + { + iPathType = 1; + } + if (XBMC->GetSetting(iPathType ? "logoBaseUrl" : "logoPath", &buffer)) { g_strLogoPath = buffer; } @@ -268,6 +294,18 @@ return strMinApiVersion; } +const char* GetGUIAPIVersion(void) +{ + static const char *strGuiApiVersion = XBMC_GUI_API_VERSION; + return strGuiApiVersion; +} + +const char* GetMininumGUIAPIVersion(void) +{ + static const char *strMinGuiApiVersion = XBMC_GUI_MIN_API_VERSION; + return strMinGuiApiVersion; +} + PVR_ERROR GetAddonCapabilities(PVR_ADDON_CAPABILITIES* pCapabilities) { pCapabilities->bSupportsEPG = true; @@ -404,7 +442,7 @@ int GetRecordingsAmount(void) { return -1; } PVR_ERROR GetRecordings(ADDON_HANDLE handle) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR DialogChannelScan(void) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook) { return PVR_ERROR_NOT_IMPLEMENTED; } +PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_MENUHOOK_DATA &item) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR DeleteChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR RenameChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR MoveChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } @@ -427,6 +465,7 @@ PVR_ERROR SetRecordingPlayCount(const PVR_RECORDING &recording, int count) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR SetRecordingLastPlayedPosition(const PVR_RECORDING &recording, int lastplayedposition) { return PVR_ERROR_NOT_IMPLEMENTED; } int GetRecordingLastPlayedPosition(const PVR_RECORDING &recording) { return -1; } +PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY[], int*) { return PVR_ERROR_NOT_IMPLEMENTED; }; int GetTimersAmount(void) { return -1; } PVR_ERROR GetTimers(ADDON_HANDLE handle) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR AddTimer(const PVR_TIMER &timer) { return PVR_ERROR_NOT_IMPLEMENTED; } @@ -439,4 +478,7 @@ bool CanSeekStream(void) { return false; } bool SeekTime(int,bool,double*) { return false; } void SetSpeed(int) {}; +time_t GetPlayingTime() { return 0; } +time_t GetBufferTimeStart() { return 0; } +time_t GetBufferTimeEnd() { return 0; } } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.iptvsimple/src/client.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/src/client.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.iptvsimple/src/client.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/src/client.h 2014-01-28 20:43:50.000000000 +0000 @@ -27,7 +27,7 @@ #include "libXBMC_pvr.h" #include "libXBMC_gui.h" -#define PVR_CLIENT_VERSION "1.6.1" +#define PVR_CLIENT_VERSION "1.9.3" #define M3U_FILE_NAME "iptv.m3u.cache" #define TVG_FILE_NAME "xmltv.xml.cache" @@ -49,6 +49,8 @@ extern int g_iEPGTimeShift; extern int g_iStartNumber; extern bool g_bTSOverride; +extern bool g_bCacheM3U; +extern bool g_bCacheEPG; extern std::string PathCombine(const std::string &strPath, const std::string &strFileName); extern std::string GetClientFilePath(const std::string &strFileName); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.iptvsimple/src/PVRIptvData.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/src/PVRIptvData.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.iptvsimple/src/PVRIptvData.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/src/PVRIptvData.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -115,14 +115,14 @@ int iCount = 0; while(iCount < 3) // max 3 tries { - if ((iReaded = GetCachedFileContents(TVG_FILE_NAME, m_strXMLTVUrl, data)) != 0) + if ((iReaded = GetCachedFileContents(TVG_FILE_NAME, m_strXMLTVUrl, data, g_bCacheEPG)) != 0) { break; } XBMC->Log(LOG_ERROR, "Unable to load EPG file '%s': file is missing or empty. :%dth try.", m_strXMLTVUrl.c_str(), ++iCount); if (iCount < 3) { - usleep(5 * 1000 * 1000); // sleep 5 sec before next try. + usleep(2 * 1000 * 1000); // sleep 2 sec before next try. } } @@ -130,6 +130,8 @@ { XBMC->Log(LOG_ERROR, "Unable to load EPG file '%s': file is missing or empty. After %d tries.", m_strXMLTVUrl.c_str(), iCount); m_bEGPLoaded = true; + m_iLastStart = iStart; + m_iLastEnd = iEnd; return false; } @@ -159,8 +161,7 @@ if (buffer[0] != '\xEF' || buffer[1] != '\xBB' || buffer[2] != '\xBF') { // check for tar archive - if (strcmp(buffer + 0x101, "ustar") || - strcmp(buffer + 0x101, "GNUtar")) + if (strcmp(buffer + 0x101, "ustar") || strcmp(buffer + 0x101, "GNUtar")) { buffer += 0x200; // RECORDSIZE = 512 } @@ -284,6 +285,16 @@ GetNodeValue(pChannelNode, "category", strCategory); GetNodeValue(pChannelNode, "desc", strDesc); + CStdString strIconPath; + xml_node<> *pIconNode = pChannelNode->first_node("icon"); + if (pIconNode != NULL) + { + if (!GetAttributeValue(pIconNode, "src", strIconPath)) + { + strIconPath = ""; + } + } + PVRIptvEpgEntry entry; entry.iBroadcastId = ++iBroadCastId; entry.iGenreType = 0; @@ -291,6 +302,7 @@ entry.strTitle = strTitle; entry.strPlot = strDesc; entry.strPlotOutline = ""; + entry.strIconPath = strIconPath; entry.startTime = iTmpStart; entry.endTime = iTmpEnd; entry.strGenreString = strCategory; @@ -315,7 +327,7 @@ } CStdString strPlaylistContent; - if (!GetCachedFileContents(M3U_FILE_NAME, m_strM3uUrl, strPlaylistContent)) + if (!GetCachedFileContents(M3U_FILE_NAME, m_strM3uUrl, strPlaylistContent, g_bCacheM3U)) { XBMC->Log(LOG_ERROR, "Unable to load playlist file '%s': file is missing or empty.", m_strM3uUrl.c_str()); return false; @@ -608,8 +620,7 @@ continue; } - if (!m_bEGPLoaded || - iStart > m_iLastStart || iEnd > m_iLastEnd) + if (!m_bEGPLoaded || iStart > m_iLastStart || iEnd > m_iLastEnd) { if (LoadEPG(iStart, iEnd)) { @@ -619,8 +630,7 @@ } PVRIptvEpgChannel *epg; - if ((epg = FindEpgForChannel(*myChannel)) == NULL - || epg->epg.size() == 0) + if ((epg = FindEpgForChannel(*myChannel)) == NULL || epg->epg.size() == 0) { return PVR_ERROR_NO_ERROR; } @@ -785,11 +795,11 @@ */ bool PVRIptvData::GzipInflate( const std::string& compressedBytes, std::string& uncompressedBytes ) { -#define HANDLE_CALL_ZLIB(status) { \ - if(status != Z_OK) { \ - free(uncomp); \ - return false; \ - } \ +#define HANDLE_CALL_ZLIB(status) { \ + if(status != Z_OK) { \ + free(uncomp); \ + return false; \ + } \ } if ( compressedBytes.size() == 0 ) @@ -849,17 +859,19 @@ uncompressedBytes += uncomp[ i ]; } - free(uncomp); - return true; + free( uncomp ); + return true ; } -int PVRIptvData::GetCachedFileContents(const std::string &strCachedName, const std::string &filePath, std::string &strContents) +int PVRIptvData::GetCachedFileContents(const std::string &strCachedName, const std::string &filePath, + std::string &strContents, const bool bUseCache /* false */) { bool bNeedReload = false; CStdString strCachedPath = GetUserFilePath(strCachedName); CStdString strFilePath = filePath; - if (XBMC->FileExists(strCachedPath, false)) + // check cached file is exists + if (bUseCache && XBMC->FileExists(strCachedPath, false)) { struct __stat64 statCached; struct __stat64 statOrig; @@ -867,7 +879,7 @@ XBMC->StatFile(strCachedPath, &statCached); XBMC->StatFile(strFilePath, &statOrig); - bNeedReload = statCached.st_mtime < statOrig.st_mtime; + bNeedReload = statCached.st_mtime < statOrig.st_mtime || statOrig.st_mtime == 0; } else { @@ -877,7 +889,9 @@ if (bNeedReload) { GetFileContents(strFilePath, strContents); - if (strContents.length() > 0) + + // write to cache + if (bUseCache && strContents.length() > 0) { void* fileHandle = XBMC->OpenFileForWrite(strCachedPath, true); if (fileHandle) @@ -895,15 +909,13 @@ void PVRIptvData::ApplyChannelsLogos() { if (m_strLogoPath.IsEmpty()) - { return; - } vector::iterator channel; for(channel = m_channels.begin(); channel < m_channels.end(); channel++) { channel->strLogoPath = PathCombine(m_strLogoPath, channel->strTvgLogo); - channel->strLogoPath.append(CHANNEL_LOGO_EXTENSION); + //channel->strLogoPath.append(CHANNEL_LOGO_EXTENSION); } } @@ -992,4 +1004,4 @@ iId = ((iId << 5) + iId) + c; /* iId * 33 + c */ return abs(iId); -} +} \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.iptvsimple/src/PVRIptvData.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/src/PVRIptvData.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.iptvsimple/src/PVRIptvData.h 2013-10-31 06:59:44.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/src/PVRIptvData.h 2014-01-28 20:43:50.000000000 +0000 @@ -100,7 +100,8 @@ virtual PVRIptvEpgChannel *FindEpgForChannel(PVRIptvChannel &channel); virtual int ParseDateTime(CStdString strDate, bool iDateFormat = true); virtual bool GzipInflate( const std::string &compressedBytes, std::string &uncompressedBytes); - virtual int GetCachedFileContents(const std::string &strCachedName, const std::string &strFilePath, std::string &strContent); + virtual int GetCachedFileContents(const std::string &strCachedName, const std::string &strFilePath, + std::string &strContent, const bool bUseCache = false); virtual void ApplyChannelsLogos(); virtual CStdString ReadMarkerValue(std::string &strLine, const char * strMarkerName); virtual int GetChannelId(const char * strChannelName, const char * strStreamUrl); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/addon.xml.in xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/addon.xml.in --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/addon.xml.in 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/addon.xml.in 2014-05-04 06:40:43.000000000 +0000 @@ -1,42 +1,55 @@ - + XBMC voorprogram vir die MediaPortal TV Bediener (ffmpeg + tsreader weergawe) XBMC frontend for the MediaPortal TV Server (ffmpeg + tsreader version) + XBMC клиент за ТВ сървъра MediaPortal (ffmpeg + tsreader версия) Frontal XBMC pel servidor de TV MediaPortal (versió ffmpeg + tsreader) Rozhraní XBMC pro televizní server MediaPortal (verze ffmpeg + tsreader) + Blaen XBMC ar gyfer Gweinydd Teledu MediaPortal (fersiwn ffmpeg + tsreader) XBMC frontend til MediaPortal TV server (ffmpeg + tsreader version) - XBMC-Frontend für MediaPortal TV Server (ffmpeg- und tsreader-Version) + XBMC Oberfläche für den MediaPortal TV Server (ffmpeg + tsreader Version) Frontend του XBMC για το διακομιστή MediaPortal TV (έκδοση ffmpeg + tsreader) XBMC frontend for the MediaPortal TV Server (ffmpeg + tsreader version) + XBMC frontend for the MediaPortal TV Server (ffmpeg + tsreader version) Interfaz XBMC para el MediaPortal TV Server (versión ffmpeg + tsreader) Interfaz XBMC para el MediaPortal TV Server (versión ffmpeg + tsreader) + XBMC esi MediaPortal TV serverile (ffmpeg + tsreader versioon) XBMC frontend MediaPortal TV-serverille (ffmpeg + tsreader) Applicatif XBMC pour le serveur TV de MediaPortal (version ffmpeg + tsreader) + Frontal XBMC pour le serveur MediaPortal TV (version ffmpeg + tsreader) O Interface do XBMC para o Servidor de TV de MediaPortal (versión de ffmpeg +tsreader) ממשק משתמש XBMC לשרת טלוויזיה MediaPortal (גרסת ffmpeg + tsreader ) + XBMC sučelje za MediaPortal TV poslužitelj (ffmpeg + tsreader inačica) XBMC Médiaportal előtér-kiszolgáló (ffmpeg + tsreader) + Frontend XBMC untuk Server TV MediaPortal (versi ffmpeg + tsreader) Frontend XBMC per il server MediaPortal TV (version ffmpeg + tsreader) MediaPortal TV サーバー (ffmpeg + tsreader バージョン) の XBMC フロントエンド + XBMC სამომხმარებლო მხარე MediaPortal TV Server-თვის (ffmpeg + tsreader ვერსია) MediaPortal TV Server (ffmpeg + tsreader version) 을 위한 XBMC 프론트엔드 XBMC sąsaja MediaPortal TV serverio (ffmpeg + tsreader versija) + XBMC galasistēma MediaPortal TV Server (ffmpeg + tsreader versija) XBMC интерфејс за MediaPortal TV Server (ffmpeg + tsreader верзија) + Bahagian hadapan XBMC untuk Pelayan TV MediaPortal (versi ffmpeg + tsreader) + MediaPortal TV Server အတွက် XBMC frontend (ffmpeg + tsreader version) XBMC frontend voor de Mediaportal TV Server (ffmmpeg + tsreader versie) + XBMC skall for MediaPortal TV Server (ffmpeg + tsreader versjon) Interfejs XBMC dla serwera MediaPortal TV (wersja ffmpeg + tsreader) Frontend XBMC para o MediaPortal TV Server (ffmpeg + versão tsreader) Frontend do XBMC para Servidor de TV MediaPortal (ffmpeg + versão tsreader) @@ -45,28 +58,43 @@ XBMC rozhranie pre MediaPortal TV server (verzia ffmpeg + tsreader) XBMC-jev vmesnik za MediaPortal TV strežnik (ffmpeg + tsreader) XBMC frontend för MediaPortal TV-server (ffmpeg + tsreader versionen) - XBMC的MediaPortal TV服务器前端(ffmpeg + tsreader版) + MediaPortal டிவி சேவையகம் (ffmpeg + tsreader பதிப்பு) க்கான XBMC முன்நிலை + Накладка XBMC для сервера ТВ MediaPortal'у (версія ffmpeg + tsreader) + Giao tiếp XBMC cho MediaPortal TV Server (phiên bản ffmpeg + tsreader) + XBMC 的 MediaPortal TV 服务器前端(ffmpeg + tsreader版) + MediaPortal電視服務器的XBMC前端 (ffmpeg+tsreader版本) MediaPortal TV Bediener voorprogram. Ondersteun stroom van Lewendige TV & Opnames, luister na Radio kanale, EPG en Tydhouers. Hierdie byvoegsel kombineer die voormalige ffmpeg en tsreader byvoegsels. MediaPortal TV Server frontend. Supports streaming of Live TV & Recordings, listening to Radio channels, EPG and Timers. This addon combines the former ffmpeg and tsreader addons. + XBMC клиент за ТВ сървъра MediaPortal. Поддържа стрийминг и записване на телевизия, слушане на радио канали, електронен програмен справочник и броячи. Тази добавка обединява старите ffmpeg и tsreader добавки. Frontal XMBC de TV MediaPortal. Suporta el flux de TV en directe i enregistraments, escoltes de canals de radio, EPG i temporitzadors. Aquest afegitó combina els anteriors afegitons de ffmpg i tsreader. Rozhraní pro televizní server MediaPortal. Podporuje proudové vysílání živého vysílání a nahrávek, poslech kanálů rádia, EPG, a časovače. Toto rozšíření kombinuje rozšíření ffmpeg a tsreader. - MediaPortal TV server frontend. Understøtter streaming af TV og Optagelser, Radiokanaler, EPG og Timere. Denne add-on kombinerer de gamle ffmpeg og tsreader add-ons. - Erlaubt die Wiedergabe von Live TV und Aufnahmen mittels MediaPortal TV Server auf XBMC. Desweiteren werden Radiokanäle, EPG und Timer unterstützt. Dieses Addon vereint die ehemaligen ffmpeg- und tsreader-Addons. + Blaen Gweinydd Teledu Media Portal. Mae'n cynnal ffrydio Teledu Byw a Recordiadau, gwrando ar sianeli Radio, Amserlen Rhaglenni ac Amserlenydd. Mae'r ychwanegyn yn cynnwys y cyn ychwangion ffmpeg a tsreader. + MediaPortal TV server frontend. Understøtter streaming af TV og Optagelser, Radiokanaler, EPG og Timere. Denne addon kombinerer de gamle ffmpeg og tsreader addons. + Mediaportal TV Server Oberfläche. Unterstützt Live TV & Aufnahmen, Radiokanäle, EPG und Timer. Dieses Addon kombiniert die ehemaligen ffmpeg- und tsreader-Addons. Frontend για το διακομιστή MediaPortal TV. Υποστηρίζει ροές Live TV & Εγγραφές, ακρόαση Ραδιοφώνου, EPG και Χρονοδιακόπτες. Αυτό το πρόσθετο συνδυάζει τα προηγούμενα πρόσθετα ffmpeg και tsreader. MediaPortal TV Server frontend. Supports streaming of Live TV & Recordings, listening to Radio channels, EPG and Timers. This addon combines the former ffmpeg and tsreader addons. + MediaPortal TV Server frontend. Supports streaming of Live TV & Recordings, listening to Radio channels, EPG and Timers. This addon combines the former ffmpeg and tsreader addons. Interfaz MediaPortal TV Server. Soporta transmisión de TV en vivo y grabaciones, escuchar canales de radio, EPG y temporizadores. Este complemento combina los anteriores ffmpeg y tsreader. Interfaz MediaPortal TV Server. Soporta transmisión de TV en vivo y grabaciones, escuchar canales de radio, EPG y temporizadores. Este complemento combina los anteriores ffmpeg y tsreader. + MediaPortal TV serveri esi. Toetab telekanalite striimimist ja salvestamist, raadio kuulamist ja elektroonilist saatekava. See lisa kombineerib endas endised ffmpeg ja tsreader lisad. MediaPortal TV-palvelimen frontend. Tukee livelähetysten sekä tallenteiden virtaustoista, radiokanavia, ohjelmaopasta sekä ajastuksia. Tämä lisäosa yhdistää aikaisemmat ffmpeg- ja tsreader-lisäosat. Applicatif Serveur TV MediaPortal. Il supporte la lecture en continu de direct télévision et enregistrement, l'écoute de radios, guide de programmes et minuteries. Cette extension combine les existants ffmpeg et tsreader. - Interface do Servidor de TV de MediaPortal. Soporta transmisión de TV ao vivo e Gravacións, escoita dos canles da radio, EPG e programacións. Este engadido combina o antigo ffmpeg e os engadidos tsreader. + Frontal pour le serveur MediaPortal TV, prenant en charge la lecture en transit des télés en direct & les enregistrements, l'écoute de chaînes radio, le GÉP et les minuteries. Cet addiciel combines les anciens addiciels ffmpeg et tsreader. + Interface do Servidor de TV de MediaPortal. Soporta transmisión de TV ao vivo e Gravacións, escoita dos canles da radio, Guía e programacións. Este engadido combina o antigo ffmpeg e os engadidos tsreader. ממשק משתמש לשרת טלוויזיה MediaPortal.תומך בהזרמת שידורי טלוויזיה ורדיו חיים והקלטתם,לוח שידורים ומתזמני הקלטות.תוסף זה משלב בתוכו את התוספים של ffmpeg וtsreader. + MediaPortal TV poslužitelj sučelje. Podržava stremanje i snimanje TV programa, slušanje radio programa, elektronski programski vodič (EPG) i vremenski zadano snimanje. Ovaj dodatak objedinjuje nekadašnje ffmpeg i tsreader dodatke. Médiaportal előtér-kiszolgáló. Élő adások, felvételek,és rádió adások sugárzásának támogatása EPG-vel és időzítéssel. Ez a kiegészítő egyesíti az ffmpeg, és a tsreader kiegészítőket. + Frontend Server TV MediaPortal. Mendukung pengaliran TV dan Rekaman langsung, mendengarkan kanal radio, EPG dan Timer. Pengaya ini mengkombinasikan penggaya ffmeg dan tsreader yang lama. Frontend del server MediaPortal TV. Supporta lo streaming di Live TV e le registrazioni, l'ascolto dei canali radio, EPG e i timer. Questo addon combina gli addon ffmpeg e tsreaded. MediaPortal TV サーバーのフロントエンドです。ライブテレビのストリーミングや録画、ラジオチャンネルの視聴、EPG、タイマーなどをサポートしています。以前の ffmpeg アドオンと tsreader アドオンを組み合わせたものです。 + MediaPortal TV Server სამომხმარებლო მხარე მხარს უჭერს Live TV სტრიმინგსა და ჩანაწერებს, Radio არხების მოსმენას, EPG-სა და თაიმერებს. ეს ჩადგმა აერთიანებს ძვე ffmpeg და tsreader ჩადგმებს. MediaPortal TV Server 프론트엔드. TV 시청 & 녹화, 라디오 채널 청취, EPG 및 타이머 지원. 이 추가기능은 이전의 ffmpeg 과 tsreader 추가기능을 합친 것입니다. MediaPortal TV Serverio sąsaja. Palaiko transliacijos Live TV & Įrašus , klausytis radijo kanalus, EPG ir laikmačius. Šis priedas vienija buvusius ffmpeg ir TSreader priedus. + MediaPortal TV Server galasistēma. Atbalsta tiešraides TV un ierakstu straumēšanu, radio kanālu klaudīšanos, EPG un taimerus. Šis pielikums kombinē senākos ffmpeg un tsreader pielikumus. MediaPortal TV Server frontend. Supports streaming of Live TV & Recordings, listening to Radio channels, EPG and Timers. This addon combines the former ffmpeg and tsreader addons. + Bahagian hadapan Pelayan TV MediaPortal; menyokong penstirman TV Langsung & Rakaman, mendengar saluran Radio, EPG dan Pemasa. Tambahan ini gabungkan tambahan ffmpef fan tsreader terdahulu. MediaPortal TV Server frontend. Ondersteunt het bekijken van Live TV en opnames, het luisteren van radio zenders, het tonen van de EPG en het inplannen/beheren van nieuwe opnames (Timers). Deze addon combineert de voorgaande "ffmpeg" en "tsreader" addons. + MediaPortal TV Server skall. Støtter streaming av Live TV og opptak, Lytte til Radio kanaler, EPG og Timere. Dette tillegget kombinererer de tidligere ffmpeg og tsreader tilleggene. Interfejs serwera TV MediaPortal. Wspiera strumieniowanie TV na żywo i nagrywanie, słuchanie radia, EPG oraz wyłączniki czasu. Ten dodatek łączy dodatki ffmpeg i tsreader. Frontend para o MediaPortal TV Server. Suporta transmissão de TV em Directo e Gravações, ouvir estações de Rádio, EPG e Temporizadores. Este addon combina os antigos addons ffmpeg e tsreader. Frontend do Servidor de TV do MediaPortal. Suporta streaming de TV Ao Vivo e Gravações, escutar canais de rádio, EPG e Agendamentos. Este addon combina os antigos addons ffmpeg e tsreader @@ -75,29 +103,45 @@ Rozhranie pre MediaPortal TV server. Podporuje streamovanie živého televízneho vysielania a nahrávok, počúvanie rozhlasových kanálov, EPG a časovače. Tento doplnok zlučuje dohromady bývalé doplnky ffmpeg a tsreader. Vmesnik za MediaPortal TV strežnik. Podpira pretakanje televizije v živo & posnetkov, poslušanje radia, EPG in časovnike. Ta dodatek združuje prejšnja dodatka ffmpeg in tsreader. MediaPortal TV-server frontend. Stödjer strömning av direktsänd TV & inspelningar, lyssna på radiokanaler, EPG och timers. Detta tillägg kombinerar dom tidigare ffmpeg och tsreader tilläggen. - MediaPortal TV服务器前端,支持直播电视播放和录制、收听电台、电子节目单和定时器。这个插件结合了这前的ffmpeg和tsreader插件。 + MediaPortal TV Server முன்நிலை. லைவ் டிவி & பதிவுகளின் ஸ்ட்ரீமிங் செய்யவும், ரேடியோ சேனல்கள் கேட்கவும் மற்றும் EPG, துணைபுரிகிறது. இந்த துனைபயன் முன்னாள் ffmpeg மற்றும் tsreader துணை நிரல்கள் ஒருங்கிணைக்கிறது. + Накладка для сервера ТВ MediaPortal. Підтримує потокове Live TV і запис, прослуховування радіо каналів, телегід та планування. Цей додаток сполучає колишні додатки ffmpeg і tsreader. + Giao tiếp cho MediaPortal TV Server. Hỗ trợ truyền phát và thu chương trình Live TV, nghe Radio, hẹn giờ và hiển thị lịch trình chiếu (EPG). Addon này kết hợp cho các addon cũ của ffmpeg và tsreader. + MediaPortal TV 服务器前端。支持直播电视和录像流媒体、收听电台、电子节目单和定时器。这个插件结合了之前的 ffmpeg 和 tsreader 插件。 + MediaPortal電視服務器的前端。支援的串流檔案包括有:電視直播和錄影,收聽廣播頻道,電子節目表和計時器。這個插件結合了先前ffmpeg和tsreader的插件。 Hierdie is onstabiele sagteware! Die outeurs is op geen manier verantwoordelik vir gefaalde opnames, inkorrekte tydhouers, gemorsde ure, of enige ander ongewensde effekte. This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. - Això és programari inestable! Els autors no són en absolut responsables d'enregistraments fallist, temporitzadors incorrectes, hores tudades, o qualsevol altra efecte indesitjable... + Тази програма е нестабилна! Авторите не носят отговорност за неуспешно записване, некоректни броячи, пропиляното време и други нежелани ефекти. + Això és programari inestable! Els autors no són de cap manera responsables dels enregistraments que han fallat, temporitzadors incorrectes, hores perdudes, o qualsevols altres efectes indesitjables.. Tento software není stabilní. Autoři nejsou žádným způsobem zodpovědní za selhání při nahrávání, neplatné časovače, ztracený čas, či jakékoliv jiné nežádoucí události... + Mae hwn yn feddalwedd ansad! Nid yw'r awduron yn gyfrifol mewn unrhyw ffordd am fethu recordio, amseru gwallus, oriau wedi eu gwastraffu nac effeithiau anymunol eraill. Dette er ustabil software! Ophavsmændene er på ingen måde ansvarlige for mislykkede optagelser, ukorrekte timere, spildte timer, eller andre uønskede konsekvenser.. - Diese Software ist noch in der Entwicklung! Die Autoren sind nicht für fehlgeschlagene Aufnahmen, falsche Timer, verschwendete Zeit oder andere ungewollte Effekte verantwortlich. + Dies ist instabile Software! Die Autoren sind in keiner Weise verantwortlich für fehlgeschlagene Aufnahmen, falsche Timer, verschwendete Zeit oder andere ungewünschte Effekte. Ασταθές πρόγραμμα! Οι δημιουργοί δεν είναι σε καμία περίπτωση υπεύθυνοι για αποτυχημένες εγγραφές, λανθασμένους χρονοδιακόπτες, χαμένες ώρες, ή κάθε είδους ανεπιθύμητα αποτελέσματα.. This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. + This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. ¡Este es un software inestable! Los autores no son de ninguna manera responsables de las grabaciones fallidas o incorrectas, las temporizadores perdidas, ni otros efectos no deseables.. ¡Este software es inestable! Los autores no se responsabilizan por grabaciones fallidas, temporizadores incorrectos, horas perdidas, o cualquier otro efecto no deseado.. ¡Esto es software inestable! Los autores no son de ninguna manera responsables por grabaciones fallidas, temporizadores incorrectos, horas perdidas o cualquier otro efecto no deseado... + See on ebastabiilne tarkvara! Autorid ei ole kuidagi moodi vastutavad nurjunud salvestiste, ebaõige aegrelee, raisatud tundide ega muude soovimatute asjade eest. Tämä on epävakaa ohjelmisto! Tekijät eivät ole millään muotoa vastuussa epäonnistuneista tallennuksista, virheellisistä ajastuksia, haaskatusta ajasta, verenpaineen noususta tai mistään muusta epäsuotuisasta vaikutuksesta. Cet applicatif est instable ! Les auteurs ne sont en aucun cas responsables d'échec d'enregistrements, minuteries erronées, temps perdu et autres résultats indésirables.. + Ce logiciel est instable! Les auteurs ne sont aucunement responsables des enregistrements défaillants, des minuteries erronées, des heures perdues ou tout autre effet indésirable. Este é software non estable, os autores non se fan responsábeis dos erros na gravacións, temporizadores incorrectos, e outros efectos non desexados. זוהי תוכנה בלתי יציבה!מחברי התכנה אינם אחראים להקלטות כושלות,מתזמני הקלטות שגויים,שעות מבוזבזות,או כל תוצאה בלתי רצויה... + Ovo je nestabilan softver! Autori nisu ni na koji način odgovorni za neuspjelo snimanje, netočna vremena snimanja, izgubljene sate, ili bilo koje druge nepoželjne učinke... Ez nem stabil szoftver! A készítők nem vállalnak felelősséget, a hibás felvételért, rossz időzítésért, elvesztegetett időért... + Ini merupakan software yang tidak stabil! Penulis tidak bertanggung jawab untuk rekaman gagal, timer salah, waktu terbuang, atau efek tak diinginkan lainnya... + Þetta er óstöðugur hugbúnaður! Höfundarnir eru á engann hátt ábyrgir fyrir misheppnuðum upptökum, röngum upptökutímum, klukkustundum sem að fóru í súginn eða nokkrum öðrum óæskilegum áhrifum. Questo software non è stabile! Gli autori non sono responsabili per registrazioni fallite, timer non corretti, ore perse, o altri effetti indesiderati... これは不安定なソフトウェアです!本プログラムの作者は、録画の失敗、正確に作動しなかったタイマー、無駄にした時間、その他あらゆる好ましくない結果について責任を負わないものとします。 + ეს არის არასტაბილური პროგრამული უზრუნველყოფა! ავტორები არ არიან პასუხისმგებელი შეცდომებზე, არასწორ EPG-ზე, დაკარგულ დროზე ან სხვა ხარვეზებზე 이 소프트웨어는 불안정합니다! 제작자는 녹화 실패, 부정확한 타이머, 시간 낭비 및 기타 예상하지 못한 결과에 대해 책임지지 않습니다.. Tai yra nestabili programinė įranga! Autorius jokiu būdu neatsakingas už nepavykusius įrašus, neteisingus laikmačius, iššvaistytas valandas, ar nutikus kitiems nepageidaujamiems poveikiams ...[COLOR=red](xbmc.lt siūlo/rekomenduoja testuojant šį priedą persijungti į Anglų [orinali] kalbą)[/COLOR] + Šī ir nestabila programmatūra! Autori nav nekādā vaidā atbildīgi par nesanākušiem ierakstiem, nepareiziem taimeriem, iztērētām stundām vai jebkādiem citiem nevēlamiem efektiem.. Ова е нестабилен софтвер! Авторите на ниту еден начин не одговараат за неуспешни снимки, неточни тајмери, потрошени часови, или било кои други несакани ефекти. + Ini merupakan perisian tidak stabil! Pengarang tidak bertanggungjawab atas kegagalan rakaman, pemasa tidak betul, masa yang dibazirkan, atau apa jua kesan yang tidak dikehendaki.. Deze software is niet 100% stabiel! De auteurs zijn op geen enkele wijze aansprakelijk voor mislukte opnames, verspilde tijd, of enig ander ongewild neveneffect.. + Dette er ustabilt programvare! Forfatterne er ikke ansvarlig på noen måte for ødelagte opptak, feile timere, bortkastede timer, eller andre uønskede hendinger... To oprogramowanie jest niestabilne! Autorzy w żaden sposób nie odpowiadają za nieudane nagrania, źle działające wyłączniki czasowe, stracone godziny czy też jakiekolwiek inne niepożądane efekty. Este é um software instável! Os autores não se responsabilizam por falhas nas gravações, temporizadores incorrectos, ou qualquer outro efeito não desejado... Este é um software instável! Os autores não são responsáveis por falhas de gravações, agendamentos incorretos, horas desperdiçadas, ou quaisquer outros efeitos indesejados. @@ -105,8 +149,16 @@ Это нестабильная программа! Авторы не несут ответственности за неудачную запись, неправильные таймеры, потраченное время и другие нежелательные последствия. Tento softvér nie je stabilný! Autori nenesú žiadnu zodpovednosť za chybné nahrávky vysielania, nesprávne časovače alebo iné neželané udalosti spôsobené týmto softvérom.. To je nestabilna programska oprema! Avtorji niso odgovorni za neuspela snemanja, nepravilne časovnike, zapravljen čas in katerikoli drug neželen učinek... + Ky program nuk është ende stabil! Autorët së këtij programi nuk janë në as një menyr përgjegjës për rregistrime të gabuara, timer të pasaktë, kohë të humbur ose efekte të tillë të padëshirueshëm. + Овај софтвер је нестабилан! Аутори ни на који начин нису одговорни за неуспела снимања, неисправна заказана снимања, изгубљене сате или друге нежељене ефекте. Detta är ostabil mjukvara! Upphovsmännen är inte ansvariga för misslyckade inspelningar, inkorrekta timers, bortslösade timmar, eller några andra oönskade effekter.. - 这是不稳定版的软件!作者不对录制失败、错误定时造成时间浪费或其它不良影响负责。 + இந்த நிலையற்ற மென்பொருள்! தோல்வியடைந்தது பதிவுகள், தவறான டைமர்கள், வீணாகி மணி, அல்லது வேறு எந்த விரும்பத்தகாத விளைவுகலுக்கு இதன் ஆசிரியர்கள் பொறுப்பு இல்லை. + Ин нармафзори ноустувор аст! Муаллифон барои вайрониҳои сабт, вақтсанҷҳои нодуруст, соатҳои бефоида ва дигар таъсирҳои номатлуб ҷавобгар намебошанд. + Bu stabil olmayan program! Yapımcılar hatalı kayıtlardan, bozuk sürelerden, harcanan vakitten veya herhangi bir olumsuz etkiden dolayı sorumlu tutulamaz. + Це нестабільна програма! Автор не несуть жодної відповідальності за зіпсуті записи, неправильні таймери, потрачений час, та інші небажані ефекти. + Đây là phần mềm không ổn định! Các tác giả không chịu trách nhiệm đối với bản ghi âm thất bại, giờ không chính xác, giờ lãng phí, hoặc bất kỳ tác dụng không mong muốn khác... + 这是不稳定版的软件!作者不对录像失败、错误定时造成时间浪费或其它不良影响负责。 + 這是測試版軟體!其原創作者並無法對於以下情況負責,包含:錄影失敗,不正確的定時設定,多餘時數,或任何產生的其它不良影響... @OS@ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/changelog.txt xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/changelog.txt --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/changelog.txt 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/changelog.txt 2014-05-04 06:40:43.000000000 +0000 @@ -1,19 +1,41 @@ -v1.6.10 +v1.9.13 +- Added: Live TV/Recordings: Report "permission denied" errors on SMB access failures +- Changed: [Settings] enable fast channel switching by default +- Changed: Reduce the signal status calls to once every 10s. +- Fixed: Channel thumbnails: replace also the invalid file name characters <>*?\| in the channel name by a _ +- Fixed: [SMB] Allow an empty username and password field +- Fixed: [SMB] Don't replace \\ by smb:// when not at the start of the path +- Fixed: Stop timeshifting at the backend side on buffer open failure. +- Fixed: Recordings: Fix playback for in-progress recordings. Play them always via the PVR addon to account for the growing file length +- Fixed: Recording playback over rtsp in ffmpeg mode + +v1.9.12 +- Updated language files from Transifex + +v1.9.11 +- Updated language files from Transifex + +v1.9.10 +- add timeshift buffer functions + +v1.8.9 - TSReader: Fixed: channel switching behavior when switching across tsbuffer files +- TSReader: Fixed: Windows share access in multiseat mode (return smb:// URI's instead of \\UNC paths to XBMC also for Windows) +- TSReader: Fixed: SD<->HD channel switching with "fast channel switching" enabled (add PAT detection to find the exact start of the new channel in the timeshift buffer file) - Recordings: Add support for retrieving and storing the playback resume position (requires TVServerXBMC build 121 or higher) +- Recordings: Trigger a recording list update when the backend couldn't find the selected recording +- Fixed: potential out-of-bounds array access while accessing TV Card info - Fixed: Hide smb password in debug xbmc.log file +- Added: support for retrieving channels from multiple specified groups (>1, < All groups) (requires TVServerXBMC build 122 or higher) +- Changed: drop support for TVServerXBMC builds older than 1.1.x.107 - Changed: more log notifications on errors - EPG: added additional genre strings to the genre string to id translation table -- Better error logging on failures -- TSReader: Don't replace \\ by smb:// when not at the start of the path -- Allow empty username and password for SMB share access -- Channel thumbnails: replace more invalid file name characters in the channel name by a _ - -v1.6.9 -- Added: Fast channel switching: PAT detection on channel switch to find the new channel in the Timeshift buffer file. - This should fix SD<->HD channel switching -- Recordings: Trigger a recording list update when the backend couldn't find the selected recording -- Recordings: Add support for retrieving and storing the playback resume position (requires TVServerXBMC build 121 or higher) + +v1.8.8 +- sync with PVR API v1.8.0 + +v1.7.8 +- Bump after PVR API version bump v1.6.8 - Channels: Use MediaPortal VisibleInGuide property as inverted IsHidden flag in XBMC. (requires TVServerXBMC build 120) diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Afrikaans/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Afrikaans/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Afrikaans/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Afrikaans/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Afrikaans (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/af/)\n" +"Language-Team: Afrikaans (http://www.transifex.com/projects/p/xbmc-main/language/af/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Albanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Albanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Albanian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Albanian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: MediaPortal PVR Client +# Addon id: pvr.mediaportal.tvserver +# Addon Provider: Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Albanian (http://www.transifex.com/projects/p/xbmc-main/language/sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30003" +msgid "Include Radio" +msgstr "Inkludo Radionë" + +msgctxt "#30005" +msgid "Connect timeout (s)" +msgstr "Timeout i lidhjes (s)" + +msgctxt "#30042" +msgid "Playback" +msgstr "Ndëgjim" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Amharic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Amharic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Amharic/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Amharic/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,25 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Amharic (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/am/)\n" +"Language-Team: Amharic (http://www.transifex.com/projects/p/xbmc-main/language/am/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: am\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +msgctxt "#30003" +msgid "Include Radio" +msgstr "ሬዲዮ ማካተቻ" + msgctxt "#30040" msgid "Connection" msgstr "ግንኙነት " diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Arabic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Arabic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Arabic/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Arabic/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Arabic (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ar/)\n" +"Language-Team: Arabic (http://www.transifex.com/projects/p/xbmc-main/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Basque/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Basque/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Basque/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Basque/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Basque (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/eu/)\n" +"Language-Team: Basque (http://www.transifex.com/projects/p/xbmc-main/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -20,3 +19,7 @@ msgctxt "#30042" msgid "Playback" msgstr "Erreprodukzioa" + +msgctxt "#30064" +msgid "Unknown error" +msgstr "Errore ezezaguna" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Belarusian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Belarusian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Belarusian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Belarusian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Belarusian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/be/)\n" +"Language-Team: Belarusian (http://www.transifex.com/projects/p/xbmc-main/language/be/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Bosnian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Bosnian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Bosnian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Bosnian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Bosnian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/bs/)\n" +"Language-Team: Bosnian (http://www.transifex.com/projects/p/xbmc-main/language/bs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Bulgarian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Bulgarian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Bulgarian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Bulgarian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,26 +1,165 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Bulgarian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/bg/)\n" +"Language-Team: Bulgarian (http://www.transifex.com/projects/p/xbmc-main/language/bg/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bg\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "Mediaportal Hostname" +msgstr "Mediaportal хост" + +msgctxt "#30001" +msgid "Mediaportal XBMC plugin Port" +msgstr "Порт за добавките на XBMC за Mediaportal" + +msgctxt "#30002" +msgid "Free-to-air only" +msgstr "Само безплатните канали" + +msgctxt "#30003" +msgid "Include Radio" +msgstr "Включи радиото" + +msgctxt "#30004" +msgid "Fast channel switching (don't stop timeshift)" +msgstr "Бързо превключване на канали (не спирай таймшифта)" + +msgctxt "#30005" +msgid "Connect timeout (s)" +msgstr "Таймаут при свързване (с)" + +msgctxt "#30006" +msgid "Import only TV Channels from group" +msgstr "Импортирай само ТВ каналите от групата" + +msgctxt "#30007" +msgid "Import only Radio Channels from group" +msgstr "Импортирай само радио каналите от групата" + +msgctxt "#30008" +msgid "Convert hostname to IP-adress" +msgstr "Конвертирай хост името в IP адрес" + +msgctxt "#30009" +msgid "EPG: Read genre strings (slow)" +msgstr "ЕПС: получавай жанровете (бавно)" + +msgctxt "#30010" +msgid "Wait time after tuning a channel (ms)" +msgstr "Интервал на очакване след настройка на канала (мс)" + +msgctxt "#30015" +msgid "Streaming method" +msgstr "Стрийминг метод" + +msgctxt "#30016" +msgid "Windows user account (SMB)" +msgstr "Windows потребителски профил (SMB)" + +msgctxt "#30017" +msgid "Windows password (SMB)" +msgstr "Windows парола (SMB)" + +msgctxt "#30018" +msgid "Use RTSP streaming" +msgstr "Използвай RTSP стрийминг" + +msgctxt "#30040" +msgid "Connection" +msgstr "Свързване" + +msgctxt "#30041" +msgid "MediaPortal" +msgstr "MediaPortal" + msgctxt "#30042" msgid "Playback" msgstr "Възпроизвеждане" +msgctxt "#30050" +msgid "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" +msgstr "Вашата XBMC ТВ сървърна версия '%s' е твърде стара. Моля, обновете я до '%s' или по-нова!" + +msgctxt "#30051" +msgid "Your TVServerXBMC version is too old. Please upgrade to '%s' or higher!" +msgstr "Вашата XBMC ТВ сървърна версия е твърде стара. Моля, обновете я до '%s' или по-нова!" + +msgctxt "#30052" +msgid "Recording playback failed. Empty URL of filename." +msgstr "Неуспешно възпроизвеждане на записа. Празна връзка или име на файла." + +msgctxt "#30060" +msgid "All cards are busy" +msgstr "Всички карти са заети" + +msgctxt "#30061" +msgid "Channel is scrambled" +msgstr "Канала е кодиран" + +msgctxt "#30062" +msgid "No video or audio detected" +msgstr "Няма открит видео или аудио поток" + +msgctxt "#30063" +msgid "No signal detected" +msgstr "Няма сигнал" + msgctxt "#30064" msgid "Unknown error" -msgstr "Непозната грешка" +msgstr "Неизвестна грешка" + +msgctxt "#30065" +msgid "Unable to start graph" +msgstr "Неуспешно стартиране на на графиката" + +msgctxt "#30066" +msgid "Unknown channel" +msgstr "Неизвестен канал" + +msgctxt "#30067" +msgid "No tuning details" +msgstr "Няма детайли за настройка" + +msgctxt "#30068" +msgid "Channel is not mapped to any card" +msgstr "Канала не е свързан към нито една карта" + +msgctxt "#30069" +msgid "Card is disabled" +msgstr "Картата е изключена" + +msgctxt "#30070" +msgid "Connection to slave failed" +msgstr "Неуспешно свързване с подчиненото устройство" + +msgctxt "#30071" +msgid "Not the owner" +msgstr "Липсва собственик" + +msgctxt "#30072" +msgid "Graph building failed" +msgstr "Неуспешно изграждане на графиката" + +msgctxt "#30073" +msgid "SW Encoder missing" +msgstr "Липсва програмен енкодер" + +msgctxt "#30074" +msgid "No free disk space" +msgstr "Няма свободно място на диска" + +msgctxt "#30075" +msgid "No PMT found" +msgstr "PMT не е намерена" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Burmese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Burmese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Burmese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Burmese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,85 @@ +# XBMC Media Center language file +# Addon Name: MediaPortal PVR Client +# Addon id: pvr.mediaportal.tvserver +# Addon Provider: Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Burmese (http://www.transifex.com/projects/p/xbmc-main/language/my/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30002" +msgid "Free-to-air only" +msgstr "အခမဲ့ထုတ်လွင့်မှု့သာလျှင်" + +msgctxt "#30003" +msgid "Include Radio" +msgstr "ရေဒီယိုအပါအဝင်" + +msgctxt "#30005" +msgid "Connect timeout (s)" +msgstr "ချိတ်ဆက်မှု့အချိန်ပြည့်သွားပါပြီ။" + +msgctxt "#30008" +msgid "Convert hostname to IP-adress" +msgstr "hostname ကို IP-adress အဖြစ်သို့ပြောင်းမည်" + +msgctxt "#30017" +msgid "Windows password (SMB)" +msgstr "Windows စကားဝှက် (SMB)" + +msgctxt "#30040" +msgid "Connection" +msgstr "ကွန်နက်ရှင်" + +msgctxt "#30050" +msgid "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" +msgstr "သင်၏ TVServerXBMC ဗားရှင်း '%s' သည်အရမ်းဟောင်းနေသည်။'%s' သို့မဟုတ် သူ့ထက်မြင့်သောဗားရှင်းသို့အဆင့်မြင့်ပါ" + +msgctxt "#30051" +msgid "Your TVServerXBMC version is too old. Please upgrade to '%s' or higher!" +msgstr "သင်၏ TVServerXBMC ဗားရှင်း '%s' သည်အရမ်;ဟောင်းနေသည်။'%s' သို့မဟုတ် သူ့ထက်မြင့်သောဗားရှင်းသို့အဆင့်မြင့်ပါ" + +msgctxt "#30060" +msgid "All cards are busy" +msgstr "ကဒ်အားလုံးသည်အလုပ်များနေသည်" + +msgctxt "#30062" +msgid "No video or audio detected" +msgstr "ဗွီဒီယို သို့မဟုတ် အသံများ မသိရှိပါ။" + +msgctxt "#30064" +msgid "Unknown error" +msgstr "မသိရှိသောချို့ယွင်းချက်" + +msgctxt "#30065" +msgid "Unable to start graph" +msgstr "ဂရပ်ကိုမစနိုင်ပါ" + +msgctxt "#30066" +msgid "Unknown channel" +msgstr "အမည်မသိချယ်နယ်" + +msgctxt "#30069" +msgid "Card is disabled" +msgstr "ကဒ်ကိုပိတ်ထားသည်" + +msgctxt "#30071" +msgid "Not the owner" +msgstr "ပိုင်ရှင်မဟုတ်ပါ" + +msgctxt "#30074" +msgid "No free disk space" +msgstr "နေရာလွတ်မရှိပါ။" + +msgctxt "#30075" +msgid "No PMT found" +msgstr "PMT ကိုမတွေ့ပါ။" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Catalan/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Catalan/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Catalan/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Catalan/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Catalan (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ca/)\n" +"Language-Team: Catalan (http://www.transifex.com/projects/p/xbmc-main/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -23,7 +22,7 @@ msgctxt "#30001" msgid "Mediaportal XBMC plugin Port" -msgstr "Port de l'afegitó per XBMC del MediaPortal" +msgstr "Port del connector per l'XBMC del MediaPortal" msgctxt "#30002" msgid "Free-to-air only" @@ -51,7 +50,7 @@ msgctxt "#30008" msgid "Convert hostname to IP-adress" -msgstr "Converteix nom de màquina a adreça IP" +msgstr "Converteix el nom de màquina a adreça IP" msgctxt "#30009" msgid "EPG: Read genre strings (slow)" @@ -103,7 +102,7 @@ msgctxt "#30060" msgid "All cards are busy" -msgstr "Totes les tarjes es troben ocupades" +msgstr "Totes les targetes estan ocupades" msgctxt "#30061" msgid "Channel is scrambled" @@ -135,15 +134,15 @@ msgctxt "#30068" msgid "Channel is not mapped to any card" -msgstr "El canal no es troba mapejat a cap tarja" +msgstr "El canal no està mapejat a cap targeta" msgctxt "#30069" msgid "Card is disabled" -msgstr "La tarja es troba desactivada" +msgstr "La targeta està inhabilitada" msgctxt "#30070" msgid "Connection to slave failed" -msgstr "Ha fallt la connexió a l'esclau" +msgstr "Ha fallat la connexió a l'esclau" msgctxt "#30071" msgid "Not the owner" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Chinese (Simple)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Chinese (Simple)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Chinese (Simple)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Chinese (Simple)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Chinese (Simple) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/zh/)\n" +"Language-Team: Chinese (Simple) (http://www.transifex.com/projects/p/xbmc-main/language/zh/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,11 +18,11 @@ msgctxt "#30000" msgid "Mediaportal Hostname" -msgstr "Mediaportal主机名" +msgstr "Mediaportal 主机名" msgctxt "#30001" msgid "Mediaportal XBMC plugin Port" -msgstr "Mediaportal XBMC插件端口" +msgstr "Mediaportal XBMC 插件端口" msgctxt "#30002" msgid "Free-to-air only" @@ -51,7 +50,7 @@ msgctxt "#30008" msgid "Convert hostname to IP-adress" -msgstr "主机名转换为IP地址" +msgstr "主机名转换为 IP 地址" msgctxt "#30009" msgid "EPG: Read genre strings (slow)" @@ -63,19 +62,19 @@ msgctxt "#30015" msgid "Streaming method" -msgstr "流传输方法" +msgstr "流传输方式" msgctxt "#30016" msgid "Windows user account (SMB)" -msgstr "Windows用户帐号(SMB)" +msgstr "Windows 用户帐号(SMB)" msgctxt "#30017" msgid "Windows password (SMB)" -msgstr "Windows密码(SMB)" +msgstr "Windows 密码(SMB)" msgctxt "#30018" msgid "Use RTSP streaming" -msgstr "使用RTSP流" +msgstr "使用 RTSP 流" msgctxt "#30040" msgid "Connection" @@ -91,15 +90,15 @@ msgctxt "#30050" msgid "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" -msgstr "TVServerXBMC版本“%s”太旧,请升级到“%s”或更高版本!" +msgstr "TVServerXBMC 版本“%s”太旧,请升级到“%s”或更高版本!" msgctxt "#30051" msgid "Your TVServerXBMC version is too old. Please upgrade to '%s' or higher!" -msgstr "TVServerXBMC版本太旧,请升级到“%s”或更高版本!" +msgstr "TVServerXBMC 版本太旧,请升级到“%s”或更高版本!" msgctxt "#30052" msgid "Recording playback failed. Empty URL of filename." -msgstr "录像播放失败。文件名URL空。" +msgstr "录像播放失败。文件名 URL 空。" msgctxt "#30060" msgid "All cards are busy" @@ -123,7 +122,7 @@ msgctxt "#30065" msgid "Unable to start graph" -msgstr "无法启动graph" +msgstr "无法启动 graph" msgctxt "#30066" msgid "Unknown channel" @@ -151,11 +150,11 @@ msgctxt "#30072" msgid "Graph building failed" -msgstr "Graph创建失败" +msgstr "Graph 创建失败" msgctxt "#30073" msgid "SW Encoder missing" -msgstr "SW编码器丢失" +msgstr "SW 编码器丢失" msgctxt "#30074" msgid "No free disk space" @@ -163,4 +162,4 @@ msgctxt "#30075" msgid "No PMT found" -msgstr "未找到PMT" +msgstr "未找到 PMT" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Chinese (Traditional)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Chinese (Traditional)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Chinese (Traditional)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Chinese (Traditional)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,26 +1,165 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Chinese (Traditional) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/zh_TW/)\n" +"Language-Team: Chinese (Traditional) (http://www.transifex.com/projects/p/xbmc-main/language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0;\n" +msgctxt "#30000" +msgid "Mediaportal Hostname" +msgstr "Mediaportal主機名稱" + +msgctxt "#30001" +msgid "Mediaportal XBMC plugin Port" +msgstr "Mediaportal XBMC外掛程式端口" + +msgctxt "#30002" +msgid "Free-to-air only" +msgstr "只有Free-to-air" + +msgctxt "#30003" +msgid "Include Radio" +msgstr "包含收音機" + +msgctxt "#30004" +msgid "Fast channel switching (don't stop timeshift)" +msgstr "快速頻道切換(不停止時光平移)" + +msgctxt "#30005" +msgid "Connect timeout (s)" +msgstr "連接超時(秒)" + +msgctxt "#30006" +msgid "Import only TV Channels from group" +msgstr "只從群組導入的電視頻道" + +msgctxt "#30007" +msgid "Import only Radio Channels from group" +msgstr "只從群組導入的廣播頻道" + +msgctxt "#30008" +msgid "Convert hostname to IP-adress" +msgstr "轉換主機名稱到IP位址" + +msgctxt "#30009" +msgid "EPG: Read genre strings (slow)" +msgstr "電子節目表:讀取類別字符串流 (慢)" + +msgctxt "#30010" +msgid "Wait time after tuning a channel (ms)" +msgstr "頻道調整後的等待時間 (毫秒)" + +msgctxt "#30015" +msgid "Streaming method" +msgstr "串流方式" + +msgctxt "#30016" +msgid "Windows user account (SMB)" +msgstr "視窗使用帳戶 (SMB)" + +msgctxt "#30017" +msgid "Windows password (SMB)" +msgstr "視窗密碼 (SMB)" + +msgctxt "#30018" +msgid "Use RTSP streaming" +msgstr "使用RTSP串流" + +msgctxt "#30040" +msgid "Connection" +msgstr "連接" + +msgctxt "#30041" +msgid "MediaPortal" +msgstr "MediaPortal" + msgctxt "#30042" msgid "Playback" msgstr "播放" +msgctxt "#30050" +msgid "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" +msgstr "您的TVServerXBMC版本'%s' 太舊了。請升級到'%s' 或更高版本!" + +msgctxt "#30051" +msgid "Your TVServerXBMC version is too old. Please upgrade to '%s' or higher!" +msgstr "您的TVServerXBMC版本太舊了。請升級到'%s' 或更高版本!" + +msgctxt "#30052" +msgid "Recording playback failed. Empty URL of filename." +msgstr "錄影撥放失敗。檔案名稱是失效的URL連結。" + +msgctxt "#30060" +msgid "All cards are busy" +msgstr "所有的電視卡都在忙碌中" + +msgctxt "#30061" +msgid "Channel is scrambled" +msgstr "頻道已加碼" + +msgctxt "#30062" +msgid "No video or audio detected" +msgstr "偵測不到影片或音樂" + +msgctxt "#30063" +msgid "No signal detected" +msgstr "偵測不到訊號" + msgctxt "#30064" msgid "Unknown error" msgstr "未知的錯誤" + +msgctxt "#30065" +msgid "Unable to start graph" +msgstr "無法開啟圖形" + +msgctxt "#30066" +msgid "Unknown channel" +msgstr "未知的頻道" + +msgctxt "#30067" +msgid "No tuning details" +msgstr "無調整的詳細訊息" + +msgctxt "#30068" +msgid "Channel is not mapped to any card" +msgstr "頻道沒有映射到任何電視卡" + +msgctxt "#30069" +msgid "Card is disabled" +msgstr "電視卡已禁用" + +msgctxt "#30070" +msgid "Connection to slave failed" +msgstr "連接到從屬失敗" + +msgctxt "#30071" +msgid "Not the owner" +msgstr "不是所有者" + +msgctxt "#30072" +msgid "Graph building failed" +msgstr "圖形建立失敗" + +msgctxt "#30073" +msgid "SW Encoder missing" +msgstr "SW編碼器丟失" + +msgctxt "#30074" +msgid "No free disk space" +msgstr "沒有多餘的硬碟空間" + +msgctxt "#30075" +msgid "No PMT found" +msgstr "找不到PMT" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Croatian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Croatian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Croatian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Croatian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,165 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Croatian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/hr/)\n" +"Language-Team: Croatian (http://www.transifex.com/projects/p/xbmc-main/language/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +msgctxt "#30000" +msgid "Mediaportal Hostname" +msgstr "MediaPortal naziv računala" + +msgctxt "#30001" +msgid "Mediaportal XBMC plugin Port" +msgstr "Ulaz Mediaportal XBMC dodatka" + +msgctxt "#30002" +msgid "Free-to-air only" +msgstr "Samo nekôdirani" + +msgctxt "#30003" +msgid "Include Radio" +msgstr "Uključi radio" + +msgctxt "#30004" +msgid "Fast channel switching (don't stop timeshift)" +msgstr "Brzo prebacivanje programa (ne zaustavljaj vremensko premotavanje)" + +msgctxt "#30005" +msgid "Connect timeout (s)" +msgstr "Istek vremena povezivanja (sek)" + +msgctxt "#30006" +msgid "Import only TV Channels from group" +msgstr "Uvezi samo TV programe iz grupe" + +msgctxt "#30007" +msgid "Import only Radio Channels from group" +msgstr "Uvezi samo radijske programe iz grupe" + +msgctxt "#30008" +msgid "Convert hostname to IP-adress" +msgstr "Pretvori naziv računala u IP adresu" + +msgctxt "#30009" +msgid "EPG: Read genre strings (slow)" +msgstr "EPG: čitaj nizove žanra (sporije)" + +msgctxt "#30010" +msgid "Wait time after tuning a channel (ms)" +msgstr "Vrijeme čekanja nakon pronalaska programa (ms)" + +msgctxt "#30015" +msgid "Streaming method" +msgstr "Način stremanja" + +msgctxt "#30016" +msgid "Windows user account (SMB)" +msgstr "Windows korisnički račun (SMB)" + +msgctxt "#30017" +msgid "Windows password (SMB)" +msgstr "Windows lozinka (SMB)" + +msgctxt "#30018" +msgid "Use RTSP streaming" +msgstr "Koristi RTSP stremanje" + +msgctxt "#30040" +msgid "Connection" +msgstr "Povezivanje" + +msgctxt "#30041" +msgid "MediaPortal" +msgstr "MediaPortal" + msgctxt "#30042" msgid "Playback" msgstr "Reprodukcija" + +msgctxt "#30050" +msgid "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" +msgstr "Vaš XBMC TV poslužitelj inačice '%s' je zastario. Nadogradite ga na '%s' ili noviju inačicu!" + +msgctxt "#30051" +msgid "Your TVServerXBMC version is too old. Please upgrade to '%s' or higher!" +msgstr "Inačica vašeg XBMC TV poslužitelja je prestara. Nadogradite ga na '%s' ili noviju inačicu!" + +msgctxt "#30052" +msgid "Recording playback failed. Empty URL of filename." +msgstr "Reprodukcija snimke nije uspjela. Prazan URL naziva datoteke." + +msgctxt "#30060" +msgid "All cards are busy" +msgstr "Sve kartice su zauzete" + +msgctxt "#30061" +msgid "Channel is scrambled" +msgstr "Program je kôdiran" + +msgctxt "#30062" +msgid "No video or audio detected" +msgstr "Slika ili zvuk nisu otkriveni" + +msgctxt "#30063" +msgid "No signal detected" +msgstr "Signal nije pronađen" + +msgctxt "#30064" +msgid "Unknown error" +msgstr "Nepoznata greška" + +msgctxt "#30065" +msgid "Unable to start graph" +msgstr "Nemoguće pokretanje grafa" + +msgctxt "#30066" +msgid "Unknown channel" +msgstr "Nepoznati program" + +msgctxt "#30067" +msgid "No tuning details" +msgstr "Nema pojedinosti o prijemu" + +msgctxt "#30068" +msgid "Channel is not mapped to any card" +msgstr "Program nije dodijeljen niti jednoj kartici" + +msgctxt "#30069" +msgid "Card is disabled" +msgstr "Kartica je onemogućena" + +msgctxt "#30070" +msgid "Connection to slave failed" +msgstr "Povezivanje na alternativnu karticu nije uspjelo" + +msgctxt "#30071" +msgid "Not the owner" +msgstr "Nije vlasnik" + +msgctxt "#30072" +msgid "Graph building failed" +msgstr "Neuspjela izgradnja grafa" + +msgctxt "#30073" +msgid "SW Encoder missing" +msgstr "Nedostaje softverski enkôder" + +msgctxt "#30074" +msgid "No free disk space" +msgstr "Nema slobodnog prostora na disku" + +msgctxt "#30075" +msgid "No PMT found" +msgstr "PMT nije pronađen" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Czech/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Czech/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Czech/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Czech/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Czech (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/cs/)\n" +"Language-Team: Czech (http://www.transifex.com/projects/p/xbmc-main/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -91,11 +90,11 @@ msgctxt "#30050" msgid "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" -msgstr "Vaše verze TVServerXBMC '%s' je příliš stará. Aktualizujte prosím na '%s', nebo novější." +msgstr "vaše verze TVServerXBMC '%s' je příliš stará. Aktualizujte prosím na '%s', nebo novější." msgctxt "#30051" msgid "Your TVServerXBMC version is too old. Please upgrade to '%s' or higher!" -msgstr "Vaše verze TVServerXBMC je příliš stará. Aktualizujte prosím na '%s', nebo novější." +msgstr "vaše verze TVServerXBMC je příliš stará. Aktualizujte prosím na '%s', nebo novější." msgctxt "#30052" msgid "Recording playback failed. Empty URL of filename." diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Danish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Danish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Danish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Danish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Danish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/da/)\n" +"Language-Team: Danish (http://www.transifex.com/projects/p/xbmc-main/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Dutch/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Dutch/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Dutch/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Dutch/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Dutch (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/nl/)\n" +"Language-Team: Dutch (http://www.transifex.com/projects/p/xbmc-main/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/English/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/English/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/English/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/English/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: English (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/en/)\n" +"Language-Team: English (http://www.transifex.com/projects/p/xbmc-main/language/en/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/English (New Zealand)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/English (New Zealand)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/English (New Zealand)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/English (New Zealand)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,161 @@ +# XBMC Media Center language file +# Addon Name: MediaPortal PVR Client +# Addon id: pvr.mediaportal.tvserver +# Addon Provider: Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (New Zealand) (http://www.transifex.com/projects/p/xbmc-main/language/en_NZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_NZ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mediaportal Hostname" +msgstr "Mediaportal Hostname" + +msgctxt "#30001" +msgid "Mediaportal XBMC plugin Port" +msgstr "Mediaportal XBMC plugin Port" + +msgctxt "#30002" +msgid "Free-to-air only" +msgstr "Free-to-air only" + +msgctxt "#30003" +msgid "Include Radio" +msgstr "Include Radio" + +msgctxt "#30004" +msgid "Fast channel switching (don't stop timeshift)" +msgstr "Fast channel switching (don't stop timeshift)" + +msgctxt "#30005" +msgid "Connect timeout (s)" +msgstr "Connect timeout (s)" + +msgctxt "#30006" +msgid "Import only TV Channels from group" +msgstr "Import only TV Channels from group" + +msgctxt "#30007" +msgid "Import only Radio Channels from group" +msgstr "Import only Radio Channels from group" + +msgctxt "#30009" +msgid "EPG: Read genre strings (slow)" +msgstr "EPG: Read genre strings (slow)" + +msgctxt "#30010" +msgid "Wait time after tuning a channel (ms)" +msgstr "Wait time after tuning a channel (ms)" + +msgctxt "#30015" +msgid "Streaming method" +msgstr "Streaming method" + +msgctxt "#30016" +msgid "Windows user account (SMB)" +msgstr "Windows user account (SMB)" + +msgctxt "#30017" +msgid "Windows password (SMB)" +msgstr "Windows password (SMB)" + +msgctxt "#30018" +msgid "Use RTSP streaming" +msgstr "Use RTSP streaming" + +msgctxt "#30040" +msgid "Connection" +msgstr "Connection" + +msgctxt "#30041" +msgid "MediaPortal" +msgstr "MediaPortal" + +msgctxt "#30042" +msgid "Playback" +msgstr "Playback" + +msgctxt "#30050" +msgid "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" +msgstr "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" + +msgctxt "#30051" +msgid "Your TVServerXBMC version is too old. Please upgrade to '%s' or higher!" +msgstr "Your TVServerXBMC version is too old. Please upgrade to '%s' or higher!" + +msgctxt "#30052" +msgid "Recording playback failed. Empty URL of filename." +msgstr "Recording playback failed. Empty URL of filename." + +msgctxt "#30060" +msgid "All cards are busy" +msgstr "All cards are busy" + +msgctxt "#30061" +msgid "Channel is scrambled" +msgstr "Channel is scrambled" + +msgctxt "#30062" +msgid "No video or audio detected" +msgstr "No video or audio detected" + +msgctxt "#30063" +msgid "No signal detected" +msgstr "No signal detected" + +msgctxt "#30064" +msgid "Unknown error" +msgstr "Unknown error" + +msgctxt "#30065" +msgid "Unable to start graph" +msgstr "Unable to start graph" + +msgctxt "#30066" +msgid "Unknown channel" +msgstr "Unknown channel" + +msgctxt "#30067" +msgid "No tuning details" +msgstr "No tuning details" + +msgctxt "#30068" +msgid "Channel is not mapped to any card" +msgstr "Channel is not mapped to any card" + +msgctxt "#30069" +msgid "Card is disabled" +msgstr "Card is disabled" + +msgctxt "#30070" +msgid "Connection to slave failed" +msgstr "Connection to slave failed" + +msgctxt "#30071" +msgid "Not the owner" +msgstr "Not the owner" + +msgctxt "#30072" +msgid "Graph building failed" +msgstr "Graph building failed" + +msgctxt "#30073" +msgid "SW Encoder missing" +msgstr "SW Encoder missing" + +msgctxt "#30074" +msgid "No free disk space" +msgstr "No free disk space" + +msgctxt "#30075" +msgid "No PMT found" +msgstr "No PMT found" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/English (US)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/English (US)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/English (US)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/English (US)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: MediaPortal PVR Client +# Addon id: pvr.mediaportal.tvserver +# Addon Provider: Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (US) (http://www.transifex.com/projects/p/xbmc-main/language/en_US/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_US\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30042" +msgid "Playback" +msgstr "Playback" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Estonian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Estonian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Estonian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Estonian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,165 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Estonian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/et/)\n" +"Language-Team: Estonian (http://www.transifex.com/projects/p/xbmc-main/language/et/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: et\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "Mediaportal Hostname" +msgstr "Mediaportal hosti nimi" + +msgctxt "#30001" +msgid "Mediaportal XBMC plugin Port" +msgstr "Mediaportal XBMC plugina port" + +msgctxt "#30002" +msgid "Free-to-air only" +msgstr "Ainult vabalevi" + +msgctxt "#30003" +msgid "Include Radio" +msgstr "Hõlma raadio" + +msgctxt "#30004" +msgid "Fast channel switching (don't stop timeshift)" +msgstr "Kiire kanali vahetus (ära peata ajanihutust)" + +msgctxt "#30005" +msgid "Connect timeout (s)" +msgstr "Ühenduse aegumine (s)" + +msgctxt "#30006" +msgid "Import only TV Channels from group" +msgstr "Impordi grupist ainult TV kanalid" + +msgctxt "#30007" +msgid "Import only Radio Channels from group" +msgstr "Impordi grupist ainult raadio kanalid" + +msgctxt "#30008" +msgid "Convert hostname to IP-adress" +msgstr "Muuda hosti nimi IP aadressiks" + +msgctxt "#30009" +msgid "EPG: Read genre strings (slow)" +msgstr "EPG: Loe žanri stringid (aeglane)" + +msgctxt "#30010" +msgid "Wait time after tuning a channel (ms)" +msgstr "Viivitus peale häälestust (ms)" + +msgctxt "#30015" +msgid "Streaming method" +msgstr "Voogesitus meetod" + +msgctxt "#30016" +msgid "Windows user account (SMB)" +msgstr "Windowsi kasutaja konto (SMB)" + +msgctxt "#30017" +msgid "Windows password (SMB)" +msgstr "Windowsi salasõna (SMB)" + +msgctxt "#30018" +msgid "Use RTSP streaming" +msgstr "Kasuta RTSP voogesitust" + +msgctxt "#30040" +msgid "Connection" +msgstr "Ühendus" + +msgctxt "#30041" +msgid "MediaPortal" +msgstr "MediaPortal" + msgctxt "#30042" msgid "Playback" msgstr "Taasesitus" + +msgctxt "#30050" +msgid "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" +msgstr "Sinu TVServerXBMC versioon '%s' on liiga vana. Palun uuenda '%s' või uuema peale!" + +msgctxt "#30051" +msgid "Your TVServerXBMC version is too old. Please upgrade to '%s' or higher!" +msgstr "Sinu TVServerXBMC versioon on liiga vana. Palun uuenda '%s' või uuema peale!" + +msgctxt "#30052" +msgid "Recording playback failed. Empty URL of filename." +msgstr "Salvestise esitlus nurjus. Tühi URL või faili nimi." + +msgctxt "#30060" +msgid "All cards are busy" +msgstr "Kõik kaardid on hõivatud" + +msgctxt "#30061" +msgid "Channel is scrambled" +msgstr "Kanal on krüpteeritud" + +msgctxt "#30062" +msgid "No video or audio detected" +msgstr "Videot ega heli ei leitud" + +msgctxt "#30063" +msgid "No signal detected" +msgstr "Signaali ei leitud" + +msgctxt "#30064" +msgid "Unknown error" +msgstr "Tundmatu tõrge" + +msgctxt "#30065" +msgid "Unable to start graph" +msgstr "Graafiku käivitamine nurjus" + +msgctxt "#30066" +msgid "Unknown channel" +msgstr "Tundmatu kanal" + +msgctxt "#30067" +msgid "No tuning details" +msgstr "Häälestuse detailid puuduvad" + +msgctxt "#30068" +msgid "Channel is not mapped to any card" +msgstr "Kanal pole ühegi kaardiga seotud" + +msgctxt "#30069" +msgid "Card is disabled" +msgstr "Kaart on keelatud" + +msgctxt "#30070" +msgid "Connection to slave failed" +msgstr "Alluvaga ühenduse loomine nurjus" + +msgctxt "#30071" +msgid "Not the owner" +msgstr "Ei ole omanik" + +msgctxt "#30072" +msgid "Graph building failed" +msgstr "Graafiku ehitamine nurjus" + +msgctxt "#30073" +msgid "SW Encoder missing" +msgstr "Tarkvaraline kodeerija puudub" + +msgctxt "#30074" +msgid "No free disk space" +msgstr "Kettaruum on otsas" + +msgctxt "#30075" +msgid "No PMT found" +msgstr "PMT ei leitud" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Faroese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Faroese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Faroese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Faroese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: MediaPortal PVR Client +# Addon id: pvr.mediaportal.tvserver +# Addon Provider: Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Faroese (http://www.transifex.com/projects/p/xbmc-main/language/fo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30042" +msgid "Playback" +msgstr "Avspæling" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Finnish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Finnish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Finnish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Finnish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Finnish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fi/)\n" +"Language-Team: Finnish (http://www.transifex.com/projects/p/xbmc-main/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/French/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/French/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/French/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/French/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: French (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fr/)\n" +"Language-Team: French (http://www.transifex.com/projects/p/xbmc-main/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/French (Canada)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/French (Canada)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/French (Canada)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/French (Canada)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,165 @@ +# XBMC Media Center language file +# Addon Name: MediaPortal PVR Client +# Addon id: pvr.mediaportal.tvserver +# Addon Provider: Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: French (Canada) (http://www.transifex.com/projects/p/xbmc-main/language/fr_CA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_CA\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "Mediaportal Hostname" +msgstr "Nom d'hôte de MediaPortal" + +msgctxt "#30001" +msgid "Mediaportal XBMC plugin Port" +msgstr "Port du plugiciel XBMC de MediaPortal" + +msgctxt "#30002" +msgid "Free-to-air only" +msgstr "Diffusé en clair uniquement" + +msgctxt "#30003" +msgid "Include Radio" +msgstr "Inclure la radio" + +msgctxt "#30004" +msgid "Fast channel switching (don't stop timeshift)" +msgstr "Changement rapide des chaînes (ne pas arrêter le décalage temporel)" + +msgctxt "#30005" +msgid "Connect timeout (s)" +msgstr "Délai d'attente de connexion (s)" + +msgctxt "#30006" +msgid "Import only TV Channels from group" +msgstr "Importer seulement les chaînes télé du groupe" + +msgctxt "#30007" +msgid "Import only Radio Channels from group" +msgstr "Importer seulement les chaînes radio du groupe" + +msgctxt "#30008" +msgid "Convert hostname to IP-adress" +msgstr "Convertir le nom d'hôte en adresse IP" + +msgctxt "#30009" +msgid "EPG: Read genre strings (slow)" +msgstr "GÉP : lire les données de genre (lent)" + +msgctxt "#30010" +msgid "Wait time after tuning a channel (ms)" +msgstr "Temps d'attente après changement de chaîne (ms)" + +msgctxt "#30015" +msgid "Streaming method" +msgstr "Méthode de lecture en transit" + +msgctxt "#30016" +msgid "Windows user account (SMB)" +msgstr "Compte utilisateur Windows (SMB)" + +msgctxt "#30017" +msgid "Windows password (SMB)" +msgstr "Mot de passe Windows (SMB)" + +msgctxt "#30018" +msgid "Use RTSP streaming" +msgstr "Utiliser la lecture en transit RTSP" + +msgctxt "#30040" +msgid "Connection" +msgstr "Connexion" + +msgctxt "#30041" +msgid "MediaPortal" +msgstr "MediaPortal" + +msgctxt "#30042" +msgid "Playback" +msgstr "Lecture" + +msgctxt "#30050" +msgid "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" +msgstr "Votre version « %s » de TVServerXBMC est trop ancienne. Veuillez mettre à niveau vers « %s » ou ultérieure!" + +msgctxt "#30051" +msgid "Your TVServerXBMC version is too old. Please upgrade to '%s' or higher!" +msgstr "Votre version de TVServerXBMC est trop ancienne. Veuillez mettre à niveau vers « %s » ou ultérieure!" + +msgctxt "#30052" +msgid "Recording playback failed. Empty URL of filename." +msgstr "La lecture de l'enregistrement a échoué. L'URL du nom de fichier est vide." + +msgctxt "#30060" +msgid "All cards are busy" +msgstr "Toutes les cartes sont occupées" + +msgctxt "#30061" +msgid "Channel is scrambled" +msgstr "La chaîne est brouillée" + +msgctxt "#30062" +msgid "No video or audio detected" +msgstr "Aucun vidéo ou audio détecté" + +msgctxt "#30063" +msgid "No signal detected" +msgstr "Aucun signal détecté" + +msgctxt "#30064" +msgid "Unknown error" +msgstr "Erreur inconnue" + +msgctxt "#30065" +msgid "Unable to start graph" +msgstr "Impossible de démarrer le graphe" + +msgctxt "#30066" +msgid "Unknown channel" +msgstr "Chaîne inconnue" + +msgctxt "#30067" +msgid "No tuning details" +msgstr "Aucun détail de syntonisation" + +msgctxt "#30068" +msgid "Channel is not mapped to any card" +msgstr "La chaîne n'est mappée à aucune carte" + +msgctxt "#30069" +msgid "Card is disabled" +msgstr "La carte est désactivée" + +msgctxt "#30070" +msgid "Connection to slave failed" +msgstr "Échec de connexion à l'esclave" + +msgctxt "#30071" +msgid "Not the owner" +msgstr "Pas le propriétaire" + +msgctxt "#30072" +msgid "Graph building failed" +msgstr "Échec de montage des graphes" + +msgctxt "#30073" +msgid "SW Encoder missing" +msgstr "Encodeur SW manquant" + +msgctxt "#30074" +msgid "No free disk space" +msgstr "Aucun espace disque libre" + +msgctxt "#30075" +msgid "No PMT found" +msgstr "Aucun PMT trouvé" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Galician/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Galician/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Galician/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Galician/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Galician (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/gl/)\n" +"Language-Team: Galician (http://www.transifex.com/projects/p/xbmc-main/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -55,7 +54,7 @@ msgctxt "#30009" msgid "EPG: Read genre strings (slow)" -msgstr "EPG: ler as cadeas de xénero (lento)" +msgstr "Guía: ler as cadeas de xénero (lento)" msgctxt "#30010" msgid "Wait time after tuning a channel (ms)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Georgian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Georgian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Georgian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Georgian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,165 @@ +# XBMC Media Center language file +# Addon Name: MediaPortal PVR Client +# Addon id: pvr.mediaportal.tvserver +# Addon Provider: Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Georgian (http://www.transifex.com/projects/p/xbmc-main/language/ka/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ka\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mediaportal Hostname" +msgstr "Mediaportal-ის სერვერის სახელი" + +msgctxt "#30001" +msgid "Mediaportal XBMC plugin Port" +msgstr "Mediaportal XBMC ჩადგმის პორტი" + +msgctxt "#30002" +msgid "Free-to-air only" +msgstr "მხოლოდ უფასო არხები" + +msgctxt "#30003" +msgid "Include Radio" +msgstr "რადიოს ჩათვლით" + +msgctxt "#30004" +msgid "Fast channel switching (don't stop timeshift)" +msgstr "არხების სწრაფი გადართვა (არ აჩერებს დროში გადაადგილებას)" + +msgctxt "#30005" +msgid "Connect timeout (s)" +msgstr "შეერთების დაყოვნება(ები)" + +msgctxt "#30006" +msgid "Import only TV Channels from group" +msgstr "სატელევიზიო არხების მხოლოდ ამ ჯუფიდან შემოტანა" + +msgctxt "#30007" +msgid "Import only Radio Channels from group" +msgstr "რადიო არხების მხოლოდ ამ ჯგუფიდან შემოტანა" + +msgctxt "#30008" +msgid "Convert hostname to IP-adress" +msgstr "სერვერის სახელის IP მისამართში გადაყვანა" + +msgctxt "#30009" +msgid "EPG: Read genre strings (slow)" +msgstr "EPG: ჟანრების სტრიქონების წაკითხვა (ნელი)" + +msgctxt "#30010" +msgid "Wait time after tuning a channel (ms)" +msgstr "არხზე გადართვიდან მოლოდინის დრო (მილიწამი)" + +msgctxt "#30015" +msgid "Streaming method" +msgstr "სტრიმინგის მეთოდი" + +msgctxt "#30016" +msgid "Windows user account (SMB)" +msgstr "Windows-ის მომხმარებლის ანგარიში (SMB)" + +msgctxt "#30017" +msgid "Windows password (SMB)" +msgstr "Windows-ის პაროლი (SMB)" + +msgctxt "#30018" +msgid "Use RTSP streaming" +msgstr "RTSP სტრიმინგის გამოყენება" + +msgctxt "#30040" +msgid "Connection" +msgstr "შეერთება" + +msgctxt "#30041" +msgid "MediaPortal" +msgstr "MediaPortal" + +msgctxt "#30042" +msgid "Playback" +msgstr "დაკვრა" + +msgctxt "#30050" +msgid "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" +msgstr "თქვენი TVServerXBMC ვერსია '%s' ძალიან ძველია. გთხოვთ განაახლოთ '%s' ან უფრო ახალ ვერსიამდე." + +msgctxt "#30051" +msgid "Your TVServerXBMC version is too old. Please upgrade to '%s' or higher!" +msgstr "თქვენი TVServerXBMC ვერსია ძალიან ძველია. გთხოვთ განაახლოთ '%s' ან უფრო ახალ ვერსიამდე." + +msgctxt "#30052" +msgid "Recording playback failed. Empty URL of filename." +msgstr "ჩანაწერის დაკვრა შეუძლებელია. ცარიელი URL ან ფაილის სახელი." + +msgctxt "#30060" +msgid "All cards are busy" +msgstr "ყველა ბარათი დაკავებულია" + +msgctxt "#30061" +msgid "Channel is scrambled" +msgstr "არხი დაშიფრულია" + +msgctxt "#30062" +msgid "No video or audio detected" +msgstr "არ არის ვიდეო ან აუდიო" + +msgctxt "#30063" +msgid "No signal detected" +msgstr "არ არის სიგნალი" + +msgctxt "#30064" +msgid "Unknown error" +msgstr "უცნობი შეცდომა" + +msgctxt "#30065" +msgid "Unable to start graph" +msgstr "გრაფი ვერ ჩაირთო" + +msgctxt "#30066" +msgid "Unknown channel" +msgstr "უცნობი არხი" + +msgctxt "#30067" +msgid "No tuning details" +msgstr "არ არის ტუნერის დეტალები" + +msgctxt "#30068" +msgid "Channel is not mapped to any card" +msgstr "არხი არ არის მიბმული არც ერთ ბარათზე" + +msgctxt "#30069" +msgid "Card is disabled" +msgstr "ბარათი გამორთულია" + +msgctxt "#30070" +msgid "Connection to slave failed" +msgstr "ქვემდომთან კავშირი ვერ შედგა" + +msgctxt "#30071" +msgid "Not the owner" +msgstr "არ არის მეპატრონე" + +msgctxt "#30072" +msgid "Graph building failed" +msgstr "გრაფის შექმნა შეუძლებელია" + +msgctxt "#30073" +msgid "SW Encoder missing" +msgstr "არ არის SW კოდერი" + +msgctxt "#30074" +msgid "No free disk space" +msgstr "არ არის ცარიელი ადგილი" + +msgctxt "#30075" +msgid "No PMT found" +msgstr "არ არის PMT" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/German/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/German/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/German/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/German/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: German (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/de/)\n" +"Language-Team: German (http://www.transifex.com/projects/p/xbmc-main/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,7 +18,7 @@ msgctxt "#30000" msgid "Mediaportal Hostname" -msgstr "Mediaportal Hostname oder IP" +msgstr "Mediaportal Hostname oder IP-Adresse" msgctxt "#30001" msgid "Mediaportal XBMC plugin Port" @@ -39,7 +38,7 @@ msgctxt "#30005" msgid "Connect timeout (s)" -msgstr "Verbindungszeitüberlauf (s)" +msgstr "Verbindungs-Timeout (s)" msgctxt "#30006" msgid "Import only TV Channels from group" @@ -51,11 +50,11 @@ msgctxt "#30008" msgid "Convert hostname to IP-adress" -msgstr "Konvertiere Hostname nach IP-Adresse" +msgstr "Übersetze Hostname zu IP-Adresse" msgctxt "#30009" msgid "EPG: Read genre strings (slow)" -msgstr "EPG: Genre Texte hochladen (langsam)" +msgstr "EPG: Genre Texte lesen (langsam)" msgctxt "#30010" msgid "Wait time after tuning a channel (ms)" @@ -91,15 +90,15 @@ msgctxt "#30050" msgid "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" -msgstr "Ihre TVServerXBMC plugin '%s' ist zu alt. Sie brauchen mindestens Version '%s'!" +msgstr "Dein TVServerXBMC plugin '%s' ist zu alt. Du brauchst mindestens Version '%s'!" msgctxt "#30051" msgid "Your TVServerXBMC version is too old. Please upgrade to '%s' or higher!" -msgstr "Ihre TVServerXBMC plugin Version ist zu alt. Sie brauchen mindestens Version '%s'!" +msgstr "Dein TVServerXBMC plugin ist zu alt. Du brauchst mindestens Version '%s'!" msgctxt "#30052" msgid "Recording playback failed. Empty URL of filename." -msgstr "Aufnahme fehlgeschlagen. Leere URL oder Dateiname." +msgstr "Aufnahme-Wiedergabe fehlgeschlagen. Leere URL oder Dateiname." msgctxt "#30060" msgid "All cards are busy" @@ -147,7 +146,7 @@ msgctxt "#30071" msgid "Not the owner" -msgstr "Kein Besitzer" +msgstr "Nicht der Besitzer" msgctxt "#30072" msgid "Graph building failed" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Greek/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Greek/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Greek/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Greek/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Greek (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/el/)\n" +"Language-Team: Greek (http://www.transifex.com/projects/p/xbmc-main/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Hebrew/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Hebrew/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Hebrew/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Hebrew/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hebrew (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/he/)\n" +"Language-Team: Hebrew (http://www.transifex.com/projects/p/xbmc-main/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Hindi (Devanagiri)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Hindi (Devanagiri)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Hindi (Devanagiri)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Hindi (Devanagiri)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hindi (Devanagiri) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/hi/)\n" +"Language-Team: Hindi (Devanagiri) (http://www.transifex.com/projects/p/xbmc-main/language/hi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Hungarian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Hungarian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Hungarian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Hungarian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hungarian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/hu/)\n" +"Language-Team: Hungarian (http://www.transifex.com/projects/p/xbmc-main/language/hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Icelandic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Icelandic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Icelandic/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Icelandic/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Icelandic (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/is/)\n" +"Language-Team: Icelandic (http://www.transifex.com/projects/p/xbmc-main/language/is/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Indonesian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Indonesian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Indonesian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Indonesian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,165 @@ +# XBMC Media Center language file +# Addon Name: MediaPortal PVR Client +# Addon id: pvr.mediaportal.tvserver +# Addon Provider: Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Indonesian (http://www.transifex.com/projects/p/xbmc-main/language/id/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mediaportal Hostname" +msgstr "Hostname Mediaportal" + +msgctxt "#30001" +msgid "Mediaportal XBMC plugin Port" +msgstr "Port plugin Mediaportal XBMC" + +msgctxt "#30002" +msgid "Free-to-air only" +msgstr "Siaran yang gratis saja." + +msgctxt "#30003" +msgid "Include Radio" +msgstr "Mencakup Radio" + +msgctxt "#30004" +msgid "Fast channel switching (don't stop timeshift)" +msgstr "Pemindahan kanal secara cepat (Jangan hentikan timeshift)" + +msgctxt "#30005" +msgid "Connect timeout (s)" +msgstr "Timeout koneksi (s)" + +msgctxt "#30006" +msgid "Import only TV Channels from group" +msgstr "Hanya impor kanal TV dari group" + +msgctxt "#30007" +msgid "Import only Radio Channels from group" +msgstr "Hanya impor kanal radio dari group" + +msgctxt "#30008" +msgid "Convert hostname to IP-adress" +msgstr "Rubah hostname menjadi alamat IP" + +msgctxt "#30009" +msgid "EPG: Read genre strings (slow)" +msgstr "EPG: Baca informasi genre (lambat)" + +msgctxt "#30010" +msgid "Wait time after tuning a channel (ms)" +msgstr "Waktu tunggu setelah setel sebuah kanal (ms)" + +msgctxt "#30015" +msgid "Streaming method" +msgstr "Metode aliran" + +msgctxt "#30016" +msgid "Windows user account (SMB)" +msgstr "Akun pengguna WIndows (SMB)" + +msgctxt "#30017" +msgid "Windows password (SMB)" +msgstr "Kata sandi Windows (SMB)" + +msgctxt "#30018" +msgid "Use RTSP streaming" +msgstr "Gunakan pengaliran RTSP" + +msgctxt "#30040" +msgid "Connection" +msgstr "Koneksi" + +msgctxt "#30041" +msgid "MediaPortal" +msgstr "MediaPortal" + +msgctxt "#30042" +msgid "Playback" +msgstr "Playback" + +msgctxt "#30050" +msgid "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" +msgstr "TVServerXBMC anda dengan versi '%s' terlalu tua. Silahkan upgrade ke versi '%s' atau di atasnya!" + +msgctxt "#30051" +msgid "Your TVServerXBMC version is too old. Please upgrade to '%s' or higher!" +msgstr "Versi TVServerXBMC anda terlalu tua. Silahkan upgrade ke versi '%s' atau di atasnya!" + +msgctxt "#30052" +msgid "Recording playback failed. Empty URL of filename." +msgstr "Pemutaran rekaman gagal. URL berkas kosong." + +msgctxt "#30060" +msgid "All cards are busy" +msgstr "Semua kartu sedang sibuk." + +msgctxt "#30061" +msgid "Channel is scrambled" +msgstr "Kanal diacak" + +msgctxt "#30062" +msgid "No video or audio detected" +msgstr "Tidak ada video atau audio terdeteksi" + +msgctxt "#30063" +msgid "No signal detected" +msgstr "Tidak ada sinyal terdeteksi" + +msgctxt "#30064" +msgid "Unknown error" +msgstr "Error tidak dikenal" + +msgctxt "#30065" +msgid "Unable to start graph" +msgstr "Tidak dapat memulai grafis" + +msgctxt "#30066" +msgid "Unknown channel" +msgstr "Kanal tidak dikenal" + +msgctxt "#30067" +msgid "No tuning details" +msgstr "Tidak ada detil penyetelan" + +msgctxt "#30068" +msgid "Channel is not mapped to any card" +msgstr "Kanal tidak terpetakan ke satu kartupun" + +msgctxt "#30069" +msgid "Card is disabled" +msgstr "Kartu dinon-aktifkan" + +msgctxt "#30070" +msgid "Connection to slave failed" +msgstr "Koneksi ke slave gagal." + +msgctxt "#30071" +msgid "Not the owner" +msgstr "Bukan pemilik" + +msgctxt "#30072" +msgid "Graph building failed" +msgstr "Pembangunan grafis gagal" + +msgctxt "#30073" +msgid "SW Encoder missing" +msgstr "SW Encoder tidak ditemukan" + +msgctxt "#30074" +msgid "No free disk space" +msgstr "Tidak ada spasi disk kosong" + +msgctxt "#30075" +msgid "No PMT found" +msgstr "PMT tidak ditemukan" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Italian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Italian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Italian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Italian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Italian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/it/)\n" +"Language-Team: Italian (http://www.transifex.com/projects/p/xbmc-main/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Japanese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Japanese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Japanese/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Japanese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Japanese (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ja/)\n" +"Language-Team: Japanese (http://www.transifex.com/projects/p/xbmc-main/language/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -33,6 +32,10 @@ msgid "Include Radio" msgstr "ラジオも含める" +msgctxt "#30004" +msgid "Fast channel switching (don't stop timeshift)" +msgstr "高速チャンネルスイッチ(タイムシフトは止めない)" + msgctxt "#30005" msgid "Connect timeout (s)" msgstr "接続タイムアウト (秒)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Korean/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Korean/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Korean/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Korean/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Korean (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ko/)\n" +"Language-Team: Korean (http://www.transifex.com/projects/p/xbmc-main/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Latvian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Latvian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Latvian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Latvian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,73 @@ +# XBMC Media Center language file +# Addon Name: MediaPortal PVR Client +# Addon id: pvr.mediaportal.tvserver +# Addon Provider: Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Latvian (http://www.transifex.com/projects/p/xbmc-main/language/lv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +msgctxt "#30000" +msgid "Mediaportal Hostname" +msgstr "Mediaportal saimniekvārds" + +msgctxt "#30003" +msgid "Include Radio" +msgstr "Iekļaut radio" + +msgctxt "#30008" +msgid "Convert hostname to IP-adress" +msgstr "Pārvērst saimniekvārdu uz IP adresi" + +msgctxt "#30040" +msgid "Connection" +msgstr "Savienojums" + +msgctxt "#30041" +msgid "MediaPortal" +msgstr "MediaPortal" + +msgctxt "#30042" +msgid "Playback" +msgstr "Atskaņošana" + +msgctxt "#30060" +msgid "All cards are busy" +msgstr "Visas kartes ir aizņemtas" + +msgctxt "#30063" +msgid "No signal detected" +msgstr "Signāls nav atrasts" + +msgctxt "#30064" +msgid "Unknown error" +msgstr "Nezināma kļūda" + +msgctxt "#30066" +msgid "Unknown channel" +msgstr "Nezināms kanāls" + +msgctxt "#30067" +msgid "No tuning details" +msgstr "Nav uztveršanas detaļas" + +msgctxt "#30069" +msgid "Card is disabled" +msgstr "Karte ir izslēgta" + +msgctxt "#30071" +msgid "Not the owner" +msgstr "Nav īpašnieks" + +msgctxt "#30074" +msgid "No free disk space" +msgstr "Diskā nav brīvas vietas" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Lithuanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Lithuanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Lithuanian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Lithuanian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Lithuanian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/lt/)\n" +"Language-Team: Lithuanian (http://www.transifex.com/projects/p/xbmc-main/language/lt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Macedonian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Macedonian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Macedonian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Macedonian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Macedonian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/mk/)\n" +"Language-Team: Macedonian (http://www.transifex.com/projects/p/xbmc-main/language/mk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Malay/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Malay/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Malay/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Malay/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,165 @@ +# XBMC Media Center language file +# Addon Name: MediaPortal PVR Client +# Addon id: pvr.mediaportal.tvserver +# Addon Provider: Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Malay (http://www.transifex.com/projects/p/xbmc-main/language/ms/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mediaportal Hostname" +msgstr "Nama hos Mediaportal" + +msgctxt "#30001" +msgid "Mediaportal XBMC plugin Port" +msgstr "Port pemalam XBMC Mediaportal" + +msgctxt "#30002" +msgid "Free-to-air only" +msgstr "Free-to-air sahaja" + +msgctxt "#30003" +msgid "Include Radio" +msgstr "Sertakan Radio" + +msgctxt "#30004" +msgid "Fast channel switching (don't stop timeshift)" +msgstr "Pertukaran saluran pantas (tidak henti anjak masa)" + +msgctxt "#30005" +msgid "Connect timeout (s)" +msgstr "Had masa tamat sambung" + +msgctxt "#30006" +msgid "Import only TV Channels from group" +msgstr "Hanya import Saluran TV dari kumpulan" + +msgctxt "#30007" +msgid "Import only Radio Channels from group" +msgstr "Hanya import Saluran Radio dari kumpulan" + +msgctxt "#30008" +msgid "Convert hostname to IP-adress" +msgstr "Tukar nama hos ke alamat-IP" + +msgctxt "#30009" +msgid "EPG: Read genre strings (slow)" +msgstr "EPG: Baca rentetan genre (perlahan)" + +msgctxt "#30010" +msgid "Wait time after tuning a channel (ms)" +msgstr "Tunggu masa selepas menala saluran (ms)" + +msgctxt "#30015" +msgid "Streaming method" +msgstr "Kaedah penstriman" + +msgctxt "#30016" +msgid "Windows user account (SMB)" +msgstr "Akaun pengguna Windows (SMB)" + +msgctxt "#30017" +msgid "Windows password (SMB)" +msgstr "Kata laluan Windows (SMB)" + +msgctxt "#30018" +msgid "Use RTSP streaming" +msgstr "Guna penstriman RTSP" + +msgctxt "#30040" +msgid "Connection" +msgstr "Sambungan" + +msgctxt "#30041" +msgid "MediaPortal" +msgstr "MediaPortal" + +msgctxt "#30042" +msgid "Playback" +msgstr "Main Balik" + +msgctxt "#30050" +msgid "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" +msgstr "TVServerXBMC versi '%s' anda terlalu tua. Sila kemaskini ke '%s' atau lebih baharu!" + +msgctxt "#30051" +msgid "Your TVServerXBMC version is too old. Please upgrade to '%s' or higher!" +msgstr "TVServerXBMC versi anda terlalu tua. Sila kemaskini ke '%s' atau lebih baharu!" + +msgctxt "#30052" +msgid "Recording playback failed. Empty URL of filename." +msgstr "Main balik rakaman gagal. URL nama fail kosong." + +msgctxt "#30060" +msgid "All cards are busy" +msgstr "Semua kad sibuk" + +msgctxt "#30061" +msgid "Channel is scrambled" +msgstr "Saluran bercelaru" + +msgctxt "#30062" +msgid "No video or audio detected" +msgstr "Tiada video atau audio dikesan" + +msgctxt "#30063" +msgid "No signal detected" +msgstr "Tiada isyarat dikesan" + +msgctxt "#30064" +msgid "Unknown error" +msgstr "Ralat tidak diketahui" + +msgctxt "#30065" +msgid "Unable to start graph" +msgstr "Tidak boleh mulakan graf" + +msgctxt "#30066" +msgid "Unknown channel" +msgstr "Saluran tidak diketahui" + +msgctxt "#30067" +msgid "No tuning details" +msgstr "Tiada perincian penalaan" + +msgctxt "#30068" +msgid "Channel is not mapped to any card" +msgstr "Saluran tidak dipetakan ke mana-mana kad" + +msgctxt "#30069" +msgid "Card is disabled" +msgstr "Kad dilumpuhkan" + +msgctxt "#30070" +msgid "Connection to slave failed" +msgstr "Sambungan ke hamba gagal" + +msgctxt "#30071" +msgid "Not the owner" +msgstr "Bukan pemilik" + +msgctxt "#30072" +msgid "Graph building failed" +msgstr "Pembinaan kad gagal" + +msgctxt "#30073" +msgid "SW Encoder missing" +msgstr "Pengekod SW hilang" + +msgctxt "#30074" +msgid "No free disk space" +msgstr "Tiada ruang cakera bebas" + +msgctxt "#30075" +msgid "No PMT found" +msgstr "Tiada PMT ditemui" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Maori/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Maori/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Maori/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Maori/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: MediaPortal PVR Client +# Addon id: pvr.mediaportal.tvserver +# Addon Provider: Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Maori (http://www.transifex.com/projects/p/xbmc-main/language/mi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mi\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30042" +msgid "Playback" +msgstr "Pūrei anō" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Norwegian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Norwegian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Norwegian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Norwegian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,34 +1,165 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Norwegian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/no/)\n" +"Language-Team: Norwegian (http://www.transifex.com/projects/p/xbmc-main/language/no/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: no\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "Mediaportal Hostname" +msgstr "MediaPortal vertsnavn" + +msgctxt "#30001" +msgid "Mediaportal XBMC plugin Port" +msgstr "MediaPortal XBMC plugin port" + +msgctxt "#30002" +msgid "Free-to-air only" +msgstr "Kun gratis kanaler" + msgctxt "#30003" msgid "Include Radio" msgstr "Inkluder radio" +msgctxt "#30004" +msgid "Fast channel switching (don't stop timeshift)" +msgstr "Kjapp kanalskifte(ikke stopp timeshift)" + +msgctxt "#30005" +msgid "Connect timeout (s)" +msgstr "Tilkobling tidsavbrudd(er)" + +msgctxt "#30006" +msgid "Import only TV Channels from group" +msgstr "Importer kun TV kanaler fra gruppe" + +msgctxt "#30007" +msgid "Import only Radio Channels from group" +msgstr "Importer kun Radio kanaler fra gruppe" + +msgctxt "#30008" +msgid "Convert hostname to IP-adress" +msgstr "Konverter vertsnavn til Ip-adresse" + +msgctxt "#30009" +msgid "EPG: Read genre strings (slow)" +msgstr "EPG: Les sjanger (treg)" + +msgctxt "#30010" +msgid "Wait time after tuning a channel (ms)" +msgstr "Tid å vente etter lasting av kanal (ms)" + +msgctxt "#30015" +msgid "Streaming method" +msgstr "Streming metode" + +msgctxt "#30016" +msgid "Windows user account (SMB)" +msgstr "Windows bruker konto (SMB)" + +msgctxt "#30017" +msgid "Windows password (SMB)" +msgstr "Windows bruker passord (SMB)" + +msgctxt "#30018" +msgid "Use RTSP streaming" +msgstr "Bruk RTSP streaming" + +msgctxt "#30040" +msgid "Connection" +msgstr "Tilkobling" + +msgctxt "#30041" +msgid "MediaPortal" +msgstr "MediaPortal" + msgctxt "#30042" msgid "Playback" msgstr "Avspilling" +msgctxt "#30050" +msgid "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" +msgstr "Din TVServerXBMC versjon '%s' er for gammel. Oppgrader til '%s' eller høyere!" + +msgctxt "#30051" +msgid "Your TVServerXBMC version is too old. Please upgrade to '%s' or higher!" +msgstr "Din TVServerXBMC versjon er for gammel. Oppgrader til '%s' eller høyere!" + +msgctxt "#30052" +msgid "Recording playback failed. Empty URL of filename." +msgstr "Avspilling av opptak feilet. URL eller filnavn mangler." + +msgctxt "#30060" +msgid "All cards are busy" +msgstr "Alle kort er opptatt" + +msgctxt "#30061" +msgid "Channel is scrambled" +msgstr "Kanal er kodet" + +msgctxt "#30062" +msgid "No video or audio detected" +msgstr "Finner ingen video eller lyd" + +msgctxt "#30063" +msgid "No signal detected" +msgstr "Ingen signal funnet" + msgctxt "#30064" msgid "Unknown error" msgstr "Ukjent feil" +msgctxt "#30065" +msgid "Unable to start graph" +msgstr "Kan ikke starte graf" + msgctxt "#30066" msgid "Unknown channel" msgstr "Ukjent kanal" + +msgctxt "#30067" +msgid "No tuning details" +msgstr "Ingen tuning detaljer" + +msgctxt "#30068" +msgid "Channel is not mapped to any card" +msgstr "Kanal er ikke mappet til noe kort" + +msgctxt "#30069" +msgid "Card is disabled" +msgstr "Kort er deaktivert" + +msgctxt "#30070" +msgid "Connection to slave failed" +msgstr "Tilkobling til slave feilet" + +msgctxt "#30071" +msgid "Not the owner" +msgstr "Ikke eieren" + +msgctxt "#30072" +msgid "Graph building failed" +msgstr "Graf bygging feilet" + +msgctxt "#30073" +msgid "SW Encoder missing" +msgstr "SW Encoder mangler" + +msgctxt "#30074" +msgid "No free disk space" +msgstr "Ikke nok ledig lagringsplass" + +msgctxt "#30075" +msgid "No PMT found" +msgstr "Fant ikke PMT" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Persian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Persian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Persian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Persian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Persian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fa/)\n" +"Language-Team: Persian (http://www.transifex.com/projects/p/xbmc-main/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Persian (Iran)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Persian (Iran)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Persian (Iran)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Persian (Iran)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: MediaPortal PVR Client +# Addon id: pvr.mediaportal.tvserver +# Addon Provider: Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Persian (Iran) (http://www.transifex.com/projects/p/xbmc-main/language/fa_IR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa_IR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30042" +msgid "Playback" +msgstr "پخش" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Polish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Polish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Polish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Polish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Polish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pl/)\n" +"Language-Team: Polish (http://www.transifex.com/projects/p/xbmc-main/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -23,7 +22,7 @@ msgctxt "#30001" msgid "Mediaportal XBMC plugin Port" -msgstr "Port pluginu Mediaportal XBMC" +msgstr "Port dodatku Mediaportal XBMC" msgctxt "#30002" msgid "Free-to-air only" @@ -99,11 +98,11 @@ msgctxt "#30052" msgid "Recording playback failed. Empty URL of filename." -msgstr "Odtwarzanie nagrania nie powiodło się. Adres URL lub nazwa pliku są puste." +msgstr "Odtwarzanie nagrania nie powiodło się. Adres URL lub nazwa pliku są nieprawidłowe." msgctxt "#30060" msgid "All cards are busy" -msgstr "Wszystkie karty są zajęty" +msgstr "Wszystkie karty są zajęte" msgctxt "#30061" msgid "Channel is scrambled" @@ -155,7 +154,7 @@ msgctxt "#30073" msgid "SW Encoder missing" -msgstr "Brak dekoder SW" +msgstr "Brak dekodera programowego" msgctxt "#30074" msgid "No free disk space" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Portuguese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Portuguese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Portuguese/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Portuguese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Portuguese (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pt/)\n" +"Language-Team: Portuguese (http://www.transifex.com/projects/p/xbmc-main/language/pt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Portuguese (Brazil)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Portuguese (Brazil)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Portuguese (Brazil)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Portuguese (Brazil)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pt_BR/)\n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/xbmc-main/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Romanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Romanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Romanian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Romanian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Romanian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ro/)\n" +"Language-Team: Romanian (http://www.transifex.com/projects/p/xbmc-main/language/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Russian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Russian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Russian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Russian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Russian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ru/)\n" +"Language-Team: Russian (http://www.transifex.com/projects/p/xbmc-main/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Serbian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Serbian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Serbian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Serbian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,29 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Serbian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sr/)\n" +"Language-Team: Serbian (http://www.transifex.com/projects/p/xbmc-main/language/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +msgctxt "#30003" +msgid "Include Radio" +msgstr "Укључи радио" + +msgctxt "#30005" +msgid "Connect timeout (s)" +msgstr "Истек времена за повезивање (с)" + msgctxt "#30042" msgid "Playback" msgstr "Reprodukcija" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Serbian (Cyrillic)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Serbian (Cyrillic)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Serbian (Cyrillic)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Serbian (Cyrillic)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Serbian (Cyrillic) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sr_RS/)\n" +"Language-Team: Serbian (Cyrillic) (http://www.transifex.com/projects/p/xbmc-main/language/sr_RS/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Slovak/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Slovak/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Slovak/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Slovak/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Slovak (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sk/)\n" +"Language-Team: Slovak (http://www.transifex.com/projects/p/xbmc-main/language/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Slovenian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Slovenian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Slovenian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Slovenian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Slovenian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sl/)\n" +"Language-Team: Slovenian (http://www.transifex.com/projects/p/xbmc-main/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -35,11 +34,11 @@ msgctxt "#30004" msgid "Fast channel switching (don't stop timeshift)" -msgstr "Hitro preklapljanje (ne ustavi timeshift)" +msgstr "Hitro preklapljanje (ne ustavi časovnega zamika)" msgctxt "#30005" msgid "Connect timeout (s)" -msgstr "Najdaljši čas povezave (s)" +msgstr "Časovni pretek povezave (s)" msgctxt "#30006" msgid "Import only TV Channels from group" @@ -91,11 +90,11 @@ msgctxt "#30050" msgid "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" -msgstr "Vaša različica TVServerXBMC '%s' je prestara. Posodobite na '%s' ali novejše!" +msgstr "Vaša različica TVServerXBMC-ja '%s' je prestara. Posodobite na '%s' ali novejše!" msgctxt "#30051" msgid "Your TVServerXBMC version is too old. Please upgrade to '%s' or higher!" -msgstr "Vaša različica TVServerXBMC je prestara. Posodobite na '%s' ali novejše!" +msgstr "Vaša različica TVServerXBMC-ja je prestara. Posodobite na '%s' ali novejše!" msgctxt "#30052" msgid "Recording playback failed. Empty URL of filename." @@ -139,7 +138,7 @@ msgctxt "#30069" msgid "Card is disabled" -msgstr "Kartica je izključena" +msgstr "Kartica je onemogočena" msgctxt "#30070" msgid "Connection to slave failed" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Spanish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Spanish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Spanish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Spanish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es/)\n" +"Language-Team: Spanish (http://www.transifex.com/projects/p/xbmc-main/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Spanish (Argentina)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Spanish (Argentina)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Spanish (Argentina)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Spanish (Argentina)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es_AR/)\n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/xbmc-main/language/es_AR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Spanish (Mexico)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Spanish (Mexico)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Spanish (Mexico)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Spanish (Mexico)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es_MX/)\n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/xbmc-main/language/es_MX/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Swedish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Swedish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Swedish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Swedish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Swedish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sv/)\n" +"Language-Team: Swedish (http://www.transifex.com/projects/p/xbmc-main/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Tajik/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Tajik/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Tajik/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Tajik/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: MediaPortal PVR Client +# Addon id: pvr.mediaportal.tvserver +# Addon Provider: Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Tajik (http://www.transifex.com/projects/p/xbmc-main/language/tg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30042" +msgid "Playback" +msgstr "Пахш" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Tamil (India)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Tamil (India)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Tamil (India)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Tamil (India)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,165 @@ +# XBMC Media Center language file +# Addon Name: MediaPortal PVR Client +# Addon id: pvr.mediaportal.tvserver +# Addon Provider: Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Tamil (India) (http://www.transifex.com/projects/p/xbmc-main/language/ta_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "Mediaportal Hostname" +msgstr "Mediaportal புரவன்பெயர்" + +msgctxt "#30001" +msgid "Mediaportal XBMC plugin Port" +msgstr "Mediaportal XBMC செருகுநிரல் துறை" + +msgctxt "#30002" +msgid "Free-to-air only" +msgstr "இலவச ஒலிபரப்பிருக்கு மட்டுமே" + +msgctxt "#30003" +msgid "Include Radio" +msgstr "வானொலி உள்ளடக்கு" + +msgctxt "#30004" +msgid "Fast channel switching (don't stop timeshift)" +msgstr "வேகமாக சேனல் மாற்றுதல் (நேர மாற்றத்தை தடுக்க வேண்டாம்)" + +msgctxt "#30005" +msgid "Connect timeout (s)" +msgstr "இணைப்பு காலாவதி (நொடி)" + +msgctxt "#30006" +msgid "Import only TV Channels from group" +msgstr "குழுக்களில் இருந்து தொலைக்காட்சி சேனல்களை மட்டுமே இறக்குமதி செய்" + +msgctxt "#30007" +msgid "Import only Radio Channels from group" +msgstr "குழுக்களில் இருந்து வானொலி சேனல்களை மட்டுமே இறக்குமதி செய்" + +msgctxt "#30008" +msgid "Convert hostname to IP-adress" +msgstr "புரவலன் பெயரை ஐபி முகவரியாக மாற்று" + +msgctxt "#30009" +msgid "EPG: Read genre strings (slow)" +msgstr "EPG: வகை சரங்களை (மெதுவாக) படி" + +msgctxt "#30010" +msgid "Wait time after tuning a channel (ms)" +msgstr "ஒரு சேனலை டியூன் செய்தபின் காத்திருக்கும் நேரம் (ms)" + +msgctxt "#30015" +msgid "Streaming method" +msgstr "ஒலிப்பேழைதொடர் முறை" + +msgctxt "#30016" +msgid "Windows user account (SMB)" +msgstr "சாளரம் பயனர் விவரங்கள் (SMB)" + +msgctxt "#30017" +msgid "Windows password (SMB)" +msgstr "சாளரம் கடவுச்சொல் (SMB)" + +msgctxt "#30018" +msgid "Use RTSP streaming" +msgstr "RTSP ஒலிப்பேழைதொடர் பயன்படுத்த" + +msgctxt "#30040" +msgid "Connection" +msgstr "இணைப்பு" + +msgctxt "#30041" +msgid "MediaPortal" +msgstr "ஊடக போர்ட்டல்" + +msgctxt "#30042" +msgid "Playback" +msgstr "பின்னணி" + +msgctxt "#30050" +msgid "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" +msgstr "உங்கள் TVServerXBMC பதிப்பு '%s' மிகவும் பழமையானது. தயவுகூர்ந்து '%s' அல்லது அதற்க்கு மேல் உள்ளதை மேம்படுத்தவும்!" + +msgctxt "#30051" +msgid "Your TVServerXBMC version is too old. Please upgrade to '%s' or higher!" +msgstr "உங்கள் TVServerXBMC பதிப்பு மிகவும் பழமையானது. தயவுகூர்ந்து '%s' அல்லது அதற்க்கு மேல் உள்ளதை மேம்படுத்தவும்!" + +msgctxt "#30052" +msgid "Recording playback failed. Empty URL of filename." +msgstr "பதிவு பின்னணி தோல்வியடைந்தது. வெற்று கோப்பு URL." + +msgctxt "#30060" +msgid "All cards are busy" +msgstr "அனைத்து அட்டைகளும் வேலையாயிருக்கிறது" + +msgctxt "#30061" +msgid "Channel is scrambled" +msgstr "சேனல் சரியாக கிடைக்கவில்லை" + +msgctxt "#30062" +msgid "No video or audio detected" +msgstr " வீடியோ அல்லது ஆடியோ கண்டுபிடிக்கப்படவில்லை" + +msgctxt "#30063" +msgid "No signal detected" +msgstr "சேனல் சிக்னல் கண்டுபிடிக்கப்படவில்லை" + +msgctxt "#30064" +msgid "Unknown error" +msgstr "அறியப்படாத பிழை" + +msgctxt "#30065" +msgid "Unable to start graph" +msgstr "வரைபட தொடங்க முடியவில்லை" + +msgctxt "#30066" +msgid "Unknown channel" +msgstr "தெரியாத சேனல்" + +msgctxt "#30067" +msgid "No tuning details" +msgstr "சரிப்படுத்தும் விவரங்கள் இல்லை" + +msgctxt "#30068" +msgid "Channel is not mapped to any card" +msgstr "சேனல் எந்த அட்டைக்கும் பொருந்தவில்லை" + +msgctxt "#30069" +msgid "Card is disabled" +msgstr "அட்டை முடக்கப்பட்டுள்ளது" + +msgctxt "#30070" +msgid "Connection to slave failed" +msgstr "அடிமை இணைப்பு தோல்வியுற்றது" + +msgctxt "#30071" +msgid "Not the owner" +msgstr "உரிமையாளர் இல்லை" + +msgctxt "#30072" +msgid "Graph building failed" +msgstr "வரைபட கட்டுமான தோல்வி" + +msgctxt "#30073" +msgid "SW Encoder missing" +msgstr "SW என்கோடர் காணவில்லை" + +msgctxt "#30074" +msgid "No free disk space" +msgstr "வட்டில் காளி இடம் இல்லை" + +msgctxt "#30075" +msgid "No PMT found" +msgstr "ஒரு PMTகூட காணவில்லை!" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Thai/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Thai/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Thai/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Thai/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Thai (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/th/)\n" +"Language-Team: Thai (http://www.transifex.com/projects/p/xbmc-main/language/th/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Turkish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Turkish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Turkish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Turkish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,101 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Turkish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/tr/)\n" +"Language-Team: Turkish (http://www.transifex.com/projects/p/xbmc-main/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=1; plural=0;\n" +msgctxt "#30003" +msgid "Include Radio" +msgstr "Radyoları içe aktar" + +msgctxt "#30005" +msgid "Connect timeout (s)" +msgstr "Bağlantı süresi doldu (s)" + +msgctxt "#30006" +msgid "Import only TV Channels from group" +msgstr "Gruptan sadece TV Kanallarını içe aktar." + +msgctxt "#30007" +msgid "Import only Radio Channels from group" +msgstr "Gruptan sadece Radyo Kanallarını içe aktar." + +msgctxt "#30008" +msgid "Convert hostname to IP-adress" +msgstr "Ana bilgisayar adını IP adresine çevir" + +msgctxt "#30015" +msgid "Streaming method" +msgstr "Akış yöntemi" + +msgctxt "#30016" +msgid "Windows user account (SMB)" +msgstr "Windows kullanıcı hesabı (SMB)" + +msgctxt "#30017" +msgid "Windows password (SMB)" +msgstr "Windows parolası (SMB)" + +msgctxt "#30018" +msgid "Use RTSP streaming" +msgstr "RTSP akışını kullan" + +msgctxt "#30040" +msgid "Connection" +msgstr "Bağlantı" + msgctxt "#30042" msgid "Playback" msgstr "Oynatım" + +msgctxt "#30050" +msgid "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" +msgstr "TVServerXBMC '%s' sürümünüz çok eski. Lütfen '%s' veya üstüne güncelleyin!" + +msgctxt "#30060" +msgid "All cards are busy" +msgstr "Tüm kartlar meşgul" + +msgctxt "#30062" +msgid "No video or audio detected" +msgstr "Video veya ses tespit edilmedi" + +msgctxt "#30063" +msgid "No signal detected" +msgstr "Sinyal tespit edilmedi" + +msgctxt "#30064" +msgid "Unknown error" +msgstr "Bilinmeyen hata" + +msgctxt "#30066" +msgid "Unknown channel" +msgstr "Bilinmeyen kanal" + +msgctxt "#30069" +msgid "Card is disabled" +msgstr "Kart devre dışı" + +msgctxt "#30073" +msgid "SW Encoder missing" +msgstr "SW Encoder eksik" + +msgctxt "#30074" +msgid "No free disk space" +msgstr "Diskte boş yer yok" + +msgctxt "#30075" +msgid "No PMT found" +msgstr "Hiç PMT bulunamadı" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Ukrainian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Ukrainian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Ukrainian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Ukrainian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,165 @@ # XBMC Media Center language file # Addon Name: MediaPortal PVR Client # Addon id: pvr.mediaportal.tvserver -# Addon version: 1.6.7 # Addon Provider: Marcel Groothuis msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Ukrainian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/uk/)\n" +"Language-Team: Ukrainian (http://www.transifex.com/projects/p/xbmc-main/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +msgctxt "#30000" +msgid "Mediaportal Hostname" +msgstr "Сервер Медіапорталу" + +msgctxt "#30001" +msgid "Mediaportal XBMC plugin Port" +msgstr "Порт додатку Медіапортал для XBMC" + +msgctxt "#30002" +msgid "Free-to-air only" +msgstr "Лише незакодовані канали" + +msgctxt "#30003" +msgid "Include Radio" +msgstr "Додати радіо" + +msgctxt "#30004" +msgid "Fast channel switching (don't stop timeshift)" +msgstr "Швидке переключання каналів (не зупиняти зсув часу)" + +msgctxt "#30005" +msgid "Connect timeout (s)" +msgstr "Затримка зв’язку (с) " + +msgctxt "#30006" +msgid "Import only TV Channels from group" +msgstr "Імпортувати тільки канали ТБ з групи" + +msgctxt "#30007" +msgid "Import only Radio Channels from group" +msgstr "Імпортувати тільки радіо-канали з групи" + +msgctxt "#30008" +msgid "Convert hostname to IP-adress" +msgstr "Конвертувати назву сервера до адреси IP" + +msgctxt "#30009" +msgid "EPG: Read genre strings (slow)" +msgstr "Програма передач: Читати стрічку жанру (повільно)" + +msgctxt "#30010" +msgid "Wait time after tuning a channel (ms)" +msgstr "Затримка після регулювання каналу (мс)" + +msgctxt "#30015" +msgid "Streaming method" +msgstr "Метод потоку" + +msgctxt "#30016" +msgid "Windows user account (SMB)" +msgstr "Рахунок користувача Windows (SMB)" + +msgctxt "#30017" +msgid "Windows password (SMB)" +msgstr "Пароль Windows (SMB)" + +msgctxt "#30018" +msgid "Use RTSP streaming" +msgstr "Використовувати потік RTSP" + +msgctxt "#30040" +msgid "Connection" +msgstr "Зв’язок" + +msgctxt "#30041" +msgid "MediaPortal" +msgstr "МедіаПортал" + msgctxt "#30042" msgid "Playback" msgstr "Відтворення" + +msgctxt "#30050" +msgid "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" +msgstr "Ваша версія TVServerXBMC '%s' застаріла. Оновіть її до '%s' або вищої." + +msgctxt "#30051" +msgid "Your TVServerXBMC version is too old. Please upgrade to '%s' or higher!" +msgstr "Ваша версія TVServerXBMC застаріла. Оновіть її до '%s' або вищої." + +msgctxt "#30052" +msgid "Recording playback failed. Empty URL of filename." +msgstr "Запис не вдався. Порожнє посилання або назва файлу." + +msgctxt "#30060" +msgid "All cards are busy" +msgstr "Всі карти зайняті" + +msgctxt "#30061" +msgid "Channel is scrambled" +msgstr "Канал закодований" + +msgctxt "#30062" +msgid "No video or audio detected" +msgstr "Не знайдено ані відео, ані аудіо" + +msgctxt "#30063" +msgid "No signal detected" +msgstr "Не знайдено сигналу" + +msgctxt "#30064" +msgid "Unknown error" +msgstr "Невідома помилка" + +msgctxt "#30065" +msgid "Unable to start graph" +msgstr "Не вдалося запустити граф" + +msgctxt "#30066" +msgid "Unknown channel" +msgstr "Невідомий канал" + +msgctxt "#30067" +msgid "No tuning details" +msgstr "Немає деталей налаштування" + +msgctxt "#30068" +msgid "Channel is not mapped to any card" +msgstr "Канал не віднесений до жодної карти" + +msgctxt "#30069" +msgid "Card is disabled" +msgstr "Карта виключена" + +msgctxt "#30070" +msgid "Connection to slave failed" +msgstr "Зв’язок не вдався" + +msgctxt "#30071" +msgid "Not the owner" +msgstr "Не власник" + +msgctxt "#30072" +msgid "Graph building failed" +msgstr "Побудова графу не вдалася" + +msgctxt "#30073" +msgid "SW Encoder missing" +msgstr "Пропущено SW Encoder" + +msgctxt "#30074" +msgid "No free disk space" +msgstr "Немає вільного місця на диску" + +msgctxt "#30075" +msgid "No PMT found" +msgstr "Не знайдено PMT" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Vietnamese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Vietnamese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Vietnamese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Vietnamese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,165 @@ +# XBMC Media Center language file +# Addon Name: MediaPortal PVR Client +# Addon id: pvr.mediaportal.tvserver +# Addon Provider: Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Vietnamese (http://www.transifex.com/projects/p/xbmc-main/language/vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "Mediaportal Hostname" +msgstr "Tên miền Mediaportal" + +msgctxt "#30001" +msgid "Mediaportal XBMC plugin Port" +msgstr "Cổng Mediaportal" + +msgctxt "#30002" +msgid "Free-to-air only" +msgstr "Chỉ qua không dây" + +msgctxt "#30003" +msgid "Include Radio" +msgstr "Bao gồm Đài phát thanh" + +msgctxt "#30004" +msgid "Fast channel switching (don't stop timeshift)" +msgstr "Chuyển kênh nhanh (không tắt timeshift)" + +msgctxt "#30005" +msgid "Connect timeout (s)" +msgstr "Thời gian chờ kết nối (s)" + +msgctxt "#30006" +msgid "Import only TV Channels from group" +msgstr "Chỉ nhập các kênh TV từ nhóm" + +msgctxt "#30007" +msgid "Import only Radio Channels from group" +msgstr "Chỉ nhập các kênh Radio từ nhóm" + +msgctxt "#30008" +msgid "Convert hostname to IP-adress" +msgstr "Chuyển đổi tên miền sang địa chỉ IP" + +msgctxt "#30009" +msgid "EPG: Read genre strings (slow)" +msgstr "EPG: Thêm thể loại chương trình (chậm)" + +msgctxt "#30010" +msgid "Wait time after tuning a channel (ms)" +msgstr "Thời gian chờ sau khi dò kênh (mili giây)" + +msgctxt "#30015" +msgid "Streaming method" +msgstr "Phương pháp truyền streaming" + +msgctxt "#30016" +msgid "Windows user account (SMB)" +msgstr "Tài khoản vào Windows (SMB)" + +msgctxt "#30017" +msgid "Windows password (SMB)" +msgstr "Mật khẩu vào Windows (SMB)" + +msgctxt "#30018" +msgid "Use RTSP streaming" +msgstr "Sử dụng giao thức RTSP (thời gian thực)" + +msgctxt "#30040" +msgid "Connection" +msgstr "Kết nối" + +msgctxt "#30041" +msgid "MediaPortal" +msgstr "MediaPortal" + +msgctxt "#30042" +msgid "Playback" +msgstr "Xem lại" + +msgctxt "#30050" +msgid "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" +msgstr "Phiên bản TVServerXBMC '%s' đã quá cũ. Hãy nâng cấp lên '%s' hoặc mới hơn!" + +msgctxt "#30051" +msgid "Your TVServerXBMC version is too old. Please upgrade to '%s' or higher!" +msgstr "Phiên bản TVServerXBMC đã quá cũ. Hãy nâng cấp lên '%s' hoặc mới hơn!" + +msgctxt "#30052" +msgid "Recording playback failed. Empty URL of filename." +msgstr "Thu chương trình bị lỗi. Kiểm tra lại địa chỉ URL chứa file" + +msgctxt "#30060" +msgid "All cards are busy" +msgstr "Tất cả thẻ truy cập đều bận" + +msgctxt "#30061" +msgid "Channel is scrambled" +msgstr "Kênh bị mã hoá" + +msgctxt "#30062" +msgid "No video or audio detected" +msgstr "Không có tín hiệu video hoặc audio" + +msgctxt "#30063" +msgid "No signal detected" +msgstr "Không có tín hiệu" + +msgctxt "#30064" +msgid "Unknown error" +msgstr "Xảy ra lỗi" + +msgctxt "#30065" +msgid "Unable to start graph" +msgstr "Không thể bắt đầu biểu đồ " + +msgctxt "#30066" +msgid "Unknown channel" +msgstr "Không tìm thấy kênh" + +msgctxt "#30067" +msgid "No tuning details" +msgstr "Không có thông tin dò" + +msgctxt "#30068" +msgid "Channel is not mapped to any card" +msgstr "Kênh chưa được đặt với bất kỳ thẻ nào" + +msgctxt "#30069" +msgid "Card is disabled" +msgstr "Thẻ đã bị loại" + +msgctxt "#30070" +msgid "Connection to slave failed" +msgstr "Lỗi kết nối tới slave" + +msgctxt "#30071" +msgid "Not the owner" +msgstr "Không sở hữu" + +msgctxt "#30072" +msgid "Graph building failed" +msgstr "Lỗi vẽ biểu đồ" + +msgctxt "#30073" +msgid "SW Encoder missing" +msgstr "Không thấy bộ mã hoá SW" + +msgctxt "#30074" +msgid "No free disk space" +msgstr "Không có đĩa trống" + +msgctxt "#30075" +msgid "No PMT found" +msgstr "Không tìm thấy PMT" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Welsh/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Welsh/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/language/Welsh/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/language/Welsh/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,165 @@ +# XBMC Media Center language file +# Addon Name: MediaPortal PVR Client +# Addon id: pvr.mediaportal.tvserver +# Addon Provider: Marcel Groothuis +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Welsh (http://www.transifex.com/projects/p/xbmc-main/language/cy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" + +msgctxt "#30000" +msgid "Mediaportal Hostname" +msgstr "Enw Gweinydd Mediaportal" + +msgctxt "#30001" +msgid "Mediaportal XBMC plugin Port" +msgstr "Porth ategyn Mediaportal XBMC" + +msgctxt "#30002" +msgid "Free-to-air only" +msgstr "Rhydd yn unig" + +msgctxt "#30003" +msgid "Include Radio" +msgstr "Cynnwys Radio" + +msgctxt "#30004" +msgid "Fast channel switching (don't stop timeshift)" +msgstr "Newid sianel cyflym (peidio atal newid amser)" + +msgctxt "#30005" +msgid "Connect timeout (s)" +msgstr "Amser allan cysylltu (e)" + +msgctxt "#30006" +msgid "Import only TV Channels from group" +msgstr "Mewnforio Sianeli Teledu o'r grŵp yn unig" + +msgctxt "#30007" +msgid "Import only Radio Channels from group" +msgstr "Mewnforio Sianeli Radio o'r grŵp yn unig" + +msgctxt "#30008" +msgid "Convert hostname to IP-adress" +msgstr "Trosi enw gwesteiwr i gyfeiriad IP" + +msgctxt "#30009" +msgid "EPG: Read genre strings (slow)" +msgstr "Amserlennydd: Darllen llinynnau genre (araf)" + +msgctxt "#30010" +msgid "Wait time after tuning a channel (ms)" +msgstr "Amser aros wedi tiwnio sianel (me)" + +msgctxt "#30015" +msgid "Streaming method" +msgstr "Dull ffrydio" + +msgctxt "#30016" +msgid "Windows user account (SMB)" +msgstr "Cyfrif defnyddiwr Windows (SMB)" + +msgctxt "#30017" +msgid "Windows password (SMB)" +msgstr "Cyfrinair Windows (SMB)" + +msgctxt "#30018" +msgid "Use RTSP streaming" +msgstr "Defnyddio ffrydio RTSP" + +msgctxt "#30040" +msgid "Connection" +msgstr "Cysylltiad" + +msgctxt "#30041" +msgid "MediaPortal" +msgstr "MediaPortal" + +msgctxt "#30042" +msgid "Playback" +msgstr "Chwarae" + +msgctxt "#30050" +msgid "Your TVServerXBMC version '%s' is too old. Please upgrade to '%s' or higher!" +msgstr "Mae eich fersiwn TVServerXBMC '%s' yn rhy hen. Diweddarwch i '%s' neu uwch!" + +msgctxt "#30051" +msgid "Your TVServerXBMC version is too old. Please upgrade to '%s' or higher!" +msgstr "Mae eich fersiwn TVServerXBMC yn rhy hen. Diweddarwch i '%s' neu uwch!" + +msgctxt "#30052" +msgid "Recording playback failed. Empty URL of filename." +msgstr "Methwyd chwarae'r recordiad. URL gwag enw ffeil." + +msgctxt "#30060" +msgid "All cards are busy" +msgstr "Mae'r holl gardiau'n brysur" + +msgctxt "#30061" +msgid "Channel is scrambled" +msgstr "Mae'r sianel yn gaeëdig" + +msgctxt "#30062" +msgid "No video or audio detected" +msgstr "Heb ganfod fideo na sain" + +msgctxt "#30063" +msgid "No signal detected" +msgstr "Heb ganfod signal" + +msgctxt "#30064" +msgid "Unknown error" +msgstr "Gwall anhysbys" + +msgctxt "#30065" +msgid "Unable to start graph" +msgstr "Methu cychwyn y graff" + +msgctxt "#30066" +msgid "Unknown channel" +msgstr "Sianel anhysbys" + +msgctxt "#30067" +msgid "No tuning details" +msgstr "Dim manylion tiwnio" + +msgctxt "#30068" +msgid "Channel is not mapped to any card" +msgstr "Nid yw'r sianel wedi ei fapio i unrhyw gerdyn" + +msgctxt "#30069" +msgid "Card is disabled" +msgstr "Cerdyn wedi ei analluogi" + +msgctxt "#30070" +msgid "Connection to slave failed" +msgstr "Methodd y cysylltiad i'r gwas" + +msgctxt "#30071" +msgid "Not the owner" +msgstr "Nid y perchennog" + +msgctxt "#30072" +msgid "Graph building failed" +msgstr "Methodd adeiladu'r graff" + +msgctxt "#30073" +msgid "SW Encoder missing" +msgstr "Amgodiwr SW ar goll" + +msgctxt "#30074" +msgid "No free disk space" +msgstr "Dim lle ar ddisg" + +msgctxt "#30075" +msgid "No PMT found" +msgstr "Heb ganfod PMT" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/settings.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/settings.xml --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/addon/resources/settings.xml 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/settings.xml 2014-05-04 06:40:43.000000000 +0000 @@ -23,7 +23,7 @@ - + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/Makefile.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/Makefile.am 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/Makefile.am 2014-01-04 10:28:12.000000000 +0000 @@ -10,11 +10,11 @@ LIBNAME = libmediaportal-addon lib_LTLIBRARIES = libmediaportal-addon.la -LIBS = @abs_top_builddir@/lib/tinyxml/libtinyxml.la +LIBS = @abs_top_srcdir@/lib/tinyxml/libtinyxml.la include ../Makefile.include.am -INCLUDES+=-I$(srcdir)/src +INCLUDES+=-Isrc libmediaportal_addon_la_SOURCES = src/Cards.cpp \ src/channels.cpp \ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/project/VS2010Express/XBMC_MediaportalTVserver.vcxproj xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/project/VS2010Express/XBMC_MediaportalTVserver.vcxproj --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/project/VS2010Express/XBMC_MediaportalTVserver.vcxproj 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/project/VS2010Express/XBMC_MediaportalTVserver.vcxproj 2014-01-04 10:28:12.000000000 +0000 @@ -61,7 +61,7 @@ Level3 - 4996;%(DisableSpecificWarnings) + 4996;4355;%(DisableSpecificWarnings)
ws2_32.lib;%(AdditionalDependencies) @@ -91,6 +91,7 @@ TurnOffAllWarnings ProgramDatabase true + 4996;4355;%(DisableSpecificWarnings)
ws2_32.lib;%(AdditionalDependencies) @@ -163,7 +164,6 @@ - diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/client.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/client.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/client.cpp 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/client.cpp 2014-05-04 06:40:43.000000000 +0000 @@ -144,7 +144,7 @@ return true; } -unsigned int ADDON_GetSettings(ADDON_StructSetting ***sSet) +unsigned int ADDON_GetSettings(ADDON_StructSetting*** UNUSED(sSet)) { return 0; } @@ -418,6 +418,10 @@ } +void ADDON_Announce(const char* UNUSED(flag), const char* UNUSED(sender), const char* UNUSED(message), const void* UNUSED(data)) +{ +} + /*********************************************************** * PVR Client AddOn specific public library functions ***********************************************************/ @@ -434,6 +438,18 @@ return strMinApiVersion; } +const char* GetGUIAPIVersion(void) +{ + static const char *strGuiApiVersion = XBMC_GUI_API_VERSION; + return strGuiApiVersion; +} + +const char* GetMininumGUIAPIVersion(void) +{ + static const char *strMinGuiApiVersion = XBMC_GUI_MIN_API_VERSION; + return strMinGuiApiVersion; +} + //-- GetAddonCapabilities ----------------------------------------------------- // Tell XBMC our requirements //----------------------------------------------------------------------------- @@ -457,7 +473,7 @@ return PVR_ERROR_NO_ERROR; } -PVR_ERROR GetStreamProperties(PVR_STREAM_PROPERTIES *pProperties) +PVR_ERROR GetStreamProperties(PVR_STREAM_PROPERTIES* UNUSED(pProperties)) { return PVR_ERROR_NOT_IMPLEMENTED; } @@ -519,7 +535,7 @@ return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook) +PVR_ERROR CallMenuHook(const PVR_MENUHOOK& UNUSED(menuhook), const PVR_MENUHOOK_DATA& UNUSED(item)) { return PVR_ERROR_NOT_IMPLEMENTED; } @@ -556,22 +572,22 @@ return g_client->GetChannels(handle, bRadio); } -PVR_ERROR DeleteChannel(const PVR_CHANNEL &channel) +PVR_ERROR DeleteChannel(const PVR_CHANNEL& UNUSED(channel)) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR RenameChannel(const PVR_CHANNEL &channel) +PVR_ERROR RenameChannel(const PVR_CHANNEL& UNUSED(channel)) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR DialogChannelSettings(const PVR_CHANNEL &channelinfo) +PVR_ERROR DialogChannelSettings(const PVR_CHANNEL& UNUSED(channelinfo)) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR DialogAddChannel(const PVR_CHANNEL &channelinfo) +PVR_ERROR DialogAddChannel(const PVR_CHANNEL& UNUSED(channelinfo)) { return PVR_ERROR_NOT_IMPLEMENTED; } @@ -861,13 +877,17 @@ } /** UNUSED API FUNCTIONS */ -PVR_ERROR MoveChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } +PVR_ERROR MoveChannel(const PVR_CHANNEL& UNUSED(channel)) { return PVR_ERROR_NOT_IMPLEMENTED; } DemuxPacket* DemuxRead(void) { return NULL; } void DemuxAbort(void) {} void DemuxReset(void) {} void DemuxFlush(void) {} +PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY[], int*) { return PVR_ERROR_NOT_IMPLEMENTED; }; unsigned int GetChannelSwitchDelay(void) { return 0; } bool SeekTime(int,bool,double*) { return false; } void SetSpeed(int) {}; +time_t GetPlayingTime() { return 0; } +time_t GetBufferTimeStart() { return 0; } +time_t GetBufferTimeEnd() { return 0; } } //end extern "C" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/client.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/client.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/client.h 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/client.h 2014-01-04 10:28:12.000000000 +0000 @@ -26,6 +26,7 @@ #include "platform/util/StdString.h" #include "libXBMC_addon.h" #include "libXBMC_pvr.h" +#include "libXBMC_gui.h" enum eStreamingMethod { diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/FileUtils.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/FileUtils.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/FileUtils.h 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/FileUtils.h 2014-05-04 06:40:43.000000000 +0000 @@ -1,4 +1,22 @@ #pragma once +/* + * Copyright (C) 2005-2014 Team XBMC + * http://www.xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ #include diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/DeMultiplexer.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/DeMultiplexer.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/DeMultiplexer.cpp 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/DeMultiplexer.cpp 2014-05-04 06:40:43.000000000 +0000 @@ -33,6 +33,7 @@ */ #include "DeMultiplexer.h" +#include "utils.h" //UNUSED() #include "client.h" //XBMC->Log() #include "TSReader.h" @@ -70,7 +71,7 @@ while( (GetTickCount() - m_Time) < 5000 && m_bGotNewChannel == false) { - int BytesRead = ReadFromFile(false,false); + int BytesRead = ReadFromFile(); if (0 == BytesRead) usleep(10000); } @@ -86,7 +87,7 @@ /// and processes the raw data /// When a TS packet has been discovered, OnTsPacket(byte* tsPacket) gets called // which in its turn deals with the packet -int CDeMultiplexer::ReadFromFile(bool isAudio, bool isVideo) +int CDeMultiplexer::ReadFromFile() { if (m_filter.IsSeeking()) return 0; // Ambass : to check @@ -227,7 +228,7 @@ while( (GetTickCount() - m_Time) < 5000 && m_bGotNewChannel == false) { - int BytesRead = ReadFromFile(false,false); + int BytesRead = ReadFromFile(); if (0 == BytesRead) usleep(10000); dwBytesProcessed+=BytesRead; @@ -241,7 +242,7 @@ /// In this method we check if any audio/video/subtitle pid or format has changed /// If not, we simply return /// If something has changed we ask the MP to rebuild the graph -void CDeMultiplexer::OnNewChannel(CChannelInfo& info) +void CDeMultiplexer::OnNewChannel(CChannelInfo& UNUSED(info)) { m_bGotNewChannel = true; } \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/DeMultiplexer.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/DeMultiplexer.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/DeMultiplexer.h 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/DeMultiplexer.h 2014-01-04 10:28:19.000000000 +0000 @@ -53,7 +53,7 @@ void OnNewChannel(CChannelInfo& info); void SetFileReader(FileReader* reader); void RequestNewPat(void); - int ReadFromFile(bool isAudio, bool isVideo); + int ReadFromFile(); private: unsigned long m_LastDataFromRtsp; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/FileReader.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/FileReader.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/FileReader.cpp 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/FileReader.cpp 2014-05-04 06:40:43.000000000 +0000 @@ -40,6 +40,7 @@ #include "platform/util/timeutils.h" // for usleep #include "platform/util/util.h" #include "utils.h" +#include using namespace ADDON; @@ -122,7 +123,22 @@ m_hFile = fileHandle; break; } + else + { + struct __stat64 buffer; + int statResult = XBMC->StatFile(m_fileName.c_str(), &buffer); + if (statResult < 0) + { + if (errno == EACCES) + { + XBMC->Log(LOG_ERROR, "Permission denied. Check the file or share access rights for '%s'", m_fileName.c_str()); + XBMC->QueueNotification(QUEUE_ERROR, "Permission denied"); + Tmo = 0; + break; + } + } + } usleep(20000); } while(--Tmo); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/MemoryReader.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/MemoryReader.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/MemoryReader.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/MemoryReader.cpp 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2005-2012 Team XBMC + * http://www.xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + ************************************************************************* + * This file is a modified version from Team MediaPortal's + * TsReader DirectShow filter + * MediaPortal is a GPL'ed HTPC-Application + * Copyright (C) 2005-2012 Team MediaPortal + * http://www.team-mediaportal.com + * + * Changes compared to Team MediaPortal's version: + * - Code cleanup for PVR addon usage + * - Code refactoring for cross platform usage + */ + +#ifdef LIVE555 + +#include "MemoryReader.h" +#include "utils.h" + +CMemoryReader::CMemoryReader(CMemoryBuffer& buffer) +:m_buffer(buffer) +{ +} + +CMemoryReader::~CMemoryReader(void) +{ +} + +long CMemoryReader::Read(unsigned char* pbData, unsigned long lDataLength, unsigned long *dwReadBytes) +{ + *dwReadBytes = m_buffer.ReadFromBuffer(pbData,lDataLength); + if ((*dwReadBytes) <=0) + return S_FALSE; + return S_OK; +} + +unsigned long CMemoryReader::setFilePointer(int64_t UNUSED(llDistanceToMove), unsigned long UNUSED(dwMoveMethod)) +{ + return 0; +} + +int CMemoryReader::HasData() +{ + return (m_buffer.Size()); +} + +#endif //LIVE555 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/MemoryReader.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/MemoryReader.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/MemoryReader.h 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/MemoryReader.h 2014-05-04 06:40:43.000000000 +0000 @@ -32,6 +32,7 @@ #include "FileReader.h" #include "MemoryBuffer.h" +#include "utils.h" class CMemoryReader : public FileReader { @@ -46,6 +47,6 @@ private: CMemoryBuffer& m_buffer; - CMemoryReader& operator=(const CMemoryReader& memoryreader) {}; + CMemoryReader(const CMemoryReader&); }; #endif //LIVE555 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/MepoRTSPClient.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/MepoRTSPClient.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/MepoRTSPClient.cpp 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/MepoRTSPClient.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,672 +0,0 @@ -/* - * Copyright (C) 2005-2010 Team XBMC - * http://www.xbmc.org - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#if defined LIVE555 - -#include "platform/util/timeutils.h" -#include "MepoRTSPClient.h" -#include "MemorySink.h" -#include "client.h" - -using namespace ADDON; - -CRTSPClient::CRTSPClient() -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient::CRTSPClient()"); - allowProxyServers = false; - controlConnectionUsesTCP = true; - supportCodecSelection = false; - clientProtocolName = "RTSP"; - tunnelOverHTTPPortNum = 0; - statusCode = 0; - singleMedium = NULL; - desiredPortNum = 0; - createReceivers = true; - simpleRTPoffsetArg = -1; - socketInputBufferSize = 0; - streamUsingTCP = false; - fileSinkBufferSize = 20000; - oneFilePerFrame = false; - m_BufferThreadActive = false; - m_duration = 7200*1000; - m_fStart = 0.0f; - m_session = NULL; - m_ourClient = NULL; - m_bPaused = false; - m_outFileName[0] = '\0'; - m_buffer = NULL; - m_env = NULL; - m_fDuration = 0.0f; - m_url[0] = '\0'; - m_bRunning = false; -} - -CRTSPClient::~CRTSPClient() -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient::~CRTSPClient()"); - Medium::close(m_ourClient); - m_ourClient = NULL; - - if (m_env) - { - TaskScheduler *scheduler = &m_env->taskScheduler(); - m_env->reclaim(); - m_env = NULL; - delete scheduler; - } -} - - -Medium* CRTSPClient::createClient(UsageEnvironment& env,int verbosityLevel, char const* applicationName) -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient::createClient()"); - return RTSPClient::createNew(env, verbosityLevel, applicationName,tunnelOverHTTPPortNum); -} - -char* CRTSPClient::getOptionsResponse(Medium* client, char const* url,char* username, char* password) -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient::getOptionsResponse()"); - RTSPClient* rtspClient = (RTSPClient*)client; - char* optionsResponse = rtspClient->sendOptionsCmd(url, username, password); - - if (optionsResponse == NULL) - { - XBMC->Log(LOG_DEBUG, "CRTSPClient::getOptionsResponse(): \"OPTIONS\" request failed: %s", m_env->getResultMsg()); - } else { - XBMC->Log(LOG_DEBUG, "CRTSPClient::getOptionsResponse(): \"OPTIONS\" request returned: %s", optionsResponse); - } - - return optionsResponse; -} - -char* CRTSPClient::getSDPDescriptionFromURL(Medium* client, char const* url, - char const* username, char const* password, - char const* /*proxyServerName*/, - unsigned short /*proxyServerPortNum*/, - unsigned short /*clientStartPort*/) -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient::getSDPDescriptionFromURL()"); - RTSPClient* rtspClient = (RTSPClient*)client; - char* result; - if (username != NULL && password != NULL) - { - result = rtspClient->describeWithPassword(url, username, password); - } - else - { - result = rtspClient->describeURL(url); - } - - statusCode = rtspClient->describeStatus(); - return result; -} - -char* CRTSPClient::getSDPDescription() -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient::getSDPDescription()"); - RTSPClient *client = (RTSPClient*)m_ourClient; - RTSPClient *rtspClient = RTSPClient::createNew(client->envir(), 0, "TSFileSource", tunnelOverHTTPPortNum); - char* result; - result = rtspClient->describeURL(m_url); - - XBMC->Log(LOG_DEBUG, "CRTSPClient::getSDPDescription() statusCode = %d", rtspClient->describeStatus()); - Medium::close(rtspClient); - - return result; -} - -bool CRTSPClient::clientSetupSubsession(Medium* client, MediaSubsession* subsession, bool streamUsingTCP) -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient::clientSetupSubsession()"); - if (client == NULL || subsession == NULL) - return false; - RTSPClient* rtspClient = (RTSPClient*) client; - return ( rtspClient->setupMediaSubsession(*subsession, False, (streamUsingTCP ? True : False)) ? true : false); -} - -bool CRTSPClient::clientStartPlayingSession(Medium* client, MediaSession* session) -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient::clientStartPlayingSession()"); - if (client == NULL || session == NULL) - return false; - RTSPClient* rtspClient = (RTSPClient*) client; - - long dur = m_duration/1000; - double fStart = m_fStart; - - if (m_fDuration > 0.0) - { - double fStartToEnd = m_fDuration-m_fStart; - if (fStartToEnd<0) - fStartToEnd = 0; - fStart = dur - fStartToEnd; - if (fStart<0) - fStart = 0; - } - - XBMC->Log(LOG_DEBUG, "CRTSPClient::clientStartPlayingSession() play from %.3f / %.3f", fStart, (float) m_duration/1000); - return (rtspClient->playMediaSession(*session,fStart) ? true : false); -} - -bool CRTSPClient::clientTearDownSession(Medium* client,MediaSession* session) -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient::clientTearDownSession()"); - if (client == NULL || session == NULL) - return false; - RTSPClient* rtspClient = (RTSPClient*)client; - return (rtspClient->teardownMediaSession(*session) ? true : false); -} - -void my_subsessionAfterPlaying(void* clientData) -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient::subsessionAfterPlaying()"); -} - -void my_subsessionByeHandler(void* clientData) -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient::subsessionByeHandler()"); -} - -void CRTSPClient::closeMediaSinks() -{ - if (m_session == NULL) - return; - - XBMC->Log(LOG_DEBUG, "CRTSPClient::closeMediaSinks()"); - - MediaSubsessionIterator iter(*m_session); - MediaSubsession* subsession; - - while ((subsession = iter.next()) != NULL) - { - Medium::close(subsession->sink); - subsession->sink = NULL; - } -} - -void CRTSPClient::tearDownStreams() -{ - if (m_session == NULL) - return; - - XBMC->Log(LOG_DEBUG, "CRTSPClient::tearDownStreams()"); - - clientTearDownSession(m_ourClient, m_session); -} -bool CRTSPClient::setupStreams() -{ - // Setup streams - XBMC->Log(LOG_DEBUG, "CRTSPClient::setupStreams()"); - - bool madeProgress = false; - MediaSubsessionIterator iter(*m_session); - MediaSubsession *subsession; - - while ((subsession = iter.next()) != NULL) - { - if (subsession->clientPortNum() == 0) - continue; // port # was not set - - if (!clientSetupSubsession(m_ourClient, subsession, streamUsingTCP)) - { - XBMC->Log(LOG_ERROR, "Failed to setup %s %s %s", subsession->mediumName(), subsession->codecName(), m_env->getResultMsg() ); - } - else - { - XBMC->Log(LOG_DEBUG, "Setup %s %s %d %d", subsession->mediumName(), subsession->codecName(), subsession->clientPortNum(), subsession->clientPortNum() + 1); - madeProgress = true; - } - } - - if (!madeProgress) - { - shutdown(); - return false; - } - return true; -} - -bool CRTSPClient::startPlayingStreams() -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient::startPlayingStreams()"); - - if (!clientStartPlayingSession(m_ourClient, m_session)) - { - XBMC->Log(LOG_ERROR, "Failed to start playing session :%s", m_env ->getResultMsg() ); - shutdown(); - return false; - } - else - { - XBMC->Log(LOG_DEBUG, "Started playing session"); - } - return true; -} - -void CRTSPClient::shutdown() -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient::shutdown()"); - - // Close our output files: - closeMediaSinks(); - - // Teardown, then shutdown, any outstanding RTP/RTCP subsessions - tearDownStreams(); - Medium::close(m_session); - - // Finally, shut down our client: - Medium::close(m_ourClient); - m_session = NULL; - m_ourClient = NULL; -} - - -bool CRTSPClient::Initialize(CMemoryBuffer* buffer) -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient::Initialize()"); - - m_buffer = buffer; - m_duration = 7200*1000; - - TaskScheduler* scheduler = BasicTaskScheduler::createNew(); - m_env = BasicUsageEnvironment::createNew(*scheduler); - - m_ourClient = createClient(*m_env, 0/*verbosityLevel*/, "TSFileSource"); - - if (m_ourClient == NULL) - { - XBMC->Log(LOG_ERROR, "Failed to create %s %s", clientProtocolName, m_env->getResultMsg() ); - shutdown(); - return false; - } - return true; -} - -bool CRTSPClient::OpenStream(const char* url) -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient::OpenStream()"); - m_session = NULL; - - strncpy(m_url, url, RTSP_URL_BUFFERSIZE); - - // Open the URL, to get a SDP description: - char* sdpDescription = getSDPDescriptionFromURL(m_ourClient, url, ""/*username*/, ""/*password*/,""/*proxyServerName*/, 0/*proxyServerPortNum*/,1234/*desiredPortNum*/); - - if (sdpDescription == NULL) - { - XBMC->Log(LOG_ERROR, "Failed to get a SDP description from URL %s %s", url, m_env->getResultMsg() ); - shutdown(); - return false; - } - XBMC->Log(LOG_DEBUG, "Opened URL %s %s", url, sdpDescription); - - char* range = strstr(sdpDescription, "a=range:npt="); - if (range != NULL) - { - char *pStart = range + strlen("a=range:npt="); - char *pEnd = strstr(range, "-"); - if (pEnd != NULL) - { - pEnd++; - double Start = atof(pStart); - double End = atof(pEnd); - - XBMC->Log(LOG_DEBUG, "rangestart:%f rangeend:%f", Start, End); - m_duration = (long) ((End-Start)*1000.0); - } - } - // Create a media session object from this SDP description: - m_session = MediaSession::createNew(*m_env, sdpDescription); - delete[] sdpDescription; - - if (m_session == NULL) - { - XBMC->Log(LOG_ERROR, "Failed to create a MediaSession object from the SDP description:%s ", m_env->getResultMsg()); - shutdown(); - return false; - } - else if (!m_session->hasSubsessions()) - { - XBMC->Log(LOG_DEBUG, "This session has no media subsessions"); - shutdown(); - return false; - } - - // Then, setup the "RTPSource"s for the session: - MediaSubsessionIterator iter(*m_session); - MediaSubsession *subsession; - bool madeProgress = false; - char const* singleMediumToTest = singleMedium; - - while ((subsession = iter.next()) != NULL) - { - // If we've asked to receive only a single medium, then check this now: - if (singleMediumToTest != NULL) - { - if (strcmp(subsession->mediumName(), singleMediumToTest) != 0) - { - XBMC->Log(LOG_DEBUG, "Ignoring %s %s %s", subsession->mediumName(), subsession->codecName(), singleMedium); - continue; - } - else - { - // Receive this subsession only - singleMediumToTest = "xxxxx"; - // this hack ensures that we get only 1 subsession of this type - } - } - - if (desiredPortNum != 0) - { - subsession->setClientPortNum(desiredPortNum); - desiredPortNum += 2; - } - - if (createReceivers) - { - if (!subsession->initiate(simpleRTPoffsetArg)) - { - XBMC->Log(LOG_ERROR, "Unable to create receiver for %s %s %s", subsession->mediumName(), subsession->codecName(), m_env->getResultMsg()); - } - else - { - XBMC->Log(LOG_DEBUG, "Created receiver for type=%s codec=%s ports: %d %d ", subsession->mediumName(), subsession->codecName(), subsession->clientPortNum(), subsession->clientPortNum() + 1 ); - madeProgress = true; - - if (subsession->rtpSource() != NULL) - { - // Because we're saving the incoming data, rather than playing - // it in real time, allow an especially large time threshold - // (1 second) for reordering misordered incoming packets: - int socketNum = subsession->rtpSource()->RTPgs()->socketNum(); - - XBMC->Log(LOG_DEBUG, "rtsp:increaseReceiveBufferTo to 2000000 for s:%d", socketNum); - increaseReceiveBufferTo( *m_env, socketNum, 2000000 ); - - unsigned const thresh = 1000000; // 1 second - subsession->rtpSource()->setPacketReorderingThresholdTime(thresh); - - if (socketInputBufferSize > 0) - { - // Set the RTP source's input buffer size as specified: - unsigned int curBufferSize = getReceiveBufferSize(*m_env, socketNum); - unsigned int newBufferSize = setReceiveBufferTo(*m_env, socketNum, socketInputBufferSize); - - XBMC->Log(LOG_DEBUG, "Changed socket receive buffer size for the %s %s %d %d", subsession->mediumName(), subsession->codecName(), curBufferSize, newBufferSize); - } - } - } - } - else - { - if (subsession->clientPortNum() == 0) - { - XBMC->Log(LOG_DEBUG, "No client port was specified for the %s %s", subsession->mediumName(), subsession->codecName()); - } - else - { - madeProgress = true; - } - } - } - - if (!madeProgress) - { - shutdown(); - return false; - } - - // Perform additional 'setup' on each subsession, before playing them: - if (!setupStreams()) - { - return false; - } - - // Create output files: - // Create and start "FileSink"s for each subsession: - madeProgress = false; - iter.reset(); - - while ((subsession = iter.next()) != NULL) - { - if (subsession->readSource() == NULL) continue; // was not initiated - - // Mediaportal: - CMemorySink* fileSink = CMemorySink::createNew(*m_env, *m_buffer, fileSinkBufferSize); - // XBMC test via file: - //FileSink* fileSink = FileSink::createNew(*m_env, m_outFileName, fileSinkBufferSize, false); //oneFilePerFrame - - subsession->sink = fileSink; - if (subsession->sink == NULL) - { - XBMC->Log(LOG_DEBUG, "Failed to create FileSink %s", m_env->getResultMsg()); - shutdown(); - return false; - } - XBMC->Log(LOG_DEBUG, "Created output sink: %s", m_outFileName); - subsession->sink->startPlaying(*(subsession->readSource()), my_subsessionAfterPlaying, subsession); - - // Also set a handler to be called if a RTCP "BYE" arrives - // for this subsession: - if (subsession->rtcpInstance() != NULL) - { - subsession->rtcpInstance()->setByeHandler(my_subsessionByeHandler, subsession); - } - madeProgress = true; - } - - return true; -} - - -void CRTSPClient::Stop() -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient:Stop"); - - if (m_BufferThreadActive) - { - StopBufferThread(); - } - - shutdown(); - m_buffer->Clear(); - XBMC->Log(LOG_DEBUG, "CRTSPClient:Stop done"); -} - -void CRTSPClient::StartBufferThread() -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient::StartBufferThread"); - - if (!m_BufferThreadActive) - { - CreateThread(); - m_BufferThreadActive = true; - } - XBMC->Log(LOG_DEBUG, "CRTSPClient::StartBufferThread done"); -} - -void CRTSPClient::StopBufferThread() -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient::StopBufferThread"); - m_bRunning = false; - if (!m_BufferThreadActive) - return; - - StopThread(); - - m_BufferThreadActive = false; - XBMC->Log(LOG_DEBUG, "CRTSPClient::StopBufferThread done"); -} - -bool CRTSPClient::IsRunning() -{ - return m_BufferThreadActive; -} - -long CRTSPClient::Duration() -{ - return m_duration; -} - -void CRTSPClient::FillBuffer(unsigned long byteCount) -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient::Fillbuffer...%d\n", byteCount); - unsigned long tickCount = GetTickCount(); - - while ( IsRunning() && m_buffer->Size() < byteCount) - { - usleep(5000); - if (GetTickCount() - tickCount > 3000) - break; - } - XBMC->Log(LOG_DEBUG, "CRTSPClient::Fillbuffer...%d/%d\n", byteCount, m_buffer->Size() ); -} - -void *CRTSPClient::Process() -{ - m_BufferThreadActive = true; - m_bRunning = true; - - XBMC->Log(LOG_DEBUG, "CRTSPClient:: thread started"); - - while (m_env != NULL && !IsStopped()) - { - m_env->taskScheduler().doEventLoop(); - if (m_bRunning == false) - break; - } - - XBMC->Log(LOG_DEBUG, "CRTSPClient:: thread stopped"); - - m_BufferThreadActive = false; - - return NULL; -} - -void CRTSPClient::Continue() -{ - if (m_ourClient != NULL && m_session != NULL) - { - RTSPClient* rtspClient = (RTSPClient*) m_ourClient; - rtspClient->playMediaSession(*m_session, -1.0); - StartBufferThread(); - m_bPaused = false; - } -} - -bool CRTSPClient::IsPaused() -{ - return m_bPaused; -} - -bool CRTSPClient::Pause() -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient::Pause()"); - if (m_ourClient != NULL && m_session != NULL) - { - XBMC->Log(LOG_DEBUG, "CRTSPClient::Pause() stopthread"); - StopThread(10000); // Ambass : sometimes 100mS ( prev value ) is not enough and thread is not stopped. - // now stopping takes around 5 secs ?!?! why ???? - XBMC->Log(LOG_DEBUG, "CRTSPClient::Pause() thread stopped"); - RTSPClient* rtspClient=(RTSPClient*)m_ourClient; - rtspClient->pauseMediaSession(*m_session); - m_bPaused = true; - } - XBMC->Log(LOG_DEBUG, "CRTSPClient::Pause() done"); - - return true; -} -bool CRTSPClient::Play(double fStart,double fDuration) -{ - XBMC->Log(LOG_DEBUG, "CRTSPClient::Play from %f / %f", (float)fStart, (float)fDuration); - - m_bPaused = false; - m_fStart = fStart; - m_fDuration = fDuration; - - if (m_BufferThreadActive) - { - Stop(); - m_buffer->Clear(); - if (Initialize(m_buffer) == false) - { - shutdown(); - return false; - } - if (OpenStream(m_url) == false) - { - shutdown(); - return false; - } - } - - if (m_ourClient == NULL || m_session == NULL) - { - m_buffer->Clear(); - if (Initialize(m_buffer) == false) - { - shutdown(); - return false; - } - if (OpenStream(m_url) == false) - { - shutdown(); - return false; - } - } - - if (!startPlayingStreams()) - { - shutdown(); - return false; - } - StartBufferThread(); - - return true; -} - -bool CRTSPClient::UpdateDuration() -{ - char* sdpDescription = getSDPDescription(); - if (sdpDescription == NULL) - { - XBMC->Log(LOG_ERROR, "UpdateStreamDuration: Failed to get a SDP description from URL %s %s", m_url, m_env->getResultMsg() ); - return false; - } - //XBMC->Log(LOG_DEBUG, "Opened URL %s %s",url,sdpDescription); - - char* range = strstr(sdpDescription, "a=range:npt="); - if (range != NULL) - { - char *pStart = range + strlen("a=range:npt="); - char *pEnd = strstr(range,"-"); - - if (pEnd != NULL) - { - pEnd++; - double Start = atof(pStart); - double End = atof(pEnd); - - //XBMC->Log(LOG_DEBUG, "rangestart:%f rangeend:%f", Start,End); - m_duration = (long) ((End-Start)*1000.0); - } - } - - return true; -} -#endif //LIVE555 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/MepoRTSPClient.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/MepoRTSPClient.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/MepoRTSPClient.h 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/MepoRTSPClient.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,117 +0,0 @@ -#pragma once -/* - * Copyright (C) 2005-2013 Team XBMC - * http://www.xbmc.org - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - ************************************************************************* - * This file is a modified version from Team MediaPortal's - * TsReader DirectShow filter - * MediaPortal is a GPL'ed HTPC-Application - * Copyright (C) 2005-2012 Team MediaPortal - * http://www.team-mediaportal.com - * - * Changes compared to Team MediaPortal's version: - * - Code cleanup for PVR addon usage - * - Code refactoring for cross platform usage - ************************************************************************* - */ - -#ifdef LIVE555 - -#include "platform/threads/threads.h" -#include "lib/tsreader/MemoryBuffer.h" - -#include "liveMedia.hh" -#include "BasicUsageEnvironment.hh" -#include "GroupsockHelper.hh" - - -#define RTSP_URL_BUFFERSIZE 2048 - -class CRTSPClient: public PLATFORM::CThread -{ -public: - CRTSPClient(); - virtual ~CRTSPClient(void); - bool Initialize(CMemoryBuffer* buffer); - bool OpenStream(const char* url); - bool Play(double fStart,double fDuration); - void Stop(); - bool IsRunning(); - long Duration(); - bool Pause(); - bool IsPaused(); - void Continue(); - void FillBuffer(unsigned long byteCount); - - char* getSDPDescription(); - bool UpdateDuration(); - -protected: - CMemoryBuffer* m_buffer; - Medium* createClient(UsageEnvironment& env,int verbosityLevel, char const* applicationName); - char* getSDPDescriptionFromURL(Medium* client, char const* url, - char const* username, char const* password, - char const* /*proxyServerName*/, - unsigned short /*proxyServerPortNum*/, - unsigned short /*clientStartPort*/); - bool clientSetupSubsession(Medium* client, MediaSubsession* subsession, bool streamUsingTCP); - bool clientStartPlayingSession(Medium* client, MediaSession* session); - bool clientTearDownSession(Medium* client, MediaSession* session); - void closeMediaSinks(); - void tearDownStreams(); - bool setupStreams(); - void checkForPacketArrival(void* /*clientData*/); - MediaSession* m_session; - - bool allowProxyServers; - bool controlConnectionUsesTCP; - bool supportCodecSelection; - char const* clientProtocolName; - portNumBits tunnelOverHTTPPortNum; - unsigned statusCode; - char const* singleMedium; - unsigned short desiredPortNum; - bool createReceivers; - int simpleRTPoffsetArg; - unsigned socketInputBufferSize; - bool streamUsingTCP; - unsigned fileSinkBufferSize; - bool oneFilePerFrame; - -public: - UsageEnvironment* m_env; - Medium* m_ourClient; - char* getOptionsResponse(Medium* client, char const* url,char* username, char* password); - void shutdown(); - bool startPlayingStreams(); - - // Thread -private: - virtual void *Process(void); - void StartBufferThread(); - void StopBufferThread(); - bool m_BufferThreadActive; - - long m_duration; - double m_fStart; - double m_fDuration; - char m_url[RTSP_URL_BUFFERSIZE]; - bool m_bRunning; - bool m_bPaused; - char m_outFileName[1000]; -}; -#endif //LIVE555 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/MultiFileReader.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/MultiFileReader.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/MultiFileReader.cpp 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/MultiFileReader.cpp 2014-05-04 06:40:43.000000000 +0000 @@ -358,7 +358,6 @@ unsigned long bytesRead; MultiFileReaderFile *file; - long result; int64_t currentPosition; int32_t filesAdded, filesRemoved; int32_t filesAdded2, filesRemoved2; @@ -390,7 +389,7 @@ uint32_t readLength = sizeof(currentPosition) + sizeof(filesAdded) + sizeof(filesRemoved); unsigned char* readBuffer = new unsigned char[readLength]; - result = m_TSBufferFile.Read(readBuffer, readLength, &bytesRead); + long result = m_TSBufferFile.Read(readBuffer, readLength, &bytesRead); if (!SUCCEEDED(result) || bytesRead!=readLength) Error |= 0x02; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/PacketSync.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/PacketSync.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/PacketSync.cpp 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/PacketSync.cpp 2014-05-04 06:40:43.000000000 +0000 @@ -20,6 +20,7 @@ */ #include "PacketSync.h" +#include "utils.h" CPacketSync::CPacketSync(void) { @@ -80,6 +81,6 @@ m_tempBufferPos = 0 ; } -void CPacketSync::OnTsPacket(byte* tsPacket) +void CPacketSync::OnTsPacket(byte* UNUSED(tsPacket)) { } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/PidTable.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/PidTable.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/PidTable.cpp 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/PidTable.cpp 2014-05-04 06:40:43.000000000 +0000 @@ -21,6 +21,7 @@ #include "PidTable.h" #include "client.h" //XBMC->Log +#include "utils.h" using namespace ADDON; @@ -104,7 +105,7 @@ } -bool CPidTable::HasTeletextPageInfo(int page) +bool CPidTable::HasTeletextPageInfo(int UNUSED(page)) { //MG: todo //std::vector::iterator vit = TeletextInfo.begin(); //while(vit != TeletextInfo.end()) diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/PmtParser.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/PmtParser.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/PmtParser.cpp 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/PmtParser.cpp 2014-05-04 06:40:43.000000000 +0000 @@ -84,9 +84,6 @@ pointer += (descriptorLen+2); } // loop 2 - int stream_type = 0; - short elementary_PID = 0; - short ES_info_length = 0; vector tempPids; m_pidInfo.Reset(); @@ -96,9 +93,9 @@ while (len1 > 0) { //if (start+pointer+4>=sectionLen+9) return ; - stream_type = section.Data[pointer]; - elementary_PID = ((section.Data[pointer+1] & 0x1F) << 8) + section.Data[pointer+2]; - ES_info_length = ((section.Data[pointer+3] & 0xF) << 8) + section.Data[pointer+4]; + int stream_type = section.Data[pointer]; + short elementary_PID = ((section.Data[pointer+1] & 0x1F) << 8) + section.Data[pointer+2]; + short ES_info_length = ((section.Data[pointer+3] & 0xF) << 8) + section.Data[pointer+4]; XBMC->Log(LOG_DEBUG, "pmt: pid:%x type:%x",elementary_PID, stream_type); if (stream_type == SERVICE_TYPE_VIDEO_MPEG1 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/SectionDecoder.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/SectionDecoder.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/SectionDecoder.cpp 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/SectionDecoder.cpp 2014-05-04 06:40:43.000000000 +0000 @@ -25,6 +25,7 @@ #include #include "SectionDecoder.h" #include "TSHeader.h" +#include "utils.h" using namespace ADDON; @@ -242,7 +243,7 @@ } } -void CSectionDecoder::OnNewSection(CSection& section) +void CSectionDecoder::OnNewSection(CSection& UNUSED(section)) { } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/TSReader.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/TSReader.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/lib/tsreader/TSReader.cpp 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/lib/tsreader/TSReader.cpp 2014-05-04 06:40:43.000000000 +0000 @@ -205,6 +205,10 @@ XBMC->Log(LOG_DEBUG, "open rtsp: %s", m_fileName.c_str()); #ifdef LIVE555 //strcpy(m_rtspClient.m_outFileName, "e:\\temp\\rtsptest.ts"); + if (m_buffer) + delete m_buffer; + if (m_rtspClient) + delete m_rtspClient; m_buffer = new CMemoryBuffer(); m_rtspClient = new CRTSPClient(); m_rtspClient->Initialize(m_buffer); @@ -287,7 +291,7 @@ return m_fileReader->Read(pbData, lDataLength, dwReadBytes); } - dwReadBytes = 0; + *dwReadBytes = 0; return S_FALSE; } @@ -405,11 +409,11 @@ m_lastPause = GetTickCount(); #ifdef LIVE555 // Are we using rtsp? - //if (m_bIsRTSP) - //{ - // XBMC->Log(LOG_DEBUG, "CTsReader::Pause() ->pause rtsp"); // at position: %f", (m_seekTime.Millisecs() / 1000.0f)); - // m_rtspClient->Pause(); - //} + if (m_bIsRTSP) + { + XBMC->Log(LOG_DEBUG, "CTsReader::Pause() ->pause rtsp"); // at position: %f", (m_seekTime.Millisecs() / 1000.0f)); + m_rtspClient->Pause(); + } #endif //LIVE555 m_State = State_Paused; } @@ -417,12 +421,12 @@ { #ifdef LIVE555 // Are we using rtsp? - //if (m_bIsRTSP) - //{ - // XBMC->Log(LOG_DEBUG, "CTsReader::Pause() is paused, continue rtsp"); // at position: %f", (m_seekTime.Millisecs() / 1000.0f)); - // m_rtspClient->Continue(); - // XBMC->Log(LOG_DEBUG, "CTsReader::Pause() rtsp running"); // at position: %f", (m_seekTime.Millisecs() / 1000.0f)); - //} + if (m_bIsRTSP) + { + XBMC->Log(LOG_DEBUG, "CTsReader::Pause() is paused, continue rtsp"); // at position: %f", (m_seekTime.Millisecs() / 1000.0f)); + m_rtspClient->Continue(); + XBMC->Log(LOG_DEBUG, "CTsReader::Pause() rtsp running"); // at position: %f", (m_seekTime.Millisecs() / 1000.0f)); + } m_State = State_Running; #endif //LIVE555 } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/pvrclient-mediaportal.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/pvrclient-mediaportal.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/pvrclient-mediaportal.cpp 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/pvrclient-mediaportal.cpp 2014-05-04 06:40:43.000000000 +0000 @@ -42,13 +42,13 @@ int g_iTVServerXBMCBuild = 0; /* PVR client version (don't forget to update also the addon.xml and the Changelog.txt files) */ -#define PVRCLIENT_MEDIAPORTAL_VERSION_STRING "1.6.10" +#define PVRCLIENT_MEDIAPORTAL_VERSION_STRING "1.9.13" /* TVServerXBMC plugin supported versions */ -#define TVSERVERXBMC_MIN_VERSION_STRING "1.1.0.90" -#define TVSERVERXBMC_MIN_VERSION_BUILD 90 -#define TVSERVERXBMC_RECOMMENDED_VERSION_STRING "1.2.3.122, 1.3.0.124, 1.4.0.124 or 1.5.0.124" -#define TVSERVERXBMC_RECOMMENDED_VERSION_BUILD 124 +#define TVSERVERXBMC_MIN_VERSION_STRING "1.1.7.107" +#define TVSERVERXBMC_MIN_VERSION_BUILD 107 +#define TVSERVERXBMC_RECOMMENDED_VERSION_STRING "1.2.3.122, 1.3.0.122, 1.4.0.124, 1.5.0.125 or 1.6.0.126" +#define TVSERVERXBMC_RECOMMENDED_VERSION_BUILD 122 /************************************************************/ /** Class interface */ @@ -56,7 +56,7 @@ cPVRClientMediaPortal::cPVRClientMediaPortal() { m_iCurrentChannel = -1; - m_iCurrentCard = 0; + m_iCurrentCard = -1; m_tcpclient = new MPTV::Socket(MPTV::af_inet, MPTV::pf_inet, MPTV::sock_stream, MPTV::tcp); m_bConnected = false; m_bStop = true; @@ -66,6 +66,9 @@ m_tsreader = NULL; m_genretable = NULL; m_iLastRecordingUpdate = 0; + m_signalStateCounter = 0; + m_iSignal = 0; + m_iSNR = 0; } cPVRClientMediaPortal::~cPVRClientMediaPortal() @@ -95,6 +98,11 @@ return ""; } } + else + { + XBMC->Log(LOG_ERROR, "SendCommand2: reconnect failed."); + return ""; + } } } @@ -107,7 +115,7 @@ return line; } -bool cPVRClientMediaPortal::SendCommand2(string command, int& code, vector& lines) +bool cPVRClientMediaPortal::SendCommand2(string command, vector& lines) { PLATFORM::CLockObject critsec(m_mutex); @@ -115,6 +123,7 @@ { if ( !m_tcpclient->is_valid() ) { + XBMC->Log(LOG_ERROR, "SendCommand2: connection lost, attempt to reconnect..."); // Connection lost, try to reconnect if ( Connect() == ADDON_STATUS_OK ) { @@ -125,6 +134,11 @@ return false; } } + else + { + XBMC->Log(LOG_ERROR, "SendCommand2: reconnect failed."); + return false; + } } } @@ -340,17 +354,14 @@ if (!IsUp()) return PVR_ERROR_SERVER_ERROR; - if ( g_iTVServerXBMCBuild >= 100) - { - result = SendCommand("GetDriveSpace:\n"); + result = SendCommand("GetDriveSpace:\n"); - Tokenize(result, fields, "|"); + Tokenize(result, fields, "|"); - if(fields.size() >= 2) - { - *iTotal = (long long) atoi(fields[0].c_str()); - *iUsed = (long long) atoi(fields[1].c_str()); - } + if(fields.size() >= 2) + { + *iTotal = (long long) atoi(fields[0].c_str()); + *iUsed = (long long) atoi(fields[1].c_str()); } return PVR_ERROR_NO_ERROR; @@ -442,21 +453,13 @@ if (!IsUp()) return PVR_ERROR_SERVER_ERROR; - if (g_iTVServerXBMCBuild >= 104) - { - // Request (extended) EPG data for the given period - snprintf(command, 256, "GetEPG:%i|%04d-%02d-%02dT%02d:%02d:%02d.0Z|%04d-%02d-%02dT%02d:%02d:%02d.0Z\n", - channel.iUniqueId, //Channel id - starttime.tm_year + 1900, starttime.tm_mon + 1, starttime.tm_mday, //Start date [2..4] - starttime.tm_hour, starttime.tm_min, starttime.tm_sec, //Start time [5..7] - endtime.tm_year + 1900, endtime.tm_mon + 1, endtime.tm_mday, //End date [8..10] - endtime.tm_hour, endtime.tm_min, endtime.tm_sec); //End time [11..13] - } - else - { - // This version does not yet return all EPG fields - snprintf(command, 256, "GetEPG:%i\n", channel.iUniqueId); - } + // Request (extended) EPG data for the given period + snprintf(command, 256, "GetEPG:%i|%04d-%02d-%02dT%02d:%02d:%02d.0Z|%04d-%02d-%02dT%02d:%02d:%02d.0Z\n", + channel.iUniqueId, //Channel id + starttime.tm_year + 1900, starttime.tm_mon + 1, starttime.tm_mday, //Start date [2..4] + starttime.tm_hour, starttime.tm_min, starttime.tm_sec, //Start time [5..7] + endtime.tm_year + 1900, endtime.tm_mon + 1, endtime.tm_mday, //End date [8..10] + endtime.tm_hour, endtime.tm_min, endtime.tm_sec); //End time [11..13] result = SendCommand(command); @@ -544,8 +547,7 @@ { vector lines; CStdString command; - char* baseCommand; - int code; + const char * baseCommand; PVR_CHANNEL tag; CStdString stream; CStdString groups; @@ -593,7 +595,7 @@ else command.Format("%s:%s\n", baseCommand, groups.c_str()); - if( !SendCommand2(command, code, lines) ) + if( !SendCommand2(command, lines) ) return PVR_ERROR_SERVER_ERROR; #ifdef TARGET_WINDOWS @@ -651,7 +653,7 @@ if( channel.Parse(data) ) { tag.iUniqueId = channel.UID(); - tag.iChannelNumber = g_iTVServerXBMCBuild >= 102 ? channel.ExternalID() : channel.UID(); + tag.iChannelNumber = channel.ExternalID(); PVR_STRCPY(tag.strChannelName, channel.Name()); PVR_STRCLR(tag.strIconPath); #ifdef TARGET_WINDOWS @@ -662,6 +664,8 @@ string strIconName; string strIconBaseName; + XBMC->Log(LOG_DEBUG, "Checking for a channel thumbnail for channel %s in %s", channel.Name(), strThumbPath.c_str()); + strIconBaseName = strThumbPath + ToThumbFileName(channel.Name()); for (int i=0; i < ciExtCount; i++) @@ -670,6 +674,7 @@ if ( OS::CFile::Exists(strIconName) ) { PVR_STRCPY(tag.strIconPath, strIconName.c_str()); + XBMC->Log(LOG_DEBUG, "Found channel thumb: %s", tag.strIconPath); break; } } @@ -681,6 +686,7 @@ if(channel.IsWebstream()) { + XBMC->Log(LOG_DEBUG, "Channel '%s' has a webstream: %s", channel.Name(), channel.URL()); PVR_STRCPY(tag.strStreamURL, channel.URL()); PVR_STRCLR(tag.strInputFormat); } @@ -737,8 +743,7 @@ PVR_ERROR cPVRClientMediaPortal::GetChannelGroups(ADDON_HANDLE handle, bool bRadio) { vector lines; - CStdString filters; - int code; + std::string filters; PVR_CHANNEL_GROUP tag; if (!IsUp()) @@ -755,7 +760,7 @@ filters = g_szRadioGroup; XBMC->Log(LOG_DEBUG, "GetChannelGroups for radio"); - if (!SendCommand2("ListRadioGroups\n", code, lines)) + if (!SendCommand2("ListRadioGroups\n", lines)) return PVR_ERROR_SERVER_ERROR; } else @@ -763,7 +768,7 @@ filters = g_szTVGroup; XBMC->Log(LOG_DEBUG, "GetChannelGroups for TV"); - if (!SendCommand2("ListGroups\n", code, lines)) + if (!SendCommand2("ListGroups\n", lines)) return PVR_ERROR_SERVER_ERROR; } @@ -789,7 +794,7 @@ { if (!filters.empty()) { - if (filters.Find(data.c_str()) == string::npos) + if (filters.find(data.c_str()) == string::npos) { // Skip this backend group. It is not in our filter list continue; @@ -811,7 +816,6 @@ //TODO: code below is similar to GetChannels code. Refactor and combine... vector lines; CStdString command; - int code; PVR_CHANNEL_GROUP_MEMBER tag; if (!IsUp()) @@ -836,7 +840,7 @@ command.Format("ListTVChannels:%s\n", uri::encode(uri::PATH_TRAITS, group.strGroupName).c_str()); } - if (!SendCommand2(command, code, lines)) + if (!SendCommand2(command, lines)) return PVR_ERROR_SERVER_ERROR; memset(&tag, 0, sizeof(PVR_CHANNEL_GROUP_MEMBER)); @@ -860,7 +864,7 @@ if( channel.Parse(data) ) { tag.iChannelUniqueId = channel.UID(); - tag.iChannelNumber = g_iTVServerXBMCBuild >= 102 ? channel.ExternalID() : channel.UID(); + tag.iChannelNumber = channel.ExternalID(); PVR_STRCPY(tag.strGroupName, group.strGroupName); @@ -938,11 +942,11 @@ if (recording.ParseLine(data)) { strRecordingId.Format("%i", recording.Index()); - strEpisodeName = g_iTVServerXBMCBuild >= 105 ? recording.EpisodeName() : ""; + strEpisodeName = recording.EpisodeName(); PVR_STRCPY(tag.strRecordingId, strRecordingId.c_str()); PVR_STRCPY(tag.strTitle, recording.Title()); - PVR_STRCPY(tag.strPlotOutline, g_iTVServerXBMCBuild >= 105 ? recording.EpisodeName() : tag.strTitle); + PVR_STRCPY(tag.strPlotOutline, recording.EpisodeName()); PVR_STRCPY(tag.strPlot, recording.Description()); PVR_STRCPY(tag.strChannelName, recording.ChannelName()); tag.recordingTime = recording.StartTime(); @@ -952,7 +956,7 @@ tag.iGenreType = recording.GenreType(); tag.iGenreSubType = recording.GenreSubType(); tag.iPlayCount = recording.TimesWatched(); - //tag.iLastPlayedPosition = recording.LastPlayedPosition(); + tag.iLastPlayedPosition = recording.LastPlayedPosition(); strDirectory = recording.Directory(); if (strDirectory.length() > 0) @@ -960,7 +964,7 @@ strDirectory.Replace("\\", " - "); // XBMC supports only 1 sublevel below Recordings, so flatten the MediaPortal directory structure PVR_STRCPY(tag.strDirectory, strDirectory.c_str()); // used in XBMC as directory structure below "Recordings" - if ((g_iTVServerXBMCBuild >= 105) && (strDirectory.Equals(tag.strTitle)) && (strEpisodeName.length() > 0)) + if ((strDirectory.Equals(tag.strTitle)) && (strEpisodeName.length() > 0)) { strEpisodeName = recording.Title(); strEpisodeName+= " - "; @@ -973,28 +977,23 @@ PVR_STRCLR(tag.strDirectory); } - //if (g_bUseRecordingsDir == true) - if (g_bUseRTSP == false) - { #ifdef TARGET_WINDOWS - if (OS::CFile::Exists( recording.FilePath() )) - PVR_STRCPY(tag.strStreamURL, recording.FilePath()); - else + if ( (g_bUseRTSP == false) && (recording.IsRecording() == false) && (OS::CFile::Exists( recording.FilePath() ))) + { + // Direct access. Bypass the PVR addon completely (both ffmpeg and TSReader mode; Windows only) + PVR_STRCPY(tag.strStreamURL, recording.FilePath()); + } + else #endif + if (g_eStreamingMethod==TSReader) + { + // Use ReadRecordedStream PVR_STRCLR(tag.strStreamURL); } else { - if (g_eStreamingMethod==TSReader) - { - // Use ReadRecordedStream - PVR_STRCLR(tag.strStreamURL); - } - else - { - // Use rtsp url and XBMC's internal FFMPeg playback - PVR_STRCPY(tag.strStreamURL, recording.Stream()); - } + // Use rtsp url and XBMC's internal FFMPeg playback + PVR_STRCPY(tag.strStreamURL, recording.Stream()); } PVR->TransferRecordingEntry(handle, &tag); } @@ -1257,14 +1256,14 @@ if ( timerinfo.startTime <= 0) { // Refresh the recordings list to see the newly created recording - usleep(1000); + usleep(100000); PVR->TriggerRecordingUpdate(); } return PVR_ERROR_NO_ERROR; } -PVR_ERROR cPVRClientMediaPortal::DeleteTimer(const PVR_TIMER &timer, bool bForceDelete) +PVR_ERROR cPVRClientMediaPortal::DeleteTimer(const PVR_TIMER &timer, bool UNUSED(bForceDelete)) { char command[256]; string result; @@ -1347,17 +1346,23 @@ const char* sResolveRTSPHostname = booltostring(g_bResolveRTSPHostname); vector timeshiftfields; - XBMC->Log(LOG_DEBUG, "->OpenLiveStream(uid=%i)", channelinfo.iUniqueId); + XBMC->Log(LOG_NOTICE, "Open Live stream for channel uid=%i", channelinfo.iUniqueId); if (!IsUp()) { m_iCurrentChannel = -1; + m_signalStateCounter = 0; + XBMC->Log(LOG_ERROR, "Open Live stream failed. No connection to backend."); return false; } if (((int)channelinfo.iUniqueId) == m_iCurrentChannel) + { + XBMC->Log(LOG_NOTICE, "New channel uid equal to the already streaming channel. Skipping re-tune."); return true; - else - m_iCurrentChannel = -1; // make sure that it is not a valid channel nr in case it will fail lateron + } + + m_iCurrentChannel = -1; // make sure that it is not a valid channel nr in case it will fail lateron + m_signalStateCounter = 0; // Start the timeshift // Use the optimized TimeshiftChannel call (don't stop a running timeshift) @@ -1428,6 +1433,7 @@ if(timeshiftfields.size()<4) { + XBMC->Log(LOG_ERROR, "OpenLiveStream: Field count mismatch (<4). Data: %s\n", result.c_str()); m_iCurrentChannel = -1; return false; } @@ -1440,7 +1446,14 @@ //[5] = tsbuffer file nr (TVServerXBMC build >= 110) m_PlaybackURL = timeshiftfields[0]; - XBMC->Log(LOG_NOTICE, "Channel stream URL: %s, timeshift buffer: %s", m_PlaybackURL.c_str(), timeshiftfields[2].c_str()); + if (g_eStreamingMethod == TSReader) + { + XBMC->Log(LOG_NOTICE, "Channel timeshift buffer: %s", timeshiftfields[2].c_str()); + } + else + { + XBMC->Log(LOG_NOTICE, "Channel stream URL: %s", m_PlaybackURL.c_str()); + } if (g_iSleepOnRTSPurl > 0) { @@ -1470,7 +1483,7 @@ { m_tsreader->SetCardId(atoi(timeshiftfields[3].c_str())); - if (g_iTVServerXBMCBuild >=110 ) + if ((g_iTVServerXBMCBuild >=110) && (timeshiftfields.size()>=6)) bReturn = m_tsreader->OnZap(timeshiftfields[2].c_str(), atoll(timeshiftfields[4].c_str()), atol(timeshiftfields[5].c_str())); else bReturn = m_tsreader->OnZap(timeshiftfields[2].c_str(), -1, -1); @@ -1485,13 +1498,12 @@ if (bReturn) { m_iCurrentChannel = (int) channelinfo.iUniqueId; - m_iCurrentCard = (g_iTVServerXBMCBuild >= 106) ? atoi(timeshiftfields[3].c_str()) : -1; + m_iCurrentCard = atoi(timeshiftfields[3].c_str()); } else { XBMC->Log(LOG_ERROR, "Re-using the existing TsReader failed."); - m_iCurrentChannel = -1; - m_iCurrentCard = -1; + CloseLiveStream(); } return bReturn; @@ -1513,7 +1525,8 @@ if ( m_tsreader->Open(timeshiftfields[2].c_str()) != S_OK ) { - SAFE_DELETE(m_tsreader); + XBMC->Log(LOG_ERROR, "Cannot open timeshift buffer %s", timeshiftfields[2].c_str()); + CloseLiveStream(); return false; } } @@ -1522,7 +1535,8 @@ // use the RTSP url and live555 if ( m_tsreader->Open(timeshiftfields[0].c_str()) != S_OK) { - SAFE_DELETE(m_tsreader); + XBMC->Log(LOG_ERROR, "Cannot open channel url %s", timeshiftfields[0].c_str()); + CloseLiveStream(); return false; } usleep(400000); @@ -1531,8 +1545,10 @@ // at this point everything is ready for playback m_iCurrentChannel = (int) channelinfo.iUniqueId; - m_iCurrentCard = (g_iTVServerXBMCBuild >= 106) ? atoi(timeshiftfields[3].c_str()) : -1; + m_iCurrentCard = atoi(timeshiftfields[3].c_str()); } + XBMC->Log(LOG_NOTICE, "OpenLiveStream: success for channel id %i (%s) on card %i", m_iCurrentChannel, channelinfo.strChannelName, m_iCurrentCard); + return true; } @@ -1545,10 +1561,16 @@ //XBMC->Log(LOG_DEBUG, "->ReadLiveStream(buf_size=%i)", buf_size); if (g_eStreamingMethod != TSReader) + { + XBMC->Log(LOG_ERROR, "ReadLiveStream: this function should not be called in FFMPEG/RTSP mode. Use 'Reset the PVR database' to re-read the channel list"); return 0; + } if (!m_tsreader) + { + XBMC->Log(LOG_ERROR, "ReadLiveStream: failed. No open TSReader"); return -1; + } while (read_done < (unsigned long) iBufferSize) { @@ -1566,8 +1588,13 @@ { if (read_timeouts > 50) { - XBMC->Log(LOG_NOTICE, "No data in 2 seconds"); + XBMC->Log(LOG_NOTICE, "XBMC requested %u bytes, but the TSReader got only %ul bytes in 2 seconds", iBufferSize, read_done); read_timeouts = 0; + + //TODO + //if read_done == 0 then check if the backend is still timeshifting, + //or retrieve the reason why the timeshifting was stopped/failed... + return read_done; } bufptr += read_wanted; @@ -1598,7 +1625,9 @@ XBMC->Log(LOG_NOTICE, "CloseLiveStream: %s", result.c_str()); m_bTimeShiftStarted = false; m_iCurrentChannel = -1; - m_iCurrentCard = 0; + m_iCurrentCard = -1; + + m_signalStateCounter = 0; } else { @@ -1610,6 +1639,7 @@ { if (g_eStreamingMethod == ffmpeg || !m_tsreader) { + XBMC->Log(LOG_ERROR, "SeekLiveStream: is not supported in FFMPEG/RTSP mode."); return -1; } @@ -1651,6 +1681,7 @@ { // Close existing live stream before opening a new one. // This is slower, but it helps XBMC playback when the streams change types (e.g. SD->HD) + XBMC->Log(LOG_DEBUG, "Fast channel switching is disabled. Closing the existing live stream first"); CloseLiveStream(); } @@ -1680,35 +1711,48 @@ string result; - // Request the signal quality for the current streaming card from the backend - result = SendCommand("GetSignalQuality\n"); - - if (result.length() > 0) + // Limit the GetSignalQuality calls to once every 10 s + if (m_signalStateCounter == 0) { - int signallevel = 0; - int signalquality = 0; + // Request the signal quality for the current streaming card from the backend + result = SendCommand("GetSignalQuality\n"); - // Fetch the signal level and SNR values from the result string - if (sscanf(result.c_str(),"%5i|%5i", &signallevel, &signalquality) == 2) + if (result.length() > 0) { - signalStatus.iSignal = (int) (signallevel * 655.35); // 100% is 0xFFFF 65535 - signalStatus.iSNR = (int) (signalquality * 655.35); // 100% is 0xFFFF 65535 - signalStatus.iBER = 0; - PVR_STRCPY(signalStatus.strAdapterStatus, "timeshifting"); // hardcoded for now... + int signallevel = 0; + int signalquality = 0; - // Try to determine the name of the tv/radio card from the local card cache - Card currentCard; - - if (m_cCards.GetCard(m_iCurrentCard, currentCard) == true) - { - PVR_STRCPY(signalStatus.strAdapterName, currentCard.Name.c_str()); - } - else + // Fetch the signal level and SNR values from the result string + if (sscanf(result.c_str(),"%5i|%5i", &signallevel, &signalquality) == 2) { - PVR_STRCLR(signalStatus.strAdapterName); + m_iSignal = (int) (signallevel * 655.35); // 100% is 0xFFFF 65535 + m_iSNR = (int) (signalquality * 655.35); // 100% is 0xFFFF 65535 } } } + m_signalStateCounter++; + if (m_signalStateCounter > 10) + m_signalStateCounter = 0; + + signalStatus.iSignal = m_iSignal; + signalStatus.iSNR = m_iSNR; + signalStatus.iBER = m_signalStateCounter; + PVR_STRCPY(signalStatus.strAdapterStatus, "timeshifting"); // hardcoded for now... + + + if (m_iCurrentCard >= 0) + { + // Try to determine the name of the tv/radio card from the local card cache + Card currentCard; + if (m_cCards.GetCard(m_iCurrentCard, currentCard) == true) + { + PVR_STRCPY(signalStatus.strAdapterName, currentCard.Name.c_str()); + return PVR_ERROR_NO_ERROR; + } + } + + PVR_STRCLR(signalStatus.strAdapterName); + return PVR_ERROR_NO_ERROR; } @@ -1885,7 +1929,7 @@ } } -void cPVRClientMediaPortal::PauseStream(bool bPaused) +void cPVRClientMediaPortal::PauseStream(bool UNUSED(bPaused)) { if (m_tsreader) m_tsreader->Pause(); @@ -1924,14 +1968,10 @@ XBMC->Log(LOG_DEBUG, "Loading card settings"); /* Retrieve card settings (needed for Live TV and recordings folders) */ - if ( g_iTVServerXBMCBuild >= 106 ) - { - int code; - vector lines; + vector lines; - if ( SendCommand2("GetCardSettings\n", code, lines) ) - { - m_cCards.ParseLines(lines); - } + if ( SendCommand2("GetCardSettings\n", lines) ) + { + m_cCards.ParseLines(lines); } } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/pvrclient-mediaportal.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/pvrclient-mediaportal.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/pvrclient-mediaportal.h 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/pvrclient-mediaportal.h 2014-05-04 06:40:43.000000000 +0000 @@ -39,7 +39,7 @@ cPVRClientMediaPortal(); ~cPVRClientMediaPortal(); - /* TVServerXBMC Listening Thread */ + /* VTP Listening Thread */ static void* Process(void*); /* Server handling */ @@ -55,7 +55,7 @@ PVR_ERROR GetBackendTime(time_t *localTime, int *gmtOffset); /* EPG handling */ - PVR_ERROR GetEpg(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart = NULL, time_t iEnd = NULL); + PVR_ERROR GetEpg(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart = 0, time_t iEnd = 0); /* Channel handling */ int GetNumChannels(void); @@ -129,10 +129,13 @@ PLATFORM::CMutex m_mutex; int64_t m_iLastRecordingUpdate; CTsReader* m_tsreader; + int m_signalStateCounter; + int m_iSignal; + int m_iSNR; void Close(); //Used for TV Server communication: std::string SendCommand(std::string command); - bool SendCommand2(std::string command, int& code, std::vector& lines); + bool SendCommand2(std::string command, std::vector& lines); }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/recordings.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/recordings.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/recordings.h 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/recordings.h 2014-05-04 06:40:43.000000000 +0000 @@ -80,6 +80,7 @@ int Lifetime(void) const; int TimesWatched(void) const {return m_timesWatched; } int LastPlayedPosition(void) const { return m_lastPlayedPosition; } + bool IsRecording(void) {return m_isRecording; } /** * \brief Filename of this recording with full path (at server side) diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/Socket.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/Socket.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/Socket.cpp 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/Socket.cpp 2014-05-04 06:40:43.000000000 +0000 @@ -182,7 +182,11 @@ socklen_t addr_length = sizeof( _sockaddr ); new_socket._sd = ::accept(_sd, const_cast( (const sockaddr*) &_sockaddr), &addr_length ); +#ifdef TARGET_WINDOWS + if (new_socket._sd == INVALID_SOCKET) +#else if (new_socket._sd <= 0) +#endif { errormessage( getLastError(), "Socket::accept" ); return false; @@ -295,19 +299,18 @@ { fd_set set_r, set_e; timeval timeout; - int result; int retries = 6; char buffer[2048]; - size_t pos1 = 0; if (!is_valid()) return false; while (true) { - if ((pos1 = line.find("\r\n", 0)) != std::string::npos) + size_t pos1 = line.find("\r\n", 0); + if (pos1 != std::string::npos) { - line.erase(pos1, string::npos); + line.erase(pos1, string::npos); return true; } @@ -319,7 +322,7 @@ FD_ZERO(&set_e); FD_SET(_sd, &set_r); FD_SET(_sd, &set_e); - result = select(FD_SETSIZE, &set_r, NULL, &set_e, &timeout); + int result = select(FD_SETSIZE, &set_r, NULL, &set_e, &timeout); if (result < 0) { @@ -378,9 +381,7 @@ int Socket::receive ( char* data, const unsigned int buffersize, const unsigned int minpacketsize ) const { - unsigned int receivedsize = 0; - int status = 0; if ( !is_valid() ) { @@ -389,7 +390,7 @@ while ( (receivedsize <= minpacketsize) && (receivedsize < buffersize) ) { - status = ::recv(_sd, data+receivedsize, (buffersize - receivedsize), 0 ); + int status = ::recv(_sd, data+receivedsize, (buffersize - receivedsize), 0 ); if ( status == SOCKET_ERROR ) { @@ -404,7 +405,7 @@ } -int Socket::recvfrom ( char* data, const int buffersize, const int minpacketsize, struct sockaddr* from, socklen_t* fromlen) const +int Socket::recvfrom ( char* data, const int buffersize, struct sockaddr* from, socklen_t* fromlen) const { int status = ::recvfrom(_sd, data, buffersize, 0, from, fromlen); @@ -608,7 +609,7 @@ } } -#elif defined TARGET_LINUX || defined TARGET_DARWIN +#elif defined TARGET_LINUX || defined TARGET_DARWIN || defined TARGET_FREEBSD bool Socket::set_non_blocking ( const bool b ) { int opts; @@ -720,6 +721,6 @@ { // Not needed for Linux } -#endif //TARGET_WINDOWS || TARGET_LINUX || TARGET_DARWIN +#endif //TARGET_WINDOWS || TARGET_LINUX || TARGET_DARWIN || TARGET_FREEBSD } //namespace MPTV diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/Socket.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/Socket.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/Socket.h 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/Socket.h 2014-01-28 20:43:50.000000000 +0000 @@ -84,7 +84,7 @@ enum SocketDomain { - #if defined TARGET_LINUX || defined TARGET_DARWIN + #if defined TARGET_LINUX || defined TARGET_DARWIN || defined TARGET_FREEBSD pf_unix = PF_UNIX, pf_local = PF_LOCAL, #endif @@ -262,12 +262,11 @@ * * \param data Pointer to a character array of size buffersize. Used to store the received data. * \param buffersize Size of the 'data' buffer - * \param minpacketsize Do not return before at least 'minpacketsize' bytes are in the buffer. * \param from Optional: pointer to a sockaddr struct that will get the address from which the data is received * \param fromlen Optional, only required if 'from' is given: length of from struct * \return Number of bytes received or SOCKET_ERROR */ - int recvfrom ( char* data, const int buffersize, const int minpacketsize, struct sockaddr* from = NULL, socklen_t* fromlen = NULL) const; + int recvfrom ( char* data, const int buffersize, struct sockaddr* from = NULL, socklen_t* fromlen = NULL) const; bool set_non_blocking ( const bool ); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/timers.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/timers.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/timers.cpp 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/timers.cpp 2014-05-04 06:40:43.000000000 +0000 @@ -410,32 +410,17 @@ XBMC->Log(LOG_DEBUG, "End time: %s, marginstop: %i min later", asctime(&endtime), m_postrecordinterval); keepdate = *localtime( &m_keepdate ); - if ( g_iTVServerXBMCBuild >= 100) - { - // Sending separate marginStart, marginStop and schedType is supported - snprintf(command, 1023, "AddSchedule:%i|%s|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i\n", - m_channel, //Channel number [0] - uri::encode(uri::PATH_TRAITS, m_title).c_str(), //Program title [1] - starttime.tm_year + 1900, starttime.tm_mon + 1, starttime.tm_mday, //Start date [2..4] - starttime.tm_hour, starttime.tm_min, starttime.tm_sec, //Start time [5..7] - endtime.tm_year + 1900, endtime.tm_mon + 1, endtime.tm_mday, //End date [8..10] - endtime.tm_hour, endtime.tm_min, endtime.tm_sec, //End time [11..13] - (int) m_schedtype, m_priority, (int) m_keepmethod, //SchedType, Priority, keepMethod [14..16] - keepdate.tm_year + 1900, keepdate.tm_mon + 1, keepdate.tm_mday, //Keepdate [17..19] - keepdate.tm_hour, keepdate.tm_min, keepdate.tm_sec, //Keeptime [20..22] - m_prerecordinterval, m_postrecordinterval); //Prerecord,postrecord [23,24] - } - else - { - // Sending a separate marginStart, marginStop and schedType is not yet supported - snprintf(command, 1023, "AddSchedule:%i|%s|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i\n", - m_channel, //Channel number - uri::encode(uri::PATH_TRAITS, m_title).c_str(), //Program title - starttime.tm_year + 1900, starttime.tm_mon + 1, starttime.tm_mday, //Start date - starttime.tm_hour, starttime.tm_min, starttime.tm_sec, //Start time - endtime.tm_year + 1900, endtime.tm_mon + 1, endtime.tm_mday, //End date - endtime.tm_hour, endtime.tm_min, endtime.tm_sec); //End time - } + snprintf(command, 1023, "AddSchedule:%i|%s|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i\n", + m_channel, //Channel number [0] + uri::encode(uri::PATH_TRAITS, m_title).c_str(), //Program title [1] + starttime.tm_year + 1900, starttime.tm_mon + 1, starttime.tm_mday, //Start date [2..4] + starttime.tm_hour, starttime.tm_min, starttime.tm_sec, //Start time [5..7] + endtime.tm_year + 1900, endtime.tm_mon + 1, endtime.tm_mday, //End date [8..10] + endtime.tm_hour, endtime.tm_min, endtime.tm_sec, //End time [11..13] + (int) m_schedtype, m_priority, (int) m_keepmethod, //SchedType, Priority, keepMethod [14..16] + keepdate.tm_year + 1900, keepdate.tm_mon + 1, keepdate.tm_mday, //Keepdate [17..19] + keepdate.tm_hour, keepdate.tm_min, keepdate.tm_sec, //Keeptime [20..22] + m_prerecordinterval, m_postrecordinterval); //Prerecord,postrecord [23,24] return command; } @@ -453,41 +438,25 @@ XBMC->Log(LOG_DEBUG, "End time: %s, marginstop: %i min later", asctime(&endtime), m_postrecordinterval); keepdate = *localtime( &m_keepdate ); - if ( g_iTVServerXBMCBuild >= 100) - { - // Sending separate marginStart, marginStop and schedType is supported - snprintf(command, 1024, "UpdateSchedule:%i|%i|%i|%s|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i\n", - m_index, //Schedule index [0] - m_active, //Active [1] - m_channel, //Channel number [2] - uri::encode(uri::PATH_TRAITS,m_title).c_str(), //Program title [3] - starttime.tm_year + 1900, starttime.tm_mon + 1, starttime.tm_mday, //Start date [4..6] - starttime.tm_hour, starttime.tm_min, starttime.tm_sec, //Start time [7..9] - endtime.tm_year + 1900, endtime.tm_mon + 1, endtime.tm_mday, //End date [10..12] - endtime.tm_hour, endtime.tm_min, endtime.tm_sec, //End time [13..15] - (int) m_schedtype, m_priority, (int) m_keepmethod, //SchedType, Priority, keepMethod [16..18] - keepdate.tm_year + 1900, keepdate.tm_mon + 1, keepdate.tm_mday, //Keepdate [19..21] - keepdate.tm_hour, keepdate.tm_min, keepdate.tm_sec, //Keeptime [22..24] - m_prerecordinterval, m_postrecordinterval, m_progid); //Prerecord,postrecord,program_id [25,26,27] - } - else - { - snprintf(command, 1024, "UpdateSchedule:%i|%i|%i|%s|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i\n", - m_index, //Schedule index - m_active, //Active - m_channel, //Channel number - uri::encode(uri::PATH_TRAITS,m_title).c_str(), //Program title - starttime.tm_year + 1900, starttime.tm_mon + 1, starttime.tm_mday, //Start date - starttime.tm_hour, starttime.tm_min, starttime.tm_sec, //Start time - endtime.tm_year + 1900, endtime.tm_mon + 1, endtime.tm_mday, //End date - endtime.tm_hour, endtime.tm_min, endtime.tm_sec); //End time - } + snprintf(command, 1024, "UpdateSchedule:%i|%i|%i|%s|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i|%i\n", + m_index, //Schedule index [0] + m_active, //Active [1] + m_channel, //Channel number [2] + uri::encode(uri::PATH_TRAITS,m_title).c_str(), //Program title [3] + starttime.tm_year + 1900, starttime.tm_mon + 1, starttime.tm_mday, //Start date [4..6] + starttime.tm_hour, starttime.tm_min, starttime.tm_sec, //Start time [7..9] + endtime.tm_year + 1900, endtime.tm_mon + 1, endtime.tm_mday, //End date [10..12] + endtime.tm_hour, endtime.tm_min, endtime.tm_sec, //End time [13..15] + (int) m_schedtype, m_priority, (int) m_keepmethod, //SchedType, Priority, keepMethod [16..18] + keepdate.tm_year + 1900, keepdate.tm_mon + 1, keepdate.tm_mday, //Keepdate [19..21] + keepdate.tm_hour, keepdate.tm_min, keepdate.tm_sec, //Keeptime [22..24] + m_prerecordinterval, m_postrecordinterval, m_progid); //Prerecord,postrecord,program_id [25,26,27] return command; } -int cTimer::XBMC2MepoPriority(int xbmcprio) +int cTimer::XBMC2MepoPriority(int UNUSED(xbmcprio)) { // From XBMC side: 0.99 where 0=lowest and 99=highest priority (like VDR). Default value: 50 // Meaning of the MediaPortal field is unknown to me. Default seems to be 0. @@ -495,7 +464,7 @@ return 0; } -int cTimer::Mepo2XBMCPriority(int mepoprio) +int cTimer::Mepo2XBMCPriority(int UNUSED(mepoprio)) { return 50; //Default value } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/uri.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/uri.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/uri.h 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/uri.h 2014-05-04 06:40:43.000000000 +0000 @@ -32,10 +32,10 @@ /// Traits used for parsing and encoding components. struct traits { - char* begin_cstring; ///< begin cstring (or 0 if none) - char begin_char; ///< begin char (or 0 if none) - char end_char; ///< end char (or 0 if none) - char char_class[256]; ///< map of char to class + const char* begin_cstring; ///< begin cstring (or 0 if none) + const char begin_char; ///< begin char (or 0 if none) + const char end_char; ///< end char (or 0 if none) + const char char_class[256]; ///< map of char to class }; /** diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/utils.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/utils.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/utils.h 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/utils.h 2014-05-04 06:40:43.000000000 +0000 @@ -20,7 +20,7 @@ #include #include #include "uri.h" -#include "platform/util//util.h" +#include "platform/util/util.h" #ifdef TARGET_WINDOWS #include "platform/util/StdString.h" @@ -55,6 +55,19 @@ std::string ToXBMCPath(const std::string& strFileName); std::string ToWindowsPath(const std::string& strFileName); +/** + * @brief Macro to silence unused parameter warnings + */ +#ifdef UNUSED +# undef UNUSED +#endif +#ifdef __GNUC__ +# define UNUSED(x) UNUSED_ ## x __attribute__((__unused__)) +#else +# define UNUSED(x) /* x */ +#endif + + #if defined(TARGET_WINDOWS) namespace UTF8Util { diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/windows/FileUtils.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/windows/FileUtils.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/windows/FileUtils.cpp 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/windows/FileUtils.cpp 2014-05-04 06:40:43.000000000 +0000 @@ -1,3 +1,22 @@ +/* + * Copyright (C) 2005-2014 Team XBMC + * http://www.xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + #include "../FileUtils.h" #include "platform/os.h" #include diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/windows/WindowsUtils.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/windows/WindowsUtils.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/windows/WindowsUtils.cpp 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/windows/WindowsUtils.cpp 2014-05-04 06:40:43.000000000 +0000 @@ -1,3 +1,22 @@ +/* + * Copyright (C) 2005-2014 Team XBMC + * http://www.xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + #include "WindowsUtils.h" #include #include @@ -11,7 +30,6 @@ { OSVERSIONINFOEX osvi; SYSTEM_INFO si; - PGNSI GetNativeSystemInfo; BOOL bOsVersionInfoEx; ZeroMemory(&si, sizeof(SYSTEM_INFO)); @@ -27,6 +45,7 @@ if (NULL != kernel32_dll) { + PGNSI GetNativeSystemInfo; GetNativeSystemInfo = (PGNSI) GetProcAddress( kernel32_dll, "GetNativeSystemInfo"); if (NULL != GetNativeSystemInfo) GetNativeSystemInfo(&si); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/windows/WindowsUtils.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/windows/WindowsUtils.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mediaportal.tvserver/src/windows/WindowsUtils.h 2012-11-15 21:18:19.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/src/windows/WindowsUtils.h 2014-05-04 06:40:43.000000000 +0000 @@ -1,4 +1,22 @@ #pragma once +/* + * Copyright (C) 2005-2014 Team XBMC + * http://www.xbmc.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ #include diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/addon.xml.in xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/addon.xml.in --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/addon.xml.in 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/addon.xml.in 2014-05-04 06:40:43.000000000 +0000 @@ -1,41 +1,56 @@ - + XBMC voorprogram vir MythTV (gebruik libcmyth) XBMC frontend for MythTV (using libcmyth) + XBMC клиент за MythTV (използва libcmyth) + Frontal de l'XBMC pel MythTV (utilitzant libcmyth) Rozhraní XBMC pro MythTV (používající libcmyth) + Blaen XBMC ar gyfer MythTV (defmyddio libcmyth) XBMC frontend til MythTV (bruger libcmyth) - XBMC's Zugang zu MythTV (benutzt libcmyth) + XBMC Oberfläche für MythTV (auf Basis von libcmyth) Frontend του XBMC για το MythTV (με χρήση του libcmyth) XBMC frontend for MythTV (using libcmyth) + XBMC frontend for MythTV (using libcmyth) + XBMC frontend for MythTV (using libcmyth) Front-end de XBMC para MythTV (usando libcmyth) Front-end de XBMC para MythTV (usando libcmyth) XBMC frontend para MythTV (usando libmyth) + XBMC MythTV esi (kasutab libcmyth) Applicatif XBMC pour MythTV (utilise libcmyth) + Frontal XBMC pour MythTV (utilisant libcnyth) Interface de XBMC para MythTV (usando libcmyth) ממשק משתמש XBMC לMythTV (משתמש בlibcmyth) + XBMC pozadinski softver za MythTV (koristi libcmyth) XBMC MythTV előtér-kiszolgáló (libcmyth használatával) + Frontend XBMC untuk MythTV (Menggunakan libcmuth) Frontend di XBMC per MythTV (utilizzando libcmyth) MythTV 用 XBMC フロントエンド (libcmyth 使用) + XBMC სამომხმარებლო მხარე MythTV-თვის (გამოყენება libcmyth) MythTV XBMC 프론트엔드 (libcmyth 사용) XBMC sąsaja į MythTV (naudojant libcmyth) + XBMC galasistēma MythTV (izmanto libcmyth) XBMC интерфејс за MythTV (со користење libcmyth) + Bahagian hadapan XBMC untuk MythTV (menggunakan libcmyth) + MythTV အတွက် XBMC frontend (libcmythသုံးပြီး) XBMC frontend voor MythTV (maakt gebruik van libcmyth) + XBMC fremvisning for MythTV(bruker libcmyth) Interfejs XBMC dla MythTV (przy użyciu libcmyth) Frontend XBMC para MythTV (usando libcmyth) XBMC frontend para MythTV (usando libcmyth) @@ -44,55 +59,82 @@ XBMC rozhranie pre MythTV (používa knižnicu 'libcmyth') XBMC-jev vmesnik za MythTV (z uporabo libcmyth) XBMC gränssnitt till MythTV (via libcmyth) - XBMC的MythTV前端(使用libcmyth) - MythTV voorprogram (tot MythTV 0.26). Ondersteun stroom van Lewendige TV & Opnames, luister na Radio kanale, EPG en Tydhouers. - MythTV frontend (up to MythTV 0.26). Supports streaming of Live TV & Recordings, listening to Radio channels, EPG and Timers. - Rozhraní MythTV (do verze MythTV 0.26). Podporuje proudové vysílání živého vysílání a nahrávek, poslech kanálů rádia a EPG, a časovače. - MythTV frontend (op til MythTV 0.26) Understøtter streaming af Live TV & Optagelser, Radiokanaler, EPG samt tidsplaner. - MythTV Frontend (bis zu MythTV 0.26). Unterstützt das Streamen von Live TV & Aufnahmen, Hören von Radiokanälen, EPG und Timer. - Frontend για το MythTV (έως το MythTV 0.26). Υποστηρίζει ροές Live TV & Εγγραφές, ακρόαση Ραδιοφώνου, EPG και Χρονοδιακόπτες. - MythTV frontend (up to MythTV 0.26). Supports streaming of Live TV & Recordings, listening to Radio channels, EPG and Timers. - Front-end de MythTV (hasta MythTV 0.26). Soporte de transmisiones de TV en Vivo y Grabaciones, escuchar canales de Radio, Guía Electrónica de Programas (EPG) y Temporizadores. - Front-end de MythTV (hasta MythTV 0.26). Soporte de transmisiones de TV en Vivo y Grabaciones, escuchar canales de Radio, Guía Electrónica de Programas (EPG) y Temporizadores. - Applicatif MythTV (jusqu'à la version 0.26). Permet la diffusion de la télévision en direct, des enregistrements, des stations de radios, ainsi que le guide des programmes et les minuteries. - Interface de MythTV (maior da MythTV 0.26). Compatíbel coa transmisión de TV ao vivo, gravacións e escoita de canles de Radio, EPG e temporizadores. - ממשק קדמי MythTV (עד MythTV 0.26). תומך בשידור ממשק טלוויזיה והקלטה, האזנה לערוצי רדיו, לוח שידורים ותזמוני הקלטה. - MythTV előtér-kiszolgáló (MythTv 0.26 verzióig). Élő adások, felvételek,és rádió adások sugárzásának támogatása EPG-vel és időzítéssel. - Frontend MythTV (compatibile fino a MythTV 0.26). Supporta lo streaming di Live TV, le registrazioni, l'ascolto dei canali radio, EPG e i timer. - MythTV (バージョン 0.26 まで) のフロントエンドです。ライブ TV ストリーミング、録画、ラジオ放送の視聴、EPG、タイマーをサポートしています。 - MythTV 프론트엔드 (up to MythTV 0.26). 라이브 TV 스트리밍, 녹화, 라디오 채널 청취, EPG, 예약 지원. - MythTV sąsaja (kelias iki MythTV 0.26). Palaiko duomenų srautams pritaikyta(-as) Live TV & Recordings - MythTV интерфејс (се до MythTV 0.26). Подржува стриминг на Live TV & Снимки, слушање на радио канали, EPG и тајмери. - MythTV frontend (tot MythTV 0.26). Ondersteunt streaming van Live TV & opnames, luisteren naar radiokanalen, EPG en Timers. - Interfejs MythTV (do MythTV 0.26). Obsługuje strumieniowe przesyłanie na żywo TV & nagrań, słuchanie kanałów radiowych, EPG i wyłączniki czasowe. - Frontend MythTV (até MythTV 0.26). Permite transmissão ao vivo de Live Tv e gravações, ouvir estações de rádio, EPG e temporizadores. - MythTV frontend (up para MythTV 0.26). Suporta streaming de TV ao Vivo & Gravações, Escutar canais de rádios, EPG e Agendamentos. - Frontend MythTV (până la MythTV 0.25). Suportă difuzare în flux a televiziunii în direct și a înregistrăriilor, ascultarea posturilor de radio, EPG și Cronometre. - Фронтэнд MythTV (вплоть до MythTV 0.26). Поддерживает поточное ТВ и записи, прослушивание радио-каналов, ЕПГ и таймеры. - MythTV rozhranie (až do verzie MythTV 0.26). Podporuje streamovanie živého TV vysielania a nahrávok, počúvanie rozhlasových kanálov, EPG a časovače. - Vmesnik za MythTV (do vključno MythTV 0.26). Podpira pretakanje televizije v živo & posnetkov, poslušanje radia, EPG in časovnike. - MythTV frontend (upp till MythTV 0.26). Stödjer strömmning av direktsänd TV & inspelningar, radiolyssning, EPG och timers. - MythTV 前端 ( MythTV 0.26 及之后版本) 。支持直播电视和录像节目的流媒体转发,收听广播频道, 电子节目表及定时器功能。 + MythTV உடைய XBMC முன்னிலை (libcmyth பயன்படுத்தபட்டுள்ளது) + XBMC için MythTV (libcmyth kullanır) + Накладка XBMC для MythTV (з використанням libcmyth) + Giao tiếp XBMC cho MythTV (sử dụng libcmyth) + XBMC 的 MythTV 前端(使用 libcmyth) + MythTV的XBMC前端(使用libcmyth) + MythTV voorprogram (tot MythTV 0.27). Ondersteun stroom van Lewendige TV & Opnames, luister na Radio kanale, EPG en Tydhouers. + MythTV frontend (up to MythTV 0.27). Supports streaming of Live TV & Recordings, listening to Radio channels, EPG and Timers. + MythTV клиент (обновено до MythTV 0.27). Поддържа стрийминг и записване на телевизия, слушане на радио канали, електронен програмен справочник и броячи. + Rozhraní MythTV (do verze MythTV 0.27). Podporuje proudové vysílání živého vysílání a nahrávek, poslech kanálů rádia a EPG, a časovače. + Blaen MythTV (hyd at MythTV 0.27). Mae'n cynnal ffrydio Teledu Byw a Recordiadau, gwrando ar sianeli Radio, Rhaglennydd ac Amserlen Rhaglenni. + MythTV frontend (op til MythTV 0.27) Understøtter streaming af Live TV & Optagelser, Radiokanaler, EPG samt tidsplaner. + MythTV Frontend (bis zu MythTV 0.27). Unterstützt das Streamen von Live TV & Aufnahmen, Hören von Radiokanälen, EPG und Timer. + Frontend για το MythTV (έως το MythTV 0.27). Υποστηρίζει ροές Live TV & Εγγραφές, ακρόαση Ραδιοφώνου, EPG και Χρονοδιακόπτες. + MythTV frontend (up to MythTV 0.27). Supports streaming of Live TV & Recordings, listening to Radio channels, EPG and Timers. + MythTV frontend (up to MythTV 0.27). Supports streaming of Live TV & Recordings, listening to Radio channels, EPG and Timers. + MythTV frontend (up to MythTV 0.27). Supports streaming of Live TV & Recordings, listening to Radio channels, EPG and Timers. + Front-end de MythTV (hasta MythTV 0.27). Soporte de transmisiones de TV en Vivo y Grabaciones, escuchar canales de Radio, Guía Electrónica de Programas (EPG) y Temporizadores. + Front-end de MythTV (hasta MythTV 0.27). Soporte de transmisiones de TV en Vivo y Grabaciones, escuchar canales de Radio, Guía Electrónica de Programas (EPG) y Temporizadores. + MythTV esi (kuni MythTV 0.27). Toetab telekanalite edastamist ja salvestamist, raadio kuulamist, elektroonilist saatekava ja ajamõõtjaid. + Applicatif MythTV (jusqu'à la version 0.27). Permet la diffusion de la télévision en direct, des enregistrements, des stations de radios, ainsi que le guide des programmes et les minuteries. + Frontal de MythTV (jusqu'à MythTV 0.27) prenant en charge la lecture en transit des télés en direct & les enregistrements, l'écoute de chaînes radio, le GÉP et les minuteries. + Interface de MythTV (maior da MythTV 0.27). Compatíbel coa transmisión de TV ao vivo, gravacións e escoita de canles de Radio, Guía e temporizadores. + ממשק קדמי MythTV (עד MythTV 0.27). תומך בשידור ממשק טלוויזיה והקלטה, האזנה לערוצי רדיו, לוח שידורים ותזמוני הקלטה. + MythTV pozadinski softver (do MythTV 0.27). Podržava streamanje i snimanje TV programa, slušanje radio programa, elektronski programski vodič (EPG) i zakazana snimanja. + MythTV előtér-kiszolgáló (MythTv 0.27 verzióig). Élő adások, felvételek,és rádió adások sugárzásának támogatása EPG-vel és időzítéssel. + Frontend MythTV (hingga MythTV 0.27). Mendukung pengaliran Siaran TV Langsung dan perekaman, mendengarkan radio, EPG dan Timer. + Frontend MythTV (compatibile fino a MythTV 0.27). Supporta lo streaming di Live TV, le registrazioni, l'ascolto dei canali radio, EPG e i timer. + MythTV (バージョン 0.27 まで) のフロントエンドです。ライブ TV ストリーミング、録画、ラジオ放送の視聴、EPG、タイマーをサポートしています。 + MythTV სამომხმარებლო მხარე (MythTV 0.27-მდე). მხარს უჭერს Live TV სტრიმინგსა და ჩანაწერებს, Radio არხების მოსმენას, EPG-სა და თაიმერებს. + MythTV 프론트엔드 (up to MythTV 0.27). 라이브 TV 스트리밍, 녹화, 라디오 채널 청취, EPG, 예약 지원. + MythTV sąsaja (kelias iki MythTV 0.27). Palaiko duomenų srautams pritaikyta(-as) Live TV & Recordings + MythTV galasistēma (līdz MythTV 0.27). Atbalsta tiešraides TV un ierakstu straumēšanu, radio kanālu klausīšanos, EPG un taimerus. + MythTV интерфејс (се до MythTV 0.27). Подржува стриминг на Live TV & Снимки, слушање на радио канали, EPG и тајмери. + Bahagian hadapan MythTV (sehingga MythTV 0.27). Menyokong penstirman TV Langsung & Rakaman, mendengar saluran Radio, EPG dan Pemasa. + MythTV frontend (tot MythTV 0.27). Ondersteunt streaming van Live TV & opnames, luisteren naar radiokanalen, EPG en Timers. + Interfejs MythTV (do MythTV 0.27). Obsługuje strumieniowe przesyłanie TV na żywo oraz nagrań, pozwala na słuchanie kanałów radiowych, przeglądanie EPG i harmonogramów. + Frontend MythTV (até MythTV 0.27). Permite transmissão ao vivo de Live Tv e gravações, ouvir estações de rádio, EPG e temporizadores. + MythTV frontend (up para MythTV 0.27). Suporta streaming de TV ao Vivo & Gravações, Escutar canais de rádios, EPG e Agendamentos. + Frontend MythTV (până la MythTV 0.27). Suportă difuzare în flux a televiziunii în direct și a înregistrăriilor, ascultarea posturilor de radio, EPG și Cronometre. + Фронтэнд MythTV (вплоть до MythTV 0.27). Поддерживает поточное ТВ и записи, прослушивание радио-каналов, ЕПГ и таймеры. + MythTV rozhranie (až do verzie MythTV 0.27). Podporuje streamovanie živého TV vysielania a nahrávok, počúvanie rozhlasových kanálov, EPG a časovače. + Vmesnik za MythTV (do vključno MythTV 0.27). Podpira pretakanje televizije v živo & posnetkov, poslušanje radia, EPG in časovnike. + MythTV frontend (upp till MythTV 0.27). Stödjer strömmning av direktsänd TV & inspelningar, radiolyssning, EPG och timers. + MythTV 前端 ( MythTV 0.27 及之后版本) 。支持直播电视和录像流媒体、收听广播、电子节目单及定时器功能。 Hierdie is onstabiele sagteware! Die outeurs is op geen manier verantwoordelik vir gefaalde opnames, inkorrekte tydhouers, vermorsde ure, of enige ander ongewensde effekte. This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects. + Тази програма е нестабилна! Авторите не носят отговорност за неуспешно записване, некоректни броячи, пропиляното време и други нежелани ефекти. Tento software není stabilní. Autoři nejsou žádným způsobem zodpovědní za selhání při nahrávání, neplatné časovače, ztracený čas, či jakékoliv jiné nežádoucí události... + Mae hwn yn feddalwedd ansad! Nid yw'r awduron yn gyfrifol mewn unrhyw ffordd am fethu recordio, amseru gwallus, oriau wedi eu gwastraffu nac effeithiau anymunol eraill. Denne software er ustabil. Udviklerne er på ingen måde ansvarlige for mislykkede optagelser, fejlagtige tidsindstillinger, spildte timer eller andre uhensigtsmæssigheder. - Dies ist instabile Software! Die Autoren sind in keiner Weise verantwortlich für fehlgeschlagene Aufnahmen, falsche Timer, verschwendete Zeit oder andere ungewünschte Effekte. + Dies ist instabile Software! Die Autoren sind in keiner Weise verantwortlich für fehlgeschlagene Aufnahmen, falsche Timer, verschwendete Zeit oder andere unerwünschte Effekte. Ασταθές πρόγραμμα! Οι δημιουργοί δεν είναι σε καμία περίπτωση υπεύθυνοι για αποτυχημένες εγγραφές, λανθασμένους χρονοδιακόπτες, χαμένες ώρες, ή κάθε είδους ανεπιθύμητα αποτελέσματα. This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects. + This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects. + This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects. ¡Este software es inestable! Los autores no son en ningún caso responsables por grabaciones fallidas, temporizadores incorrectos, horas desperdiciadas o cualquier otro efecto indeseable. ¡Este software es inestable! Los autores no se responsabilizan por grabaciones fallidas, temporizadores incorrectos, horas perdidas, o cualquier otro efecto no deseado.. + See on ebastabiilne tarkvara! Autorid ei ole kuidagi moodi vastutavad nurjunud salvestiste, ebaõige aegrelee, raisatud tundide ega muude soovimatute asjade eest. Ce logiciel est en cours de développement. Les auteurs ne sont en aucun cas responsables de l'échec des enregistrements, minuteries erronées, temps perdu et autres effets indésirables. + Ce logiciel est instable! Les auteurs ne sont aucunement responsables des enregistrements défaillants, des minuteries erronées, des heures perdues ou tout autre effet indésirable. Este é software non estable, os autores non se fan responsábeis dos erros na gravacións, temporizadores incorrectos, e outros efectos non desexados. - זוהי תוכנה בלתי יציבה!מחברי התכנה אינם אחראים להקלטות כושלות,מתזמני הקלטות שגויים,שעות מבוזבזות,או כל תוצאה בלתי רצויה... + זוהי תוכנה בלתי יציבה! מחברי התכנה אינם אחראים להקלטות כושלות,מתזמני הקלטות שגויים,שעות מבוזבזות,או כל תוצאה בלתי רצויה... + Ovo je nestabilan softver! Autori nisu ni na koji način odgovorani za neuspjelo snimanje, netočna zakazana snimanja, izgubjene sate, ili bilo koje druge neželjene učinke... Ez nem stabil szoftver! A készítők nem vállalnak felelősséget, a hibás felvételért, rossz időzítésért, elvesztegetett időért... + Ini merupakan perangkat-lunak yang belum stabil. Penulis tidak bertanggung jawab untuk rekaman yang gagal, timer yang salah, waktu terbuang atau efek yang tidak diinginkan lainya. Questo software è instabile! Gli autori non sono in alcun modo responsabili per registrazioni fallite, timers incorretti, ore perse, o qualsiasi altro effetto indesiderato. これは不安定なソフトウェアです!本プログラムの作者は、録画の失敗、正確に作動しなかったタイマー、無駄にした時間、その他あらゆる好ましくない結果について責任を負わないものとします。 + ეს არის არასტაბილური პროგრამული უზრუნველყოფა! ავტორები არ არიან პასუხისმგებელი შეცდომებზე, არასწორ EPG-ზე, დაკარგულ დროზე ან სხვა ხარვეზებზე 완성되지 않은 소프트웨어입니다. 개발자는 녹화와 예약의 실패, 시간 허비나 다른 의도하지 않은 결과에 대한 책임을 지지 않습니다. Tai yra nestabili programinė įranga! Autorius jokiu būdu neatsako už nepavykusius įrašus, neteisingus laikmačius, iššvaistytas valandas, ar nutikus kitiems nepageidaujamiems poveikiams ...[COLOR=red](xbmc.lt rekomenduoja/siūlo testuojant šį priedą persijungti į Anglų [orinali] kalbą)[/COLOR] Ова е нестабилен софтвер! Авторите на ниту еден начин не одговараат за неуспешни снимки, неточни тајмери, потрошени часови, или било кои други несакани ефекти. + Ini merupakan perisian tidak stabil! Pengarang tidak bertanggungjawab atas kegagalan rakaman, pemasa tidak betul, masa yang dibazirkan, atau apa jua kesan yang tidak dikehendaki.. Dit is onstabiele software! De auteurs zijn op geen enkele wijze verantwoordelijk voor mislukte opnames, timers, verspilde tijd of enig ander ongewild bijeffect. - To oprogramowanie jest niestabilne! Autorzy w żaden sposób nie odpowiadają za nieudane nagrania, źle działające planowanie nagrań, stracone godziny czy też jakiekolwiek inne niepożądane efekty. + Dette er ustabil programvare! Forfatterene er på ingen måte ansvarlige for feilaktig opptak, ukorrekte timere, bortkastet tid, eller alle andre uønskede følger. + Oprogramowanie nadal jest w fazie rozwoju i jest niestabilne! Autorzy w żaden sposób nie są odpowiedzialni za nieudane nagrania, nieprawidłowe czasy EPG czy też jakiekolwiek inne niepożądane efekty oraz za Twój zmarnowany czas. Este software é instável! Os autores não se responsabilizam por falhas nas gravações, temporizadores incorrectos, horas perdidas ou outro qualquer efeito não desejado... Este é um software instável! Os autores não são responsáveis por falhas nas gravações, agendamentos incorretos, horas dispendidas, ou quaisquer outro efeito indesejado. Acest software nu este stabil! Autorii nu sunt responsabili în niciun caz pentru înregistrările eșuate, cronometre incorecte, ore pierdute sau orice alt efect nedorit. @@ -100,7 +142,12 @@ Toto nie je stabilný software! Autori nie sú zodpovední za zlýhané nahrávky, nesprávne časovače, premrhané hodiny a iné nežiadúce efekty. To je nestabilna programska oprema! Avtorji niso odgovorni za neuspela snemanja, nepravilne časovnike, zapravljen čas in katerikoli drug neželen učinek. Denna mjukvara är instabil! Utvecklarna är inte ansvariga för misslyckade inspelningar, felaktiga timers, bortkastade timmar eller några andra olyckliga effekter. - 这是不稳定版的软件!作者不对录制失败、错误定时造成时间浪费或其它不良影响负责。 + இந்த நிலையற்ற மென்பொருள்! தோல்வியடைந்தது பதிவுகள், தவறான டைமர்கள், வீணாகி மணி, அல்லது வேறு எந்த விரும்பத்தகாத விளைவுகலுக்கு இதன் ஆசிரியர்கள் பொறுப்பு இல்லை. + Bu yazılım stabil değildir! Yazılımcılar oynatma hatası, yanlış EPG tarihleri, hatalı saatler ya da diğer etkilerden sorumlu değiller. + Це нестабільна програма! Автор не несуть жодної відповідальності за зіпсуті записи, неправильні таймери, потрачений час, та інші небажані ефекти. + Đây là phần mềm không ổn định! Các tác giả sẽ không chịu trách nhiệm nào với các bản ghi thất bại, bị đặt giờ sai, giờ lãng phí, hoặc các tác dụng không mong muốn khác.. + 这是不稳定版的软件!作者不对录像失败、错误定时造成时间浪费或其它不良影响负责。 + 這是測試中的軟體!原創作者無法針對以下情況負責:包括錄影失敗,不正確的定時器,多餘的時數,或任何不可預期的不良影響。 @OS@ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/changelog.txt xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/changelog.txt --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/changelog.txt 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/changelog.txt 2014-05-04 06:40:43.000000000 +0000 @@ -1,10 +1,66 @@ -v1.6.10 +v1.9.16 +- Updated language files from Transifex + +v1.9.15 +- Updated language files from Transifex + +v1.9.14 +- Added demuxer (optional) + - Improved timeshifting (GetPlayingTime, GetBufferStart/EndTime) + - Faster channel switching +- Added possibility to start backend using Wake-on-LAN +- Added client actions + - Toogle visibility of recordings that are in state 'Not recording' + - Create special recording rules (series recording) +- Fixed compatibility with MythTV 0.27 backend + - Fixed channel icon download + - Fixed schedule management +- Fixed recognizing merged channels + +v1.9.13 +- add timeshift buffer functions + +v1.8.13 +- Fixed crash when reconnecting to the backend +- Fixed setting bookmarks when using MythTV 0.27 backend +- Fixed usage of priority values (>256) +- Fixed remaining time zone issues by using UTC based timestamps +- Schedule management refactoring + - Fixed recording rule deletion + - Fixed handling of backend version specific varieties + - Fixed failed mappings due to gaps in the EPG + - Various smaller improvements and bug fixes +- Provide accurate EDLs for videos with variable frame rate when using MythTV 0.27 backend +- Added 'Keep Live TV recording' functionality +- Improved start of Live TV playback + +v1.8.12 +- Added 'Delete and re-record' menuhook +- Added support for MythTV protocol 76 and 77 (MythTV 0.27) +- Allow the backend to shutdown (by using monitor and playback connections) +- Reduced startup time (Faster loading of channels) +- Fixed start time for instant recordings +- Fixed several smaller memory and multithreading issues +- Refactored & cleaned up libcmyth (epginfo) + +v1.8.11 +- sync with PVR API v1.8.0 + +v1.7.11 - Fixed crash when setting up Live TV (in rare cases) - Fixed issue with not updated recording list (Daylight Saving Time) - Fixed issue with empty recording list (caused by '[' character) - Fixed playback of recordings made by a slave backend - Removed 'Failed to connect to MythTV Backend' notification +v1.7.10 +- Get last played position for recordings from the server + +v1.7.9 +- Provide EDLs if available (commercial skip data cut lists) + Currently only works for videos with constant frame +- Disconnect from / reconnect to backend when XBMC goes to / resumes from standby + v1.6.9 - Added Live TV vs. recording conflict handling - Fixed recovering from backend connection loss on Windows diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Afrikaans/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Afrikaans/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Afrikaans/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Afrikaans/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Afrikaans (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/af/)\n" +"Language-Team: Afrikaans (http://www.transifex.com/projects/p/xbmc-main/language/af/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,23 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Laat Lewendige TV toe om geskeduleerde vertonings te skuif" + +msgctxt "#30019" +msgid "General" +msgstr "Algemeen" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Gevorderde" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Kanaal beskikbaar" + +msgctxt "#30310" +msgid "Enabled" +msgstr "In staat gestel" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Nie in staat gestel" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Albanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Albanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Albanian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Albanian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,37 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Albanian (http://www.transifex.com/projects/p/xbmc-main/language/sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30019" +msgid "General" +msgstr "I përgjithsëm" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Të shtuar" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Kanali i padisponueshëm" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Aktivuar" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Deaktivuar" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Amharic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Amharic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Amharic/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Amharic/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,69 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Amharic (http://www.transifex.com/projects/p/xbmc-main/language/am/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: am\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30019" +msgid "General" +msgstr "ባጠቃላይ" + +msgctxt "#30020" +msgid "Template provider" +msgstr "ቴምፕሌት አቅራቢ" + +msgctxt "#30021" +msgid "Internal" +msgstr "የ ውስጥ" + +msgctxt "#30025" +msgid "Internal template" +msgstr "የ ውስጥ ቴምፕሌት" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "የ ተጠቃሚ ስራ ማስኬጃ #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "የ ተጠቃሚ ስራ ማስኬጃ #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "የ ተጠቃሚ ስራ ማስኬጃ #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "የ ተጠቃሚ ስራ ማስኬጃ #4" + +msgctxt "#30050" +msgid "Advanced" +msgstr "የረቀቀ" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "ጣቢያው አልተገኘም" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "መቅረጫው ዝግጁ አይደለም" + +msgctxt "#30310" +msgid "Enabled" +msgstr "ተችሏል" + +msgctxt "#30311" +msgid "Disabled" +msgstr "ተሰናክሏል " diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Arabic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Arabic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Arabic/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Arabic/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,37 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Arabic (http://www.transifex.com/projects/p/xbmc-main/language/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +msgctxt "#30019" +msgid "General" +msgstr "عام" + +msgctxt "#30050" +msgid "Advanced" +msgstr "مُتقدم" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "محطة غير متوفرة" + +msgctxt "#30310" +msgid "Enabled" +msgstr "ممكن" + +msgctxt "#30311" +msgid "Disabled" +msgstr "معطلة" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Basque/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Basque/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Basque/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Basque/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,33 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Basque (http://www.transifex.com/projects/p/xbmc-main/language/eu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30019" +msgid "General" +msgstr "Orokorra" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Katea eskuraezina" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Gaituta" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Ezgaituta" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Belarusian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Belarusian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Belarusian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Belarusian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Belarusian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/be/)\n" +"Language-Team: Belarusian (http://www.transifex.com/projects/p/xbmc-main/language/be/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,23 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Allow Live TV to move scheduled shows" + +msgctxt "#30019" +msgid "General" +msgstr "General" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Advanced" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Channel unavailable" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Уключана" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Забаронена" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Bosnian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Bosnian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Bosnian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Bosnian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Bosnian (http://www.transifex.com/projects/p/xbmc-main/language/bs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bs\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30019" +msgid "General" +msgstr "Opšte" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Omogućeno" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Onemogućeno" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Bulgarian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Bulgarian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Bulgarian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Bulgarian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,225 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Bulgarian (http://www.transifex.com/projects/p/xbmc-main/language/bg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "MythTV Backend Hostname or IP" +msgstr "MythTV хост или IP адрес" + +msgctxt "#30001" +msgid "MythTV Backend Port" +msgstr "Порт за MythTV сървъра" + +msgctxt "#30002" +msgid "MythTV Database Username" +msgstr "Потребителско име за MythTV базата данни" + +msgctxt "#30003" +msgid "MythTV Database Password" +msgstr "Парола за MythTV базата данни" + +msgctxt "#30004" +msgid "MythTV Database Databasename" +msgstr "Име на базата данни за MythTV" + +msgctxt "#30005" +msgid "Include more debug information in the log file" +msgstr "Включи повече дебъгваща информация в дневника" + +msgctxt "#30006" +msgid "Enable Live TV" +msgstr "Включи Live TV" + +msgctxt "#30007" +msgid "Allow Live TV to move scheduled shows" +msgstr "Разреши Live TV да се превключва към планираното шоу" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Обработка на конфликти" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Предпочитай Live TV, при записване чрез по-бавния слот" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Предпочитай записването и спри Live TV" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Предпочитай Live TV и отмени конфликтния запис" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "Интернет адрес на MythTV сървъра (WOL)" + +msgctxt "#30019" +msgid "General" +msgstr "Главни" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Шаблон на доставчика" + +msgctxt "#30021" +msgid "Internal" +msgstr "Вътрешен" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Вътрешен шаблон" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Автоматично търсене на метаданни" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Маркирай новите записи като комерсиални" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Прекодирай новите записи" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Стартирай задача №1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Стартирай задача №2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Стартирай задача №3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Стартирай задача №4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Енкодер" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Да се разреши ли завършването на записа?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Шаблон за записване" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Допълнителни" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "Включи demuxing MPEG-TS" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Версия на протокола: %i - версия на базата данни: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Неуспешно свързване с MythTV сървъра" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Неуспешно свързване с MythTV базата данни" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Избубена е връзката с MythTV сървъра" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Връзка с MythTV е възстановена" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "MythTV сървъра не отговаря" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Каналът е недостъпен" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Записващото устройство е недостъпно" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Прекъсване на конфликтния запис: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Спиране на Live TV поради конфликтен запис: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Няма записи" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Включено" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Изключено" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "Няма открито излъчване" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Изтрий и повторно запиши" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Съхранявай LiveTV записите" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "Покажи/скрий правилата със статут 'Няма записи'" + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "Запис на всички предавания (този канал)" + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "Запис на това предаване всяка седмица" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "Запис на това предаване всеки ден" + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "Запис на едно предаване (всички канали)" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "Запис на всички нови епизоди (този канал)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Burmese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Burmese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Burmese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Burmese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,57 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Burmese (http://www.transifex.com/projects/p/xbmc-main/language/my/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "MythTV Backend Hostname or IP" +msgstr "MythTV Backend Hostname သို့မဟုတ် IP" + +msgctxt "#30001" +msgid "MythTV Backend Port" +msgstr "MythTV Backend Port" + +msgctxt "#30002" +msgid "MythTV Database Username" +msgstr "MythTV Database အသုံးပြုသူအမည်" + +msgctxt "#30003" +msgid "MythTV Database Password" +msgstr "MythTV Database စကားဝှက်" + +msgctxt "#30004" +msgid "MythTV Database Databasename" +msgstr "MythTV Database Database အမည်" + +msgctxt "#30006" +msgid "Enable Live TV" +msgstr "Live TV ကိုဖွင့်ထားမည်" + +msgctxt "#30019" +msgid "General" +msgstr "ယေဘုယျ" + +msgctxt "#30050" +msgid "Advanced" +msgstr "အဆင့်မြင့်သော" + +msgctxt "#30310" +msgid "Enabled" +msgstr "ဖွင့်ထားမည်" + +msgctxt "#30311" +msgid "Disabled" +msgstr "ပိတ်ထားမည်" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Catalan/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Catalan/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Catalan/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Catalan/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,121 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Catalan (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ca/)\n" +"Language-Team: Catalan (http://www.transifex.com/projects/p/xbmc-main/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30002" +msgid "MythTV Database Username" +msgstr "Nom d'usuari de la base de dades del MythTV" + +msgctxt "#30003" +msgid "MythTV Database Password" +msgstr "Contrasenya de la base de dades del MythTV" + +msgctxt "#30005" +msgid "Include more debug information in the log file" +msgstr "Inclou més informació de depuració en el fitxer de registre" + msgctxt "#30006" msgid "Enable Live TV" -msgstr "Activa la televisió en directe" +msgstr "Habilita la televisió en directe" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Preferència per gravar i parar la TV en directe" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Preferir la TV en directe i cancelar el conflicte en la gravació " + +msgctxt "#30019" +msgid "General" +msgstr "General" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Proveïdor de plantilla" + +msgctxt "#30021" +msgid "Internal" +msgstr "Intern" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Plantilla interna" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Transcodifica els enregistraments nous" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Executa la tasca de l'usuari #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Executa la tasca de l'usuari #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Executa la tasca de l'usuari #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Executa la tasca de l'usuari #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Transcodificador" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Plantilla de gravació " + +msgctxt "#30050" +msgid "Advanced" +msgstr "Avançat" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Versió del protocol: %i - versió de la base de dades: %i " + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Canal no disponible" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Gravadora no disponible" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Cancelant el conflicte en la gravació: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Parant la TV en directe durant el conflicte en la gravació: %s" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Habilitat" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Inhabilitat" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Chinese (Simple)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Chinese (Simple)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Chinese (Simple)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Chinese (Simple)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Chinese (Simple) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/zh/)\n" +"Language-Team: Chinese (Simple) (http://www.transifex.com/projects/p/xbmc-main/language/zh/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,27 +18,27 @@ msgctxt "#30000" msgid "MythTV Backend Hostname or IP" -msgstr "MythTV后端主机名或IP地址" +msgstr "MythTV 后端主机名或 IP 地址" msgctxt "#30001" msgid "MythTV Backend Port" -msgstr "MythTV后端端口" +msgstr "MythTV 后端端口" msgctxt "#30002" msgid "MythTV Database Username" -msgstr "MythTV数据库用户名" +msgstr "MythTV 数据库用户名" msgctxt "#30003" msgid "MythTV Database Password" -msgstr "MythTV数据库密码" +msgstr "MythTV 数据库密码" msgctxt "#30004" msgid "MythTV Database Databasename" -msgstr "MythTV数据库库名" +msgstr "MythTV 数据库库名" msgctxt "#30005" msgid "Include more debug information in the log file" -msgstr "log文件记录更多调试信息" +msgstr "日志文件记录更多调试信息" msgctxt "#30006" msgid "Enable Live TV" @@ -48,3 +47,179 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "允许直播电视移动预定节目" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "冲突处理" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "当录像推迟时继续直播电视" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "停止直播电视以继续录像" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "取消冲突录像以继续直播电视" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "MythTV 后端网络地址(WOL)" + +msgctxt "#30019" +msgid "General" +msgstr "常规" + +msgctxt "#30020" +msgid "Template provider" +msgstr "模板来源" + +msgctxt "#30021" +msgid "Internal" +msgstr "内置" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "内置模板" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "自动查找元数据" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "标记新录像" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "转码新录像" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "运行用户任务#1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "运行用户任务#2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "运行用户任务#3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "运行用户任务#4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "转码器" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "允许录像过期?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "录像模板" + +msgctxt "#30050" +msgid "Advanced" +msgstr "高级" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "启用分离 MPEG-TS" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "协议版本:%i - 数据库版本:%i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "连接 MythTV 后端失败" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "连接 MythTV 数据库失败" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "MythTV 后端连接丢失" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "MythTV 连接已恢复" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "MythTV 后端无响应" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "频道不可用" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "录像机不可用" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "正取消冲突录像:%s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "停止直播电视于冲突录像:%s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "未录制" + +msgctxt "#30310" +msgid "Enabled" +msgstr "启用" + +msgctxt "#30311" +msgid "Disabled" +msgstr "禁用" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "无播出" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "删除重新录像" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "保留直播电视录像" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "“未录制”状态显示/隐藏规则" + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "录制所有节目(此频道)" + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "每周录制此节目" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "每日录制此节目" + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "录制单个节目(所有频道)" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "录制所有新分集(此频道)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Chinese (Traditional)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Chinese (Traditional)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Chinese (Traditional)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Chinese (Traditional)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,177 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Chinese (Traditional) (http://www.transifex.com/projects/p/xbmc-main/language/zh_TW/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "MythTV Backend Hostname or IP" +msgstr "MythTV的後端主機名稱或IP" + +msgctxt "#30001" +msgid "MythTV Backend Port" +msgstr "MythTV的後端端口" + +msgctxt "#30002" +msgid "MythTV Database Username" +msgstr "MythTV 資料庫使用者名稱" + +msgctxt "#30003" +msgid "MythTV Database Password" +msgstr "MythTV 資料庫密碼" + +msgctxt "#30004" +msgid "MythTV Database Databasename" +msgstr "MythTV 資料庫數據名稱" + +msgctxt "#30005" +msgid "Include more debug information in the log file" +msgstr "在日誌檔案中包含更多除錯資訊" + +msgctxt "#30006" +msgid "Enable Live TV" +msgstr "啟用電視直播" + +msgctxt "#30007" +msgid "Allow Live TV to move scheduled shows" +msgstr "允許電視直播移動已排程節目" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "衝突處理" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "當錄影延遲時繼續直播電視" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "停止直播電視以繼續錄影" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "取消衝突錄影以繼續直播電視" + +msgctxt "#30019" +msgid "General" +msgstr "一般設定" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Template提供者" + +msgctxt "#30021" +msgid "Internal" +msgstr "內部的" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "內部的template" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "自動查找數據資料" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "對新錄影標示Commercial Flag" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "對新錄影進行轉碼" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "執行 User Job #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "執行 User Job #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "執行 User Job #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "執行 User Job #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "轉碼器" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "允許錄影到期?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "錄影範本" + +msgctxt "#30050" +msgid "Advanced" +msgstr "進階" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Protocol 版本: %i - 資料庫版本: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "連接MythTV後端失敗" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "連接MythTV資料庫失敗" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "MythTV後端連線斷失" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "MythTV連線已恢復" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "MythTV後端無回應" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "找不到頻道" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "錄影無法取得" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "取消衝突錄影:%s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "因衝突錄影而停止直播電視中:%s" + +msgctxt "#30310" +msgid "Enabled" +msgstr "啟用" + +msgctxt "#30311" +msgid "Disabled" +msgstr "關閉" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Croatian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Croatian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Croatian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Croatian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,225 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Croatian (http://www.transifex.com/projects/p/xbmc-main/language/hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "MythTV Backend Hostname or IP" +msgstr "MythTV naziv računala ili IP" + +msgctxt "#30001" +msgid "MythTV Backend Port" +msgstr "Ulaz MythTV pozadinskog softvera" + +msgctxt "#30002" +msgid "MythTV Database Username" +msgstr "Korisničko ime MythTV baze podataka" + +msgctxt "#30003" +msgid "MythTV Database Password" +msgstr "Lozinka MythTV baze podataka" + +msgctxt "#30004" +msgid "MythTV Database Databasename" +msgstr "Naziv MythTV baze podataka" + +msgctxt "#30005" +msgid "Include more debug information in the log file" +msgstr "Uključi više informacija otklanjanja greške u datoteku zapisa" + +msgctxt "#30006" +msgid "Enable Live TV" +msgstr "Omogući televiziju" + +msgctxt "#30007" +msgid "Allow Live TV to move scheduled shows" +msgstr "Omogući TV programu da pomiče rasporede emisija" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Sukob rukovanja" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Preferiraj gledanje televizije kada snimanje počine kasnije" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Preferiraj snimanje i zaustavi gledanje televizije" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Preferiraj gledanje televizije i poništi sukobljeno snimanje" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "Ethernet adresa (WOL) MythTV pozadinskog softvera" + +msgctxt "#30019" +msgid "General" +msgstr "Općenito" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Predložak usluga" + +msgctxt "#30021" +msgid "Internal" +msgstr "Unutarnji" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Unutarnji predložak" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Automatski potraži meta podatke" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Oznaka reklamiranja novog snimanja" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Enkôdiraj novo snimanje" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Pokreni korisnikov posao #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Pokreni korisnikov posao #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Pokreni korisnikov posao #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Pokreni korisnikov posao #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Enkôder" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Dopusti istek snimanja?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Predlošci snimanja" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Napredno" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "Omogući razdvajanje MPEG-TS" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Inačica protokola: %i - Inačica baze podataka: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Neuspjelo povezivanje s MythTV pozadinskim softverom" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Neuspjelo povezivanje na MythTV bazu podataka" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Povezivanje na MythTV pozadinski softver izgubljeno" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Povezivanje na MythTV pozadinski softver uspostavljeno" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Nema odgovora od MythTV pozadinskog softvera" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Program nedostupan" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Snimanje nedostupno" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Poništavanje sukobljenog snimanja: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Zaustavljanje gledanja televizije zbog sukoba snimanja: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Ne snima se" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Omogućeno" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Onemogućeno" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "Nema pronađenog emitiranja" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Obriši i ponovno snimi" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Nastavi snimanje TV programa" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "Sakrij/Prikaži pravila sa statusom 'Nije snimljeno'" + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "Snimi sve emisije (ovaj program)" + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "Snimi ovu emisiju svaki tjedan" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "Snimi ovu emisiju svaki dan" + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "Snimi jednu emisiju (svi programi)" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "Snimi sve nove epizode (svi programi)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Czech/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Czech/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Czech/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Czech/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Czech (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/cs/)\n" +"Language-Team: Czech (http://www.transifex.com/projects/p/xbmc-main/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,131 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Povolit Live TV přesovat naplánované pořady" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Řešení konfliktů" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Upřednostnit živé vysílání pokud má nahrávka pozdější slot" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Upřednostnit nahrávku a zastavit živé vysílání" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Upřednostnit živé vysílání a zrušit konfliktní nahrávku" + +msgctxt "#30019" +msgid "General" +msgstr "Obecné" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Poskytovatel šablon" + +msgctxt "#30021" +msgid "Internal" +msgstr "Interní" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Interní šablona" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Automaticky vyhledat metadata" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Označit reklamy v nových nahrávkách" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Překódovat nové nahrávky" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Spustit úlohu uživatele č. 1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Spustit úlohu uživatele č. 2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Spustit úlohu uživatele č. 3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Spustit úlohu uživatele č. 4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Převaděč" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Umožnit aby nahrávky vypršely?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Šablona nahrávání" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Pokročilé" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Verze protokolu: %i - Verze databáze: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Selhalo spojení s podpůrnou vrstvou MythTV" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Selhalo spojení s databází MythTV" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Spojení s podpůrnou vrstvou MythTV ztraceno" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Spojení s MythTV obnoveno" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Žádná odpověď od podpůrné vrstvy MythTV" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Kanál je nedostupný" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Rekordér není dostupný" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Ruším konfliktní nahrávku: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Zastavuji živé vysílání kvůli konfliktu s nahrávkou: %s" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Povoleno" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Zakázáno" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Danish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Danish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Danish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Danish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Danish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/da/)\n" +"Language-Team: Danish (http://www.transifex.com/projects/p/xbmc-main/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,143 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Tillad direkte TV at flytte planlagte programmer" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Konflikthåndtering" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Foretræk live TV når optagelse er senere" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Foretræk optagelse og stop Live TV" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Foretræk Live TV og aflys modstridende optagelser" + +msgctxt "#30019" +msgid "General" +msgstr "Generelt" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Skabelonleverandør" + +msgctxt "#30021" +msgid "Internal" +msgstr "Intern" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Intern skabelon" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Automatisk fundne Metadata" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Marker nye optagelser kommercielt" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Transkod nye optagelser" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Kør brugerjob #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Kør brugerjob #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Kør brugerjob #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Kør brugerjob #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Transkoder" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Tillad at optagelser udløber" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Optagelsesskabelon" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Udvidet" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Protokolversion: %i - Databaseversion: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Forbindelse til MythTV backend mislykket" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Forbindelse til MythTV database mislykket" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Forbindelse til MythTV backend mistet" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Forbindelse til MythTV genoprettet" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Inden reaktion fra MythTV backend" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Kanal utilgængelig" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Optager ikke tilgængelig" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Aflys modstridende optagelse: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Stopper Live TV på grund af modstridende optagelse: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Optager ikke" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Aktiveret" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Deaktiveret" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Slet og optag på ny" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Gem LiveTV optagelse" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Dutch/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Dutch/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Dutch/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Dutch/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Dutch (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/nl/)\n" +"Language-Team: Dutch (http://www.transifex.com/projects/p/xbmc-main/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,179 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Live TV toestaan geplande opnamen te verplaatsen" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Conflict afhandeling" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Geef voorkeur aan Live TV indien opname later begint" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Geef voorkeur aan opname en stop Live TV" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Geef voorkeur aan Live TV en annuleer conflicterende opname" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "MythTV Backend ethernet adres (WOL)" + +msgctxt "#30019" +msgid "General" +msgstr "Algemene instellingen" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Template provider" + +msgctxt "#30021" +msgid "Internal" +msgstr "interne" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Interne template" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Automatisch naar metadata zoeken" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Markeer reclames in nieuwe opnames" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Transcode nieuwe opnames" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Start Gebruikers Taak #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Start Gebruikers Taak #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Start Gebruikers Taak #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Start Gebruikers Taak #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Transcoder" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Sta opnames toe te expireren?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Opname template" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Geavanceerd" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "Activeer Demuxing MPEG-TS" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Protocol versie: %i - Database versie: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Verbinding met MythTV backend geslaagd" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Kan niet met MythTV database verbinden" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Verbinding met MythTV backend verbroken" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Verbinding met MythTV herstelt" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Geen antwoord van de MythTV backend" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Kanaal niet beschikbaar" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Opnameapparaat niet beschikbaar" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Annuleer conflicterende opname: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Live TV gestopt in verband met conflicterende opname: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "niet aan het opnemen" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Geactiveerd" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Uitgeschakeld" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "Geen uitzending gevonden" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Verwijder en her-opnemen" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Behoud LiveTV opname" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "Toon/verber regels met status 'niet aan het opnemen'" + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "Neem alle uitzendingen op (dit kanaal)" + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "Neem deze uitzending elke week op" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "Neem deze uitzending elke dag op" + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "neem een uitzending op (alle kanalen)" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "Neem alle nieuwe afleveringen op (dit kanaal)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/English/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/English/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/English/strings.po 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/English/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: English (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/en/)\n" +"Language-Team: English (http://www.transifex.com/projects/p/xbmc-main/language/en/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -66,6 +65,12 @@ msgid "Prefer Live TV and cancel conflicting recording" msgstr "" +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "" + +#empty strings from id 30013 to 30018 + msgctxt "#30019" msgid "General" msgstr "" @@ -82,6 +87,8 @@ msgid "MythTV" msgstr "" +#empty strings from id 30023 to 30024 + msgctxt "#30025" msgid "Internal template" msgstr "" @@ -122,15 +129,31 @@ msgid "Allow recordings to expire?" msgstr "" +#empty strings from id 30035 to 30048 + msgctxt "#30049" msgid "Recording template" msgstr "" +msgctxt "#30050" +msgid "Advanced" +msgstr "" + +#empty string with id 30051 + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "" + +#empty strings from id 30053 to 30099 + # Systeminformation labels msgctxt "#30100" msgid "Protocol version: %i - Database version: %i" msgstr "" +#empty strings from id 30101 to 30299 + # Notifications msgctxt "#30300" msgid "Failed to connect to MythTV backend" @@ -167,3 +190,58 @@ msgctxt "#30308" msgid "Stopping Live TV due to conflicting recording: %s" msgstr "" + +msgctxt "#30309" +msgid "Not recording" +msgstr "" + +msgctxt "#30310" +msgid "Enabled" +msgstr "" + +msgctxt "#30311" +msgid "Disabled" +msgstr "" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "" + +#empty strings from id 30313 to 30410 + +# Menu Hooks +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "" + +#empty strings from id 30413 to 30420 + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "" + +#empty strings from id 30422 to 30430 + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "" + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "" + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/English (Australia)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/English (Australia)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/English (Australia)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/English (Australia)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,225 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (Australia) (http://www.transifex.com/projects/p/xbmc-main/language/en_AU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "MythTV Backend Hostname or IP" +msgstr "MythTV Backend Hostname or IP" + +msgctxt "#30001" +msgid "MythTV Backend Port" +msgstr "MythTV Backend Port" + +msgctxt "#30002" +msgid "MythTV Database Username" +msgstr "MythTV Database Username" + +msgctxt "#30003" +msgid "MythTV Database Password" +msgstr "MythTV Database Password" + +msgctxt "#30004" +msgid "MythTV Database Databasename" +msgstr "MythTV Database Databasename" + +msgctxt "#30005" +msgid "Include more debug information in the log file" +msgstr "Include more debug information in the log file" + +msgctxt "#30006" +msgid "Enable Live TV" +msgstr "Enable Live TV" + +msgctxt "#30007" +msgid "Allow Live TV to move scheduled shows" +msgstr "Allow Live TV to move scheduled shows" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Conflict handling" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Prefer Live TV when recording has later slot" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Prefer recording and stop Live TV" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Prefer Live TV and cancel conflicting recording" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "MythTV Backend Ethernet address (WOL)" + +msgctxt "#30019" +msgid "General" +msgstr "General" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Template provider" + +msgctxt "#30021" +msgid "Internal" +msgstr "Internal" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Internal template" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Automatically Look Up Metadata" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Commercial Flag new recordings" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Transcode new recordings" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Run User Job #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Run User Job #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Run User Job #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Run User Job #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Transcoder" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Allow recordings to expire?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Recording template" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Advanced" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "Enable demuxing MPEG-TS" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Protocol version: %i - Database version: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Failed to connect to MythTV backend" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Failed to connect to MythTV database" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Connection to MythTV backend lost" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Connection to MythTV restored" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "No response from MythTV backend" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Channel unavailable" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Recorder unavailable" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Cancelling conflicting recording: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Stopping Live TV due to conflicting recording: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Not recording" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Enabled" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Disabled" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "No broadcast found" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Delete and re-record" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Keep LiveTV recording" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "Show/hide rules with status 'Not Recording'" + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "Record all showings (this channel)" + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "Record this showing every week" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "Record this showing every day" + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "Record one showing (all channels)" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "Record all new episodes (this channel)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/English (New Zealand)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/English (New Zealand)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/English (New Zealand)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/English (New Zealand)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,221 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (New Zealand) (http://www.transifex.com/projects/p/xbmc-main/language/en_NZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_NZ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "MythTV Backend Hostname or IP" +msgstr "MythTV Backend Hostname or IP" + +msgctxt "#30001" +msgid "MythTV Backend Port" +msgstr "MythTV Backend Port" + +msgctxt "#30002" +msgid "MythTV Database Username" +msgstr "MythTV Database Username" + +msgctxt "#30003" +msgid "MythTV Database Password" +msgstr "MythTV Database Password" + +msgctxt "#30004" +msgid "MythTV Database Databasename" +msgstr "MythTV Database Databasename" + +msgctxt "#30005" +msgid "Include more debug information in the log file" +msgstr "Include more debug information in the log file" + +msgctxt "#30006" +msgid "Enable Live TV" +msgstr "Enable Live TV" + +msgctxt "#30007" +msgid "Allow Live TV to move scheduled shows" +msgstr "Allow Live TV to move scheduled shows" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Conflict handling" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Prefer Live TV when recording has later slot" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Prefer recording and stop Live TV" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Prefer Live TV and cancel conflicting recording" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "MythTV Backend Ethernet address (WOL)" + +msgctxt "#30019" +msgid "General" +msgstr "General" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Template provider" + +msgctxt "#30021" +msgid "Internal" +msgstr "Internal" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Internal template" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Automatically Look Up Metadata" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Commercial Flag new recordings" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Transcode new recordings" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Run User Job #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Run User Job #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Run User Job #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Run User Job #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Transcoder" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Allow recordings to expire?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Recording template" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Advanced" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "Enable demuxing MPEG-TS" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Protocol version: %i - Database version: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Failed to connect to MythTV backend" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Failed to connect to MythTV database" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Connection to MythTV backend lost" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Connection to MythTV restored" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "No response from MythTV backend" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Channel unavailable" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Recorder unavailable" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Canceling conflicting recording: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Stopping Live TV due to conflicting recording: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Not recording" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Enabled" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Disabled" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "No broadcast found" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Delete and re-record" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "Show/hide rules with status 'Not Recording'" + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "Record all showings (this channel)" + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "Record this showing every week" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "Record this showing every day" + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "Record one showing (all channels)" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "Record all new episodes (this channel)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/English (US)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/English (US)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/English (US)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/English (US)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,37 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (US) (http://www.transifex.com/projects/p/xbmc-main/language/en_US/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_US\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30019" +msgid "General" +msgstr "General" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Advanced" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Channel unavailable" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Enabled" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Disabled" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Esperanto/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Esperanto/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Esperanto/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Esperanto/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Esperanto (http://www.transifex.com/projects/p/xbmc-main/language/eo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30019" +msgid "General" +msgstr "Generalo" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Enabled" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Disabled" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Estonian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Estonian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Estonian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Estonian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,189 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Estonian (http://www.transifex.com/projects/p/xbmc-main/language/et/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "MythTV Backend Hostname or IP" +msgstr "MythTV taustaprogrammi hosti nimi või IP" + +msgctxt "#30001" +msgid "MythTV Backend Port" +msgstr "MythTV taustaprogrammi port" + +msgctxt "#30002" +msgid "MythTV Database Username" +msgstr "MythTV andmebaasi kasutajanimi" + +msgctxt "#30003" +msgid "MythTV Database Password" +msgstr "MythTV andmebaasi salasõna" + +msgctxt "#30004" +msgid "MythTV Database Databasename" +msgstr "MythTV andmebaasi baasi nimi" + +msgctxt "#30005" +msgid "Include more debug information in the log file" +msgstr "Kaasa logifaili rohkem silumisinfot" + +msgctxt "#30006" +msgid "Enable Live TV" +msgstr "Võimalda TV" + +msgctxt "#30007" +msgid "Allow Live TV to move scheduled shows" +msgstr "Võimalda TVl liigutada plaanitud saateid" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Vastuolulisuse käsitlemine" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Kui salvestisel on viibiv sisselõige siis eelista Otse TV-d" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Eelista salvestamist ja peata Otse TV" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Eelists Otse TV-d ja loobu probleemsest salvestamisest" + +msgctxt "#30019" +msgid "General" +msgstr "Üldine" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Malli pakkuja" + +msgctxt "#30021" +msgid "Internal" +msgstr "Sisemine" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Sisemine mall" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Otsi metainfo automaatselt" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Märgista uues salvestises reklaamid" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Transkodeeri uued salvestised" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Käivita kasutaja töö #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Käivita kasutaja töö #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Käivita kasutaja töö #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Käivita kasutaja töö #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Transkodeerija" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Luba salvestistel aeguda?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Salvestus mall" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Põhjalikumad seaded" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Protokolli versioon: %i - Andmebaasi versioon: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Ühendumine MythTV taustaprogrammiga nurjus" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "MythTV andmebaasiga ühendumine nurjus" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Ühendus MythTV taustaprogrammiga katkes" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "MythTVga ühendus taastatud" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "MythTV taustprogramm ei vasta" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Kanal pole saadaval" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Salvestaja pole saadaval" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Probleemse salvestamise tühistamine: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Otse TV peatamine probleemse salvestuse tõttu: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Ei salvesta" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Lubatud" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Ei kasutata" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Kustuta ja salvesta uuesti" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Jätka OtseTV salvestamist" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Faroese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Faroese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Faroese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Faroese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,33 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Faroese (http://www.transifex.com/projects/p/xbmc-main/language/fo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30019" +msgid "General" +msgstr "Vanligt" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Rás er ikki tøk" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Virkin" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Sløkt" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Finnish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Finnish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Finnish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Finnish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Finnish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fi/)\n" +"Language-Team: Finnish (http://www.transifex.com/projects/p/xbmc-main/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -36,3 +35,27 @@ msgctxt "#30004" msgid "MythTV Database Databasename" msgstr "MythTV-tietokannan tietokantanimi" + +msgctxt "#30019" +msgid "General" +msgstr "Yleinen" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Lisäasetukset" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Kanava ei ole saatavilla" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Käytössä" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Ei käytössä" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/French/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/French/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/French/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/French/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: French (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fr/)\n" +"Language-Team: French (http://www.transifex.com/projects/p/xbmc-main/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,179 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Autorise le direct télévision à modifier la planification des programmes" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Gestion des conflits" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Préférer la TV en direct quand l'enregistrement a un créneau plus tard" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Préférer l'enregistrement et arrêter la TV en direct" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Préférer la TV en direct et annuler l'enregistrement en conflit" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "Adresse Ethernet du back-end MythTV (WOL)" + +msgctxt "#30019" +msgid "General" +msgstr "Général" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Fournisseur de modèle" + +msgctxt "#30021" +msgid "Internal" +msgstr "Interne" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Modèle interne" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Recherche automatique dans les métadonnées" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Marquer les nouveaux enregistrement \"avec pub\"" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Transcoder les nouveaux enregistrements" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Lancer la tâche utilisateur #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Lancer la tâche utilisateur #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Lancer la tâche utilisateur #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Lancer la tâche utilisateur #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Transcodeur" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Autoriser les enregistrements à expirer?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Modèle d'enregistrement" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Avancé" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "Activer le démultiplexage MPEG-TS" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Version du protocole: %i - Version de la base de données: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Impossible de se connecter au back-end MythTV" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Impossible de se connecter à la base de données MythTV" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Connexion au back-end MythTV perdue" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Connexion à MythTV rétablie" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Pas de réponse du back-end MythTV" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Chaîne indisponible" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Enregistreur non disponible" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Annuler l'enregistrement en conflit: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Arrêter la TV en direct pour l'enregistrement en conflit: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Pas d'enregistrement" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Activé" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Désactivé" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "Aucune diffusion trouvée" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Supprimer et réenregistrer" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Garder l'enregistrement sur la TV en direct" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "Montrer/cacher les règles avec statut 'Pas d'enregistrement'" + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "Enregistrer toutes les émissions (cette chaîne)" + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "Enregistrer cette émission toutes les semaines" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "Enregistrer cette émission tous les jours" + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "Enregistrer une émission (toutes les chaînes)" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "Enregistrer tous les nouveaux épisodes (cette chaîne)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/French (Canada)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/French (Canada)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/French (Canada)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/French (Canada)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,225 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: French (Canada) (http://www.transifex.com/projects/p/xbmc-main/language/fr_CA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_CA\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "MythTV Backend Hostname or IP" +msgstr "Nom d'hôte ou adresse IP de l'arrière-plan MythTV" + +msgctxt "#30001" +msgid "MythTV Backend Port" +msgstr "Port de l'arrière-plan MythTV" + +msgctxt "#30002" +msgid "MythTV Database Username" +msgstr "Nom d'utilisateur de la base de données MythTV" + +msgctxt "#30003" +msgid "MythTV Database Password" +msgstr "Mot de passe de la base de données MythTV" + +msgctxt "#30004" +msgid "MythTV Database Databasename" +msgstr "Nom de la base de données MythTV" + +msgctxt "#30005" +msgid "Include more debug information in the log file" +msgstr "Inclure plus d'informations de débogage dans le fichier journal" + +msgctxt "#30006" +msgid "Enable Live TV" +msgstr "Activer la télé en direct" + +msgctxt "#30007" +msgid "Allow Live TV to move scheduled shows" +msgstr "Permettre à la télé en direct de déplacer séries planifiées" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Gestion des conflits" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Préférer la télé en direct quand l'enregistrement a une tranche horaire ultérieure" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Préférer l'enregistrement et arrêter la télé en direct" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Préférer la télé en direct et arrêter les enregistrements en conflit" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "Adresse Ethernet (WOL) de l'arrière-plan MythTV" + +msgctxt "#30019" +msgid "General" +msgstr "Général" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Fournisseur de modèles" + +msgctxt "#30021" +msgid "Internal" +msgstr "Interne" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Modèle interne" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Rechercher automatiquement les métadonnées" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Marquer les publicités des nouveaux enregistrements" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Transcoder les nouveaux enregistrements" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Exécuter le travail d'utilisateur no 1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Exécuter le travail d'utilisateur no 2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Exécuter le travail d'utilisateur no 3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Exécuter le travail d'utilisateur no 4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Transcodeur" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Permettre l'expiration des enregistrements?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Modèle d'enregistrement" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Avancé" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "Activer le démultiplexage MPEG-TS" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Version du protocole : %i - version de la base de données : %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Échec lors de la connexion à l'arrière-plan MythTV" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Échec lors de la connexion à la base de données MythTV" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "La connexion à l'arrière-plan MythTV a été perdue" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "La connexion à MythTV a été récupérée" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Aucune réponse de l'arrière-plan MythTV" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Chaîne non disponible" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Enregistreur non disponible" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Annulation de l'enregistrement en conflit : %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Arrêt de la télé en direct dû à un enregistrement en conflit : %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "N'enregistre pas" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Activé" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Désactivé" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "Aucune diffusion trouvée" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Supprimer et ré-enregistrer" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Garder l'enregistrement de la télé en direct" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "Montrer/cacher les règles ayant un état « N'enregistre pas »" + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "Enregistrer toutes les présentations (cette chaîne)" + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "Enregistrer cette présentation toutes les semaines" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "Enregistrer cette présentation tous les jours" + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "Enregistrer une présentation (toutes les chaînes)" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "Enregistrer tous les nouveaux épisodes (cette chaîne)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Galician/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Galician/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Galician/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Galician/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Galician (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/gl/)\n" +"Language-Team: Galician (http://www.transifex.com/projects/p/xbmc-main/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,163 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Permitir á TV ao vivo mover as series programadas." + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Manipulación de conflitos" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Prefiro a TV ao vivo e deixar a gravación para máis tarde" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Prefiro a gravación e deter a TV ao vivo" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Prefiro a TV ao vivo e cancelar as gravacións en conflito" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "Enderezo IP do Motor MythTV (WOL)" + +msgctxt "#30019" +msgid "General" +msgstr "Xeral" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Provedor do modelo" + +msgctxt "#30021" +msgid "Internal" +msgstr "Interno" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Modelo interno" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Busar metadatos automaticamente" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Etiqueta de publicidade nas novas gravacións" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Transcodificar novas gravacións" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Executar o traballo #1 do Usuario" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Executar o traballo #2 do Usuario" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Executar o traballo #3 do Usuario" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Executar o traballo #4 do Usuario" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Transcodificador" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Permitir que expiren as gravacións?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Modelo de gravación" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Avanzado" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "Activar demux MPEG-TS" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Versión do protocolo: %i - Versión da Base de Datos: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Fallou a conexión co motor MythTV" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Fallou a conexión coa base de datos de MythTV" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Perdeuse a conexión co motor MythTV" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Restabeleceuse a conexión a MythTV" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Sen resposta do motor MythTV" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Canle non dispoñíbel" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Gravador non dispoñíbel" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Cancelando a gravación en conflito: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Detendo a TV ao vivo debido á gravación en conflito: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Non se está gravando" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Activado" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Desactivado" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "Non se atopou emisión" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Eliminar e volver gravar" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Manter a gravación do LiveTV" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "Amosar/Agochar regras co estado 'Sen Gravar'" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "Gravar todos os novos episodios (esta canle)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Georgian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Georgian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Georgian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Georgian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,173 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Georgian (http://www.transifex.com/projects/p/xbmc-main/language/ka/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ka\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "MythTV Backend Hostname or IP" +msgstr "MythTV სერვერული მხარის სახელი ან IP" + +msgctxt "#30001" +msgid "MythTV Backend Port" +msgstr "MythTV სერვერული მხარის პორტი" + +msgctxt "#30002" +msgid "MythTV Database Username" +msgstr "MythTV მონაცემთა ბაზის მომხმარებელი" + +msgctxt "#30003" +msgid "MythTV Database Password" +msgstr "MythTV მონაცემთა ბაზის პაროლი" + +msgctxt "#30004" +msgid "MythTV Database Databasename" +msgstr "MythTV მონაცემთა ბაზის ბაზის სახელი" + +msgctxt "#30005" +msgid "Include more debug information in the log file" +msgstr "ჩართე უფრო მეტი დებაგ ინფორმაცია ჟურნალში" + +msgctxt "#30006" +msgid "Enable Live TV" +msgstr "Live TV -ის ჩართვა" + +msgctxt "#30007" +msgid "Allow Live TV to move scheduled shows" +msgstr "ნება დართე Live TV-ს რომ გადაიტანოს დაგეგმილი გადაცემები" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "კონფლიქტების მოგვარება" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "არჩიე Live TV როცა ჩანაწერს აქვს უფრო გვიანდელი სლოტი" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "არჩიე ჩანაწერი და გამორთე Live TV" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "არჩიე Live TV და გააუქმე კონფლიქტური ჩაწერა" + +msgctxt "#30019" +msgid "General" +msgstr "მთავარი" + +msgctxt "#30020" +msgid "Template provider" +msgstr "შაბლონის მომწოდებელი" + +msgctxt "#30021" +msgid "Internal" +msgstr "შიდა" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "შიდა შაბლონი" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "მეტაინფორმაციის ავტომატური ძებნა" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "ახალი ჩანაწერების ტრანსკოდირება" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "გაუშვი მომხმარებლის დავალება #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "გაუშვი მომხმარებლის დავალება #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "გაუშვი მომხმარებლის დავალება #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "გაუშვი მომხმარებლის დავალება #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "ტრანსკოდერი" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "ჩანაწერებს გაუვიდეს ვადა?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "ჩაწერის შაბლონი" + +msgctxt "#30050" +msgid "Advanced" +msgstr "დამატებით" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "პროტოკოლის ვერსია: %i - მონაცემთ ბაზის ვერსია: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "ვერ ვუერთდები MythTV სერვერს" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "ვერ ვუერთდები MythTV მონაცემთა ბაზას" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "MythTV სერვერთან კავშირი გაწყდა" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "MythTV-თან კავშირი აღდგა" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "არ არის პასუხი MythTV სერვერისგან" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "არხი მიუწვდომელია" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "ჩამწერი მიუწვდომელი" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "უქმდება კონფლიქტური ჩანაწერი: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "ჩერდება Live TV კონფლიქტური ჩანაწერის გამო: %s" + +msgctxt "#30310" +msgid "Enabled" +msgstr "ჩართულია" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "წაშალე და თავიდან ჩაწერე" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/German/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/German/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/German/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/German/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: German (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/de/)\n" +"Language-Team: German (http://www.transifex.com/projects/p/xbmc-main/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,179 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Erlaube Live TV geplante Aufnahmen zu verschieben" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Konfliktbehandlung" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Bevorzuge Live TV, wenn Aufnahme später beginnt" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Bevorzuge Aufnahmen und unterbreche Live TV" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Bevorzuge Live TV und breche überschneidende Aufnahme ab" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "MythTV-Backend-Ethernet-Adresse (WOL)" + +msgctxt "#30019" +msgid "General" +msgstr "Allgemein" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Vorlagenanbieter" + +msgctxt "#30021" +msgid "Internal" +msgstr "Intern" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Interne Vorlage" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Automatisch Metadaten suchen" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Kennzeichne Werbung in neuen Aufnahmen" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Transkodiere neue Aufnahmen" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Starte benutzerdefinierten Job #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Starte benutzerdefinierten Job #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Starte benutzerdefinierten Job #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Starte benutzerdefinierten Job #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Transcoder" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Erlaube Aufnahmen abzulaufen?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Aufnahmevorlage" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Erweitert" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "Demuxen des MPEG-TS aktivieren" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Protokollversion: %i - Datenbankversion: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Konnte keine Verbindung zum MythTV Backend herstellen" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Konnte keine Verbindung mit der MythTV Datenbank herstellen" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Die Verbindung zum MythTV Backend wurde unterbrochen" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Verbindung zu MythTV wiederhergestellt" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Keine Antwort vom MythTV Backend" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Kanal nicht verfügbar" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Aufnahmegerät nicht verfügbar" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Breche überschneidende Aufnahme ab: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Unterbreche Live TV wegen überschneidender Aufnahme: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Keine Aufnahme" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Aktiviert" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Ausschalten" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "Keine Ausstrahlung gefunden" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Löschen und neu aufnehmen" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "LiveTV-Aufnahme beibehalten" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "Anzeigen/Verstecken von Regeln mit dem Status 'Keine Aufnahme'" + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "Alle Vorführungen aufzeichnen (dieser Sender)" + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "Diese Vorführung jede Woche aufzeichnen" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "Diese Vorführung jeden Tag aufzeichnen" + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "Eine Vorführung aufzeichnen (alle Sender)" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "Alle neuen Folgen aufzeichnen (dieser Sender)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Greek/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Greek/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Greek/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Greek/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Greek (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/el/)\n" +"Language-Team: Greek (http://www.transifex.com/projects/p/xbmc-main/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,179 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Να επιτρέπεται στο Live TV να μετακινεί προγραμματισμένες εκπομπές" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Διαχείριση διένεξης" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Να προτιμάται η Live TV όταν υπάρχει εγγραφή αργότερα" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Να προτιμάται η εγγραφή και να διακοπεί η Live TV" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Να προτιμάται η Live TV και να ακυρωθεί η εγγραφή που προκαλεί διένεξη" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "Διεύθυνση Ethernet του Backend MythTV (WOL)" + +msgctxt "#30019" +msgid "General" +msgstr "Γενικά" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Πάροχος προτύπων" + +msgctxt "#30021" +msgid "Internal" +msgstr "Εσωτερικό" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Εσωτερικό πρότυπο" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Αυτόματη Αναζήτηση Μεταδεδομένων" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Εμπορική Σήμανση νέων εγγραφών" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Διακωδικοποίηση νέων εγγραφών" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Εκτέλεση Εργασίας #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Εκτέλεση Εργασίας #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Εκτέλεση Εργασίας #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Εκτέλεση Εργασίας #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Διακωδικοποιητής" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Να επιτρέπεται η χρονική λήξη των εγγραφών;" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Πρότυπο εγγραφής" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Για προχωρημένους" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "Ενεργοποίηση διαχωρισμού (demux) MPEG-TS" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Έκδοση πρωτοκόλλου: %i - Έκδοση βάσης δεδομένων: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Αποτυχία σύνδεσης με το backend του MythTV" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Αποτυχία σύνδεσης με τη βάση δεδομένων του MythTV" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Απώλεια σύνδεσης με το backend του MythTV" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Αποκαταστάθηκε η σύνδεση με το MythTV" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Καμία απόκριση από το backend του MythTV" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Μη διαθέσιμο κανάλι" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Μη διαθέσιμος εγγραφέας" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Ακύρωση της εγγραφής που προκαλεί διένεξη: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Διακοπή της Live TV λόγω διένεξης με την εγγραφή: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Δεν γίνεται εγγραφή" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Ενεργό/ή" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Ανενεργή" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "Δε βρέθηκε εκπομπή" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Διαγραφή και επανεγγραφή" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Να συνεχίζεται η εγγραφή LiveTV" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "Εμφάνιση/Απόκρυψη κανόνων με ένδειξη 'Δε Γίνεται Εγγραφή'" + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "Εγγραφή όλων των εκπομπών (σε αυτό το κανάλι)" + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "Εγγραφή αυτής της εκπομπής κάθε εβδομάδα" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "Εγγραφή αυτής της εκπομπής κάθε μέρα" + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "Εγγραφή μίας εκπομπής (σε όλα τα κανάλια)" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "Εγγραφή όλων των νέων επεισοδίων (σε αυτό το κανάλι)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Hebrew/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Hebrew/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Hebrew/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Hebrew/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hebrew (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/he/)\n" +"Language-Team: Hebrew (http://www.transifex.com/projects/p/xbmc-main/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,151 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "אפשר לממשק טלוויזיה להזיז תכניות מתוזמנות" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "טיפול בהתנגשויות" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "העדף טלוויזיה חיה כאשר קיים שידור חוזר להקלטה" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "העדף הקלטה ועצירה של שידור חי" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "העדף שידור חי ובטל התנגשויות הקלטה" + +msgctxt "#30019" +msgid "General" +msgstr "כללי" + +msgctxt "#30020" +msgid "Template provider" +msgstr "ספק תבניות" + +msgctxt "#30021" +msgid "Internal" +msgstr "פנימי" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "תבנית פנימית" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "חיפוש אוטומטי של פרטי על" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "סמן פרסומות בהקלטות חדשות" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "קודד מחדש הקלטות חדשות" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "הרץ משימת משתמש #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "הרץ משימת משתמש #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "הרץ משימת משתמש #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "הרץ משימת משתמש #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "מקודד מחדש" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "אפשר פקיעת תוקף הקלטות?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "תבנית הקלטה" + +msgctxt "#30050" +msgid "Advanced" +msgstr "מתקדם" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "גרסת פרוטוקול: %i - גרסת מסד נתונים: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "ההתחברות למנגנון של MythTV נכשל" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "ההתחברות למסד הנתונים של MythTV נכשל" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "החיבור למנגנון של MythTV נקטע" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "החיבור למנגנון של MythTV שוחזר" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "לא התקבלה תגובה מהמנגנון של MythTV" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "ערוץ לא זמין" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "המקליט אינו זמין" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "ביטול התנגשויות בהקלטה: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "מפסיק טלוויזיה חיה עקב תעדוף הקלטה: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "לא מקליט" + +msgctxt "#30310" +msgid "Enabled" +msgstr "פעיל" + +msgctxt "#30311" +msgid "Disabled" +msgstr "מנוטרל" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "לא נמצא שידור" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "מחק והקלט שוב" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "השאר הקלטה" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "הקליטו את כל הפרקים החדשים (ערוץ זה)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Hindi (Devanagiri)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Hindi (Devanagiri)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Hindi (Devanagiri)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Hindi (Devanagiri)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,33 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Hindi (Devanagiri) (http://www.transifex.com/projects/p/xbmc-main/language/hi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30019" +msgid "General" +msgstr "सामान्य" + +msgctxt "#30050" +msgid "Advanced" +msgstr "उन्नत" + +msgctxt "#30310" +msgid "Enabled" +msgstr "सक्रिय" + +msgctxt "#30311" +msgid "Disabled" +msgstr "विकलांग" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Hungarian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Hungarian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Hungarian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Hungarian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hungarian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/hu/)\n" +"Language-Team: Hungarian (http://www.transifex.com/projects/p/xbmc-main/language/hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,179 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Az Élő TV elmozdíthatja az ütemezett műsorokat" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Konfliktuskezelés" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Élő tévé előnyben részesítése felvételkor" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Felvétel előnyben részesítése, Élő tv megállítása" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Élő tévé előnyben részesítése és a felvételi konfliktus törlése" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "MythTV háttérkiszolgáló ethernet cím (WOL)" + +msgctxt "#30019" +msgid "General" +msgstr "Menük" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Minta szolgáltató" + +msgctxt "#30021" +msgid "Internal" +msgstr "Belső" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Belső minta" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Metaadatok automatikus átnézése" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Új felvételek megjelölése" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Új felvételek átkódolása" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "User Job #1 futtatása" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "User Job #2 futtatása" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "User Job #3 futtatása" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "User Job #4 futtatása" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Átkódoló" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Engedélyezed a felvételek lejártát ?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Felvétel minta" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Haladó" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "Az MPEG-TS adatfolyamok szétválasztásának engedélyezése" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Protokol verzió: %i - Adatbázis verzió: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Nincs kapcsolat a MythTV-vel" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Nincs kapcsolat a MythTV adatbázissal" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "A kapcsolat a MythTV-vel megszakadt" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "A kapcsolat a MythTV-vel visszaállt" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "A MythTV nem válaszol" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "A csatorna nem elérhető" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Felvevő nem elérhető" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Felvételi konfliktus törlése: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Élő tv megállítása és a felvételi konfliktus törlése : %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Nem vesz fel" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Engedélyezve" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Letiltva" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "Nem található adás" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Törlés és újra-felvétel" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "LiveTV felvétel folyamatosan" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "Megjeleníti/Elrejti a szabályokat a 'nincs felvétel alatt'" + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "Minden műsor felvétele (ezen a csatornán)" + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "Ezt a műsort minden héten vegye fel" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "Ezt a műsort minden nap vegye fel" + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "Egy műsor felvétele (bármilyen csatornán)" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "Az összes új epizód felvétele (ezen a csatornán)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Icelandic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Icelandic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Icelandic/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Icelandic/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,37 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Icelandic (http://www.transifex.com/projects/p/xbmc-main/language/is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30006" +msgid "Enable Live TV" +msgstr "Virkja beina útsendingu" + +msgctxt "#30019" +msgid "General" +msgstr "Almennt" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Virkt" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Óvirkt" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Indonesian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Indonesian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Indonesian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Indonesian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,225 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Indonesian (http://www.transifex.com/projects/p/xbmc-main/language/id/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "MythTV Backend Hostname or IP" +msgstr "Hostname atau IP Backend MythTV" + +msgctxt "#30001" +msgid "MythTV Backend Port" +msgstr "Port Backend MythTV" + +msgctxt "#30002" +msgid "MythTV Database Username" +msgstr "Nama pengguna Database MythTV" + +msgctxt "#30003" +msgid "MythTV Database Password" +msgstr "Kata Kunci Database MythTV" + +msgctxt "#30004" +msgid "MythTV Database Databasename" +msgstr "Nama Database MythTV" + +msgctxt "#30005" +msgid "Include more debug information in the log file" +msgstr "Sertakan informasi debug yang lebih banyak ke dalam berkas log" + +msgctxt "#30006" +msgid "Enable Live TV" +msgstr "Aktifkan Siaran TV Langsung" + +msgctxt "#30007" +msgid "Allow Live TV to move scheduled shows" +msgstr "Perbolehkan Siaran TV Langsung mengeser acara terjadwal" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Penanganan Konflik" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Utamakan Siaran Langsung TV ketika perekaman mempunyai slot nanti." + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Utamakan perekaman dan hentikan Siaran Langsung TV." + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Utamakan Siaran Langsung TV dan batalkan perekaman yang bertabrakan" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "Alamat Ethernet Backend MythTV (WOL)" + +msgctxt "#30019" +msgid "General" +msgstr "Umum" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Penyedia Templat" + +msgctxt "#30021" +msgid "Internal" +msgstr "Internal" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Templat Internal" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Otomatis mencari metadata" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Deteksi iklan untuk rekaman baru" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Transkode rekaman baru" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Jalankan pekerjaan pengguna #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Jalankan pekerjaan pengguna #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Jalankan pekerjaan pengguna #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Jalankan pekerjaan pengguna #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Transkoder" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Perbolehkan rekaman untuk kedaluwarsa>" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Templat Rekaman" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Tingkat Lanjut" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "Aktifkan demuksing MPEG-TS" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Versi Protokol: %i - Versi Database: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Gagal mengkoneksikan dengan backend MythTV" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Gagal mengkoneksikan dengan database MythTV" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Koneksi ke backend MythTV terputus" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Koneksi ke MythTV tersambung kembali" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Tidak ada respon dari backend MythTV" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Saluran tak tersedia" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Perekam tidak tersedia" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Batalkan rekaman yang bertabrakan: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Hentikan Siaran Langsung TV karena bertabrakan dengan perekaman: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Tidak merekam" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Aktifkan" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Non Aktif" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "Tidak ada siaran yang ditemukan" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Hapus dan rekam ulang" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Pertahankan perekaman Siaran Langsung TV" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "Tampilkan/Sembunyikan aturan dengan status \"Tidak merekam\"" + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "Rekam semua acara (kanal ini)" + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "Rekam acara ini tiap minggu" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "Rekam acara ini setiap hari" + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "Rekam satu acara (semua kanal)" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "Rekam semua episode baru (kanal ini)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Italian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Italian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Italian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Italian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Italian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/it/)\n" +"Language-Team: Italian (http://www.transifex.com/projects/p/xbmc-main/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,143 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Consenti a TV Live di spostare gli spettacoli programmati" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Gestione conflitto" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Preferisci la TV dal Vivo quando la registrazione è spostata" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Preferisci la registrazione e ferma la TV dal Vivo" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Preferisci Live TV e cancella le registrazioni incompatibili" + +msgctxt "#30019" +msgid "General" +msgstr "Menu" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Fornitore modello" + +msgctxt "#30021" +msgid "Internal" +msgstr "Interno" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Modello interno" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Guarda automaticamente i Metadata" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Nuove registrazioni bandiere commerciali" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Transcodifica nuove registrazioni" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Esegui Processo User #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Esegui Processo User #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Esegui Processo User #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Esegui Processo User #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Transcodificatore" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Permetti alle registrazioni di scadere?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Modello registrazione" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Avanzate" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Versione Protocollo: %i - Versione Database: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Impossibile connettersi al backend di MythTV" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Impossibile connettersi al database di MythTV" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Connessione al backend MythTV persa" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Connessione a MythTV ripristinata" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Nessuna risposta dal backend di MythTV" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Canale non disponibile" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Registratore non disponibile" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Eliminazione delle registrazioni incompatibili: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Blocco di Live TV a causa di registrazioni incompatibili: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Nessuna registrazione in corso" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Abilitato" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Disabilitato" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Elimina e registra di nuovo" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Mantieni le registrazioni della LiveTV" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Japanese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Japanese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Japanese/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Japanese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Japanese (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ja/)\n" +"Language-Team: Japanese (http://www.transifex.com/projects/p/xbmc-main/language/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -44,3 +43,107 @@ msgctxt "#30006" msgid "Enable Live TV" msgstr "Live TV を有効に" + +msgctxt "#30007" +msgid "Allow Live TV to move scheduled shows" +msgstr "Live Tvがスケジュールされたショーの移動を許可する" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "コンフリクトの処理" + +msgctxt "#30019" +msgid "General" +msgstr "一般" + +msgctxt "#30021" +msgid "Internal" +msgstr "内部" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "内部テンプレート" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "メタデータを自動でロック" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "新しい録音をトランスコード" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "ユーザージョブ #1 を実行" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "ユーザージョブ #2 を実行" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "ユーザージョブ #3 を実行" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "ユーザージョブ #4 を実行" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "トランスコーダー" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "録音の期限切れを許可しますか?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "録画のテンプレート" + +msgctxt "#30050" +msgid "Advanced" +msgstr "高度な設定" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "プロトコルのバージョン: %i - データベースのバージョン: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "MythTV backendの接続に失敗しました。" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "MythTV データベースの接続に失敗しました。" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "MythTVバックエンドの接続を失った" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "MythTVの接続が復元された" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "MythTVバックエンドから応答がありません" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "チャンネル利用不可" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "レコーダーが使用できない" + +msgctxt "#30310" +msgid "Enabled" +msgstr "LCD有効" + +msgctxt "#30311" +msgid "Disabled" +msgstr "無効" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Korean/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Korean/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Korean/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Korean/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Korean (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ko/)\n" +"Language-Team: Korean (http://www.transifex.com/projects/p/xbmc-main/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,23 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "라이브 TV가 예약된 프로그램을 이동하도록 허용" + +msgctxt "#30019" +msgid "General" +msgstr "일반" + +msgctxt "#30050" +msgid "Advanced" +msgstr "고급" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "채널 사용할 수 없음" + +msgctxt "#30310" +msgid "Enabled" +msgstr "사용함" + +msgctxt "#30311" +msgid "Disabled" +msgstr "사용 안 함" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Latvian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Latvian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Latvian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Latvian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,101 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Latvian (http://www.transifex.com/projects/p/xbmc-main/language/lv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +msgctxt "#30000" +msgid "MythTV Backend Hostname or IP" +msgstr "MythTV aizmugursistēmas saimniekvārds vai IP" + +msgctxt "#30006" +msgid "Enable Live TV" +msgstr "Ieslēgt tiešraides TV" + +msgctxt "#30007" +msgid "Allow Live TV to move scheduled shows" +msgstr "Atļaut tiešraides TV pārcelt ieplānotus raidījumus" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Konfliktu apstrāde" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Dot priekšroku tiešraides TV, ja ierakstam ir vēlāks laiks" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Dot priekšroku ierakstam un apturēt tiešraides TV" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Dot priekšroku tiešraides TV un atcelt konfliktējošo ierakstu" + +msgctxt "#30019" +msgid "General" +msgstr "Vispārīgi" + +msgctxt "#30021" +msgid "Internal" +msgstr "Iekšējs" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Pārkodētājs" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Papildus" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Zudis savienojums ar MythTV aizmugursistēmu" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Savienojums ar MythTV atjaunots" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "MythTV aizmugursistēma neatbild." + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Kanāls nav pieejams" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Aptur tiešraides TV, jo konfliktē ar ierakstu: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Neieraksta" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Ieslēgts" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Izslēgts" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Paturēt tiešraides TV ierakstu" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Lithuanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Lithuanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Lithuanian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Lithuanian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Lithuanian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/lt/)\n" +"Language-Team: Lithuanian (http://www.transifex.com/projects/p/xbmc-main/language/lt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,23 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Leisti Live TV perkelti į oficialų sąrašą rodymui/naudojimui" + +msgctxt "#30019" +msgid "General" +msgstr "Pagrindinis" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Pažangus" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Kanalas nepasiekiamas" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Įjungta" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Atjungta" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Macedonian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Macedonian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Macedonian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Macedonian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Macedonian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/mk/)\n" +"Language-Team: Macedonian (http://www.transifex.com/projects/p/xbmc-main/language/mk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,19 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Дозволи Live TV да преместува планирани шоуа" + +msgctxt "#30019" +msgid "General" +msgstr "Општо" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Напредно" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Овозможено" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Оневозможено" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Malay/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Malay/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Malay/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Malay/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,225 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Malay (http://www.transifex.com/projects/p/xbmc-main/language/ms/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "MythTV Backend Hostname or IP" +msgstr "Nama hos atau alamat IP MythTV" + +msgctxt "#30001" +msgid "MythTV Backend Port" +msgstr "Port Bahagian Belakang MythTV" + +msgctxt "#30002" +msgid "MythTV Database Username" +msgstr "Nama Pengguna Pangkalan Data MythTV" + +msgctxt "#30003" +msgid "MythTV Database Password" +msgstr "Kata Laluan Pangkalan Data MythTV" + +msgctxt "#30004" +msgid "MythTV Database Databasename" +msgstr "Nama Pangkalan Data Pangkalan Data MythTV" + +msgctxt "#30005" +msgid "Include more debug information in the log file" +msgstr "Sertakan lebih maklumat nyahpepijat dalam fail log" + +msgctxt "#30006" +msgid "Enable Live TV" +msgstr "Benarkan TV Langsung" + +msgctxt "#30007" +msgid "Allow Live TV to move scheduled shows" +msgstr "Benarkan TV Langsung untuk alih rancangan terjadual" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Pengendalian konflik" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Utamakan TV Langsung bila rakaman mempunyai slot terkemudian" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Utamakan rakaman dan hentikan TV Langsung" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Utamakan TV Langsung dan batalkan rakaman berkonflik" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "Alamat Ethernet Bahagian-Belakang MythTV (WOL)" + +msgctxt "#30019" +msgid "General" +msgstr "Am" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Penyedia templat" + +msgctxt "#30021" +msgid "Internal" +msgstr "Dalaman" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Templat dalaman" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Cari Data Meta Secara Automatik" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Rakaman Baru Bendera Komersial" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Rakaman baru transkod" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Jalan Kerja Pengguna #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Jalan Kerja Pengguna #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Jalan Kerja Pengguna #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Jalan Kerja Pengguna #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Transkoder" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Benarkan rakaman menjadi luput?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Templat rakaman" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Lanjutan" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "Benarkan demux MPEG-TS" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Protokol versi: %i = Pangkalan data versi: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Gagal menyambung ke bahagian hadapan MythTV" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Gagal menyambung ke pangkalan data MythTV" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Sambungan ke bahagian hadapan MythTV hilang" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Sambungan MythTV dipulihkan" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Tiada respons dari bahagian belakang MythTV" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Saluran tidak tersedia" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Perakam tidak tersedia" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Membatalkan rakaman berkonflik: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Menghentikan TV Langsung kerana rakaman berkonflik: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Tidak merakam" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Dibenarkan" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Dilumpuhkan" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "Tiada siaran ditemui" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Padam dan rakam-semula" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Kekalkan rakaman TV Langsung" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "Tunjuk/sembunyi peraturan dengan status \"Tidak Dirakam'" + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "Rakam semua rancangan (saluran ini)" + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "Rakam rancangan ini setiap minggu" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "Rakam rancangan ini setiap hari" + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "Rakam satu rancangan (semua saluran)" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "Rakam semua episod baharu (saluran ini)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Malayalam/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Malayalam/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Malayalam/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Malayalam/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Malayalam (http://www.transifex.com/projects/p/xbmc-main/language/ml/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ml\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30019" +msgid "General" +msgstr "പോതുവായത്" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Maltese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Maltese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Maltese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Maltese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Maltese (http://www.transifex.com/projects/p/xbmc-main/language/mt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mt\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);\n" + +msgctxt "#30019" +msgid "General" +msgstr "Ġenerali" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Jintuża" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Mhux attiv" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Maori/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Maori/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Maori/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Maori/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,37 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Maori (http://www.transifex.com/projects/p/xbmc-main/language/mi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mi\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30019" +msgid "General" +msgstr "Āhuawhānui" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Arā Atu Anō" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Kaore wātea te hongere" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Kua whakahohe" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Kua mono" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Norwegian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Norwegian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Norwegian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Norwegian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,69 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Norwegian (http://www.transifex.com/projects/p/xbmc-main/language/no/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "MythTV Backend Hostname or IP" +msgstr "MythTV Backend Brukernavn eller IP" + +msgctxt "#30001" +msgid "MythTV Backend Port" +msgstr "MythTV Backend Port" + +msgctxt "#30002" +msgid "MythTV Database Username" +msgstr "MythTV Database Brukernavn" + +msgctxt "#30003" +msgid "MythTV Database Password" +msgstr "MythTV Database Passord" + +msgctxt "#30004" +msgid "MythTV Database Databasename" +msgstr "MythTV Database Databasenavn" + +msgctxt "#30005" +msgid "Include more debug information in the log file" +msgstr "Inkluder mer debug informasjon i logg filen" + +msgctxt "#30006" +msgid "Enable Live TV" +msgstr "Aktiver Live TV" + +msgctxt "#30007" +msgid "Allow Live TV to move scheduled shows" +msgstr "Tillat at Live TV flytter avtalte programmer" + +msgctxt "#30019" +msgid "General" +msgstr "Generelt" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Avansert" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Kanal utilgjengelig" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Aktivert" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Deaktivert" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Ossetic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Ossetic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Ossetic/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Ossetic/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Ossetic (http://www.transifex.com/projects/p/xbmc-main/language/os/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: os\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30019" +msgid "General" +msgstr "Сӕйраг" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Persian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Persian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Persian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Persian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Persian (http://www.transifex.com/projects/p/xbmc-main/language/fa/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30019" +msgid "General" +msgstr "عمومی" + +msgctxt "#30050" +msgid "Advanced" +msgstr "پیشرفته" + +msgctxt "#30311" +msgid "Disabled" +msgstr "غیرفعال" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Persian (Iran)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Persian (Iran)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Persian (Iran)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Persian (Iran)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Persian (Iran) (http://www.transifex.com/projects/p/xbmc-main/language/fa_IR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa_IR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30019" +msgid "General" +msgstr "عمومی" + +msgctxt "#30310" +msgid "Enabled" +msgstr "فعال شده" + +msgctxt "#30311" +msgid "Disabled" +msgstr "غیر فعال" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Polish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Polish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Polish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Polish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Polish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pl/)\n" +"Language-Team: Polish (http://www.transifex.com/projects/p/xbmc-main/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,179 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Pozwól TV na żywo na przesuwanie zaplanowanych programów" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Zarządzanie konfliktami" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Preferuj TV gdy nagranie jest później" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Preferuj nagranie i zatrzymuj TV" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Preferuj TV i anuluj nagranie" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "Adres serwera MythTV (WOL)" + +msgctxt "#30019" +msgid "General" +msgstr "Ogólne" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Dostawca szablonów" + +msgctxt "#30021" +msgid "Internal" +msgstr "Wewnętrzny" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Szablon wewnętrzny" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Automatyczne wyszukiwanie etykiet" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Wskaźnik reklam nowych nagrań" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Przekoduj nowe nagrania" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Uruchom zadanie 1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Uruchom zadanie 2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Uruchom zadanie 3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Uruchom zadanie 4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Transkoder" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Nagrania przedawniają się?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Szablon nagrywania" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Zaawansowane" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "Włącz demukser MPEG-TS" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Wersja protokołu: %i - wersja bazy danych: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Nie można połączyć się z serwerem MythTV" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Nie można połączyć się z bazą danych MythTV" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Zerwane połączenie z serwerem MythTV" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Przywrócone połączenie z MythTV" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Serwer MythTV nie odpowiada" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Kanał niedostępny" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Nagrywanie niedostępne" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Anulowanie nagrania powodującego konflikt: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Zatrzymywanie TV z powodu konfliktu nagrania: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Nie nagrywa" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Włączone" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Wyłączony" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "Nie znaleziono transmisji " + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Skasuj i nagraj ponownie " + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Nagrywaj TV na żywo" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "Pokaż/Ukryj status \"Nie nagrywa\"" + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "Nagrywaj wszystkie audycje (na tym kanale) " + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "Nagrywaj audycję co tydzień" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "Nagrywaj audycję codziennie " + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "Nagrywaj jedną audycję (wszystkie kanały)" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "Nagrywaj wszystkie nowe epizody (na tym kanale) " diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Portuguese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Portuguese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Portuguese/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Portuguese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Portuguese (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pt/)\n" +"Language-Team: Portuguese (http://www.transifex.com/projects/p/xbmc-main/language/pt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,179 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Permitir que TV em Directo mova programas agendados" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Gestão de conflitos" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Preferir Tv em Directo se existir horário para gravar mais tarde" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Preferir gravação e parar TV em Directo" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Preferir TV em Directo e cancelar a gravação em conflito" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "Endereço Internet da Backend MythTV (WOL)" + +msgctxt "#30019" +msgid "General" +msgstr "Menus" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Fornecedor de templates" + +msgctxt "#30021" +msgid "Internal" +msgstr "Interno" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Template Interno" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Procurar automaticamente Metadata" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Sinalizador de anúncios em novas gravações" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Transcodificar novas gravações" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Iniciar tarefa do utilizador #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Iniciar tarefa do utilizador #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Iniciar tarefa do utilizador #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Iniciar tarefa do utilizador #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Transcodificar" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Permitir que as gravações expirem?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Gravar template" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Avançado" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "Activar demux de MPEG-TS" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Versão do protocolo: %i - Versão da base de dados: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Falha na ligação a Backend MythTV" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Falha de ligação à base de dados de MythTV" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "A ligação à backend MythTV foi perdida" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Ligação a MythTV restabelecida" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Sem resposta de backend MythTV" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Canal não disponível" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Gravador indisponível" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Cancelar gravação em conflito: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Parando TV em Directo devido a conflito com gravação: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Sem Gravar" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Activado" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Desligado" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "Nenhuma emissão encontrada" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Apagar e re-gravar" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Manter gravação LiveTV" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "Exibir/Ocultar regras com estado \"Sem Gravar\"" + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "Gravar todas as exibições (neste canal)" + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "Gravar esta exibição todas as semanas" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "Gravar esta exibição todos os dias" + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "Gravar uma exibição (todos os canais)" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "Gravar todos os novos episódios (neste canal)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Portuguese (Brazil)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Portuguese (Brazil)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Portuguese (Brazil)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Portuguese (Brazil)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pt_BR/)\n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/xbmc-main/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,179 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Permitir TV ao Vivo mover-se para programação agendada" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Tratamento de conflitos" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Preferir TV ao vivo quando gravando possuir slot para mais tarde" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Preferir gravar e interromper TV ao Vivo" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Preferir TV ao vivo e cancelar gravações conflitantes" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "Endereço Ethernet MythTV Backend (WOL)" + +msgctxt "#30019" +msgid "General" +msgstr "Geral" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Fornecedor de Modelo" + +msgctxt "#30021" +msgid "Internal" +msgstr "Interno" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Modelo interno" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Automaticamente procure pelos metadados" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Sinalizador de comercial em novas gravações" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Transcodifique novas gravações" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Executar o trabalho usuário #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Executar o trabalho usuário #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Executar o trabalho usuário #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Executar o trabalho usuário #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Transcoder" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Permitir gravações expirar?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Gravando modelo" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Avançado" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "Ativar demuxing MPEG-TS" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Versão do Protocolo: %i - Versão do Banco de Dados: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Falha ao conectar ao backend do MythTV" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Falha ao conectar a base de dados do MythTV" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Conexão para Backend MythTV perdida" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Conexão para MythTV restaurada" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Nenhuma resposta do backend do MythTV" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Canal indisponível" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Gravador indisponível" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Cancelando gravações conflitantes %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Interrompendo TV ao Vivo em função de conflitos na gravação %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Não está gravando" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Ativado" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Desabilitado" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "Nenhuma transmissão encontrada" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Deletar e regravar" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Manter gravação de TV ao Vivo" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "Mostrar/ocultar regras com estatus \"Sem gravação\"" + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "Gravar toda a programação (neste canal)" + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "Gravar esta programação toda semana" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "Gravar esta programação todo dia" + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "Gravar programação atual (todos os canais)" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "Gravar todos os novos episódios (neste canal)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Romanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Romanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Romanian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Romanian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Romanian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ro/)\n" +"Language-Team: Romanian (http://www.transifex.com/projects/p/xbmc-main/language/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,143 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Permite Live TV să mute serialele planificate" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Conflict" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Prefera Live TV atunci când înregistrarea are slot pentru mai târziu" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Prefera înregistrarea și oprește Live TV " + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Prefera Live TV și anulează înregistrările conflictuale " + +msgctxt "#30019" +msgid "General" +msgstr "General" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Folosește format predefinit" + +msgctxt "#30021" +msgid "Internal" +msgstr "Intern" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Format predefinit intern" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Caută automat metadata" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Marchează înregistrările noi" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Transcode înregistrările noi" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Rulează jobul utilizatorului # 1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Rulează jobul utilizatorului # 2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Rulează jobul utilizatorului # 3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Rulează jobul utilizatorului # 4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Transcoder" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Permite expirarea înregistrării?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Inregistrare în format predefinit" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Avansat" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Versiunea protocolului: %i - Versiunea bazei de date: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Conexiunea la MythTV backend eșuată" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Conexiunea la baza de date MythTV eșuată" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Conexiunea la MythTV backend pierdută " + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Conexiunea la MythTV backend restabilită " + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Nici un răspuns de la MythTV backend" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Canal indisponibil" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Înregistrare indisponibila" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr " Anulează înregistrările conflictuale: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Oprește Live TV datorită înregistrărilor conflictuale: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Nu inregistraza" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Activat" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Dezactivat" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Sterge si reinregistraza" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Pastreaza inregistrarea TV" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Russian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Russian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Russian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Russian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Russian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ru/)\n" +"Language-Team: Russian (http://www.transifex.com/projects/p/xbmc-main/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,179 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Разрешить Live TV переключаться на запланированные шоу" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Обработка конфликтов" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Предпочесть Live TV, при записи через медленный слот" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Предпочесть запись и остановку Live TV" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Предпочесть Live TV и отменить конфликтную запись" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "Ethernet адрес оболочки MythTV (WOL)" + +msgctxt "#30019" +msgid "General" +msgstr "Основное" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Шаблон поставщика" + +msgctxt "#30021" +msgid "Internal" +msgstr "Внутренний" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Внутренний шаблон" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Автопоиск метаданных" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Новые записи отмечать как Коммерческие" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Перекодировать новые записи" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Запустить задачу №1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Запустить задачу №2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Запустить задачу №3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Запустить задачу №4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Кодировщик" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Разрешить окончание записи?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Шаблон записи" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Дополнительно" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "Включить демультиплексирование MPEG-TS" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Версия протокола: %i - версия Базы данных: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Сбой соединения с внутренним интерфейсом MythTV" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Сбой соединения с базой данных MythTV" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Разрыв связи с внутренним интерфейсом MythTV" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Связь с MythTV восстановлена" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Внутренний интерфейс MythTV не отвечает" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Канал недоступен" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Устройство записи недоступно" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Отменяется конфликтная запись: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Остановка Live TV из-за конфликта записи: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Не записывается" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Вкл." + +msgctxt "#30311" +msgid "Disabled" +msgstr "Откл." + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "Передачи не найдены" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Удалить и перезаписать" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Сохранять запись ТВ" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "Скрыть/показать правила для статуса 'Не записывается'" + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "Записывать все передачи (этого канала)" + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "Записывать эту передачу каждую неделю" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "Записывать эту передачу каждый день" + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "Записывать одну передачу (все каналы)" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "Записывать все новые серии (этого канала)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Serbian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Serbian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Serbian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Serbian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Serbian (http://www.transifex.com/projects/p/xbmc-main/language/sr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30019" +msgid "General" +msgstr "Opšte" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Omogućeno" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Onemogućeno" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Serbian (Cyrillic)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Serbian (Cyrillic)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Serbian (Cyrillic)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Serbian (Cyrillic)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Serbian (Cyrillic) (http://www.transifex.com/projects/p/xbmc-main/language/sr_RS/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr_RS\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30019" +msgid "General" +msgstr "Опште" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Омогућено" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Онемогућено" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Slovak/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Slovak/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Slovak/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Slovak/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Slovak (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sk/)\n" +"Language-Team: Slovak (http://www.transifex.com/projects/p/xbmc-main/language/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,135 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Umožniť Live TV rozhraniu presunúť plánované relácie" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Riešenie konfliktov" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Pokiaľ nahrávanie začína neskôr, uprednostniť živé TV vysielanie" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Uprednostňovať nahrávanie a zastaviť živé TV vysielanie" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Uprednostniť živé TV vysielanie a zrušiť konfliktné plánované nahrávania" + +msgctxt "#30019" +msgid "General" +msgstr "Všeobecné" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Poskytovateľ šablón" + +msgctxt "#30021" +msgid "Internal" +msgstr "Interný" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Interná šablóna" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Automaticky vyhľadávať metadáta" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Automaticky označovať reklamy v nových nahrávkach" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Transkódovať nové nahrávky" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Spustiť používateľskú akciu 1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Spustiť používateľskú akciu 2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Spustiť používateľskú akciu 3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Spustiť používateľskú akciu 4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Transkodér" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Povoliť expiráciu nahrávok?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Šablóna nahrávky" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Pokročilé" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Verzia protokolu: %i - Verzia databázy: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Pri pripojení k MythTV backendu nastala chyba" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Pri pripojení k MythTV databáze nastala chyba" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Spojenie k MythTV backendu bolo prerušené" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Spojenie k MythTV bolo obnovené" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "MythTV backend neodpovedá" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Kanál nie je k dispozícii" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Rekordér nie je k dispozícii" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Ruší sa konfliktné nahrávanie: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Zastavuje sa živé TV vysielanie z dôvodu konfliktu s nahrávaním: %s" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Aktívne" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Zakázaný" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Vymazať a znova nahrať" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Slovenian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Slovenian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Slovenian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Slovenian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Slovenian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sl/)\n" +"Language-Team: Slovenian (http://www.transifex.com/projects/p/xbmc-main/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,179 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Dovoli TV v živo, da premika nastavljena snemanja" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Reševanje prekrivanj" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Predvajaj TV v živo, če se snemanje začne kasneje" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Začni snemanje in ustavi TV v živo" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Predvajaj TV v živo in prekliči snemanje" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "Lokalni ethernet naslov hrbtenice MythTV (WOL)" + +msgctxt "#30019" +msgid "General" +msgstr "Splošno" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Ponudnik predlog" + +msgctxt "#30021" +msgid "Internal" +msgstr "Notranji" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Notranja predloga" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Samodejno poizvedi metapodatke" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Označi oglase v novih posnetkih" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Pretvori nove posnetke" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Zaženi uporabniško opravilo #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Zaženi uporabniško opravilo #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Zaženi uporabniško opravilo #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Zaženi uporabniško opravilo #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Pretvornik" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Ali dovolite posnetkom, da potečejo?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Predloga snemanja" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Napredno" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "Omogoči pretvarjanje MPEG-TS" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Različica protokola: %i - Različica baze: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "S hrbtenico MythTV se ni bilo mogoče povezati" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Z bazo MythTV se ni bilo mogoče povezati" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Povezava s hrbtenico MythTV je bila izgubljena" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Povezava z MythTv je obnovljena" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Hrbtenica MythTV se ne odziva" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Program ni na voljo" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Snemalnik ni na voljo" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Preklic snemanja: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Ustavljam TV v živo zaradi prekrivanja: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Ne snemam" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Omogočeno" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Onemogočeno" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "Ni najdenega prenosa" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Izbriši in ponovno snemaj" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Obdrži posnetke" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "Prikaži/skrij pravila s stanjem 'Ne snemam'" + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "Posnemi vsa predvajanja (ta program)" + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "Posnemi to predvajanje vsak teden" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "Posnemi to predvajanje vsak dan" + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "Posnemi eno predvajanje (vsi programi)" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "Posnemi vse nove epizode (ta program)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Spanish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Spanish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Spanish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Spanish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es/)\n" +"Language-Team: Spanish (http://www.transifex.com/projects/p/xbmc-main/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -39,7 +38,7 @@ msgctxt "#30005" msgid "Include more debug information in the log file" -msgstr "Incluir mas información de depuración en el archivo de log" +msgstr "Incluir más información de depuración en el archivo de log" msgctxt "#30006" msgid "Enable Live TV" @@ -48,3 +47,179 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Permitir a la TV en Vivo cambiar los eventos programados" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Conflicto de manejo" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Prefiero TV en vivo y dejar la grabación para mas tarde" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Prefiero grabación y parar TV en vivo" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Prefiero TV en vivo y cancelar la grabación en conflictivo" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "Dirección IP MythTV Backend (WOL)" + +msgctxt "#30019" +msgid "General" +msgstr "General" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Proveedor de plantilla" + +msgctxt "#30021" +msgid "Internal" +msgstr "Interna" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Plantilla interna" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Buscar Metadatos automáticamente" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Indicador Comercial en nuevas grabaciones" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Transcodificar nuevas grabaciones" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Ejecutar Trabajo de Usuario #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Ejecutar Trabajo de Usuario #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Ejecutar Trabajo de Usuario #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Ejecutar Trabajo de Usuario #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Transcodificador" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "¿Permitir expirar a las grabaciones?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Plantilla de grabación" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Avanzado" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "Habilitar demux MPEG-TS" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Versión de protocolo: %i - Versión de base de datos: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Falló conexión con backend de MythTV" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Falló conexión con base de datos de MythTV" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Conexión con backend de MythTV perdida" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Conexión con backend de MythTV restaurada" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "No hay respuesta del backend de MythTV" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Canal no disponible" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Grabador no disponible" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Cancelando grabación en conflicto: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Detención de TV en vivo debido a la grabación en conflicto: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "No se esta grabando" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Activado" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Deshabilitado" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "No se ha encontrado broadcast" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Borrar y volver a grabar" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Mantener la grabación LiveTV" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "Mostrar/Ocultar reglas 'No grabar'" + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "Grabar todos los show (de este canal)" + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "Grabar este show todas las semanas" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "Grabar este show todos los dias" + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "Grabar un solo show (en todos los canales)" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "Grabar todos los nuevos episodios (de este canal)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Spanish (Argentina)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Spanish (Argentina)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Spanish (Argentina)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Spanish (Argentina)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es_AR/)\n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/xbmc-main/language/es_AR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,131 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Permitir a la TV en Vivo cambiar los eventos programados" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Conflicto de manejo" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Preferir TV en vivo cuando es posible dejar la grabación para mas tarde" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Preferir grabación y parar TV en vivo" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Preferir TV en vivo y cancelar la grabación en conflicto" + +msgctxt "#30019" +msgid "General" +msgstr "General" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Proveedor de plantilla" + +msgctxt "#30021" +msgid "Internal" +msgstr "Interna" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Plantilla interna" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Buscar Metadatos automáticamente" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Indicador Comercial en nuevas grabaciones" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Transcodificar nuevas grabaciones" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Ejecutar Trabajo de Usuario #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Ejecutar Trabajo de Usuario #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Ejecutar Trabajo de Usuario #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Ejecutar Trabajo de Usuario #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Transcodificador" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "¿Permitir expirar a las grabaciones?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Plantilla de grabación" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Avanzado" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Versión de protocolo: %i - Versión de base de datos: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Falló conexión con backend de MythTV" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Falló conexión con base de datos de MythTV" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Conexión con backend de MythTV perdida" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Conexión con backend de MythTV restaurada" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "No hay respuesta del backend de MythTV" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Canal no disponible" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Grabador no disponible" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Cancelando grabación en conflicto: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Deteniendo TV en vivo debido a la grabación en conflicto: %s" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Activado" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Deshabilitado" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Spanish (Mexico)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Spanish (Mexico)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Spanish (Mexico)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Spanish (Mexico)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es_MX/)\n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/xbmc-main/language/es_MX/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,23 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Permitir TV en vivo mover shows programados" + +msgctxt "#30019" +msgid "General" +msgstr "General" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Avanzado" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Canal no disponible" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Activado" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Deshabilitado" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Spanish (Venezuela)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Spanish (Venezuela)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Spanish (Venezuela)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Spanish (Venezuela)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Spanish (Venezuela) (http://www.transifex.com/projects/p/xbmc-main/language/es_VE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_VE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Habilitado" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Swedish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Swedish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Swedish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Swedish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: MythTV cmyth PVR Client # Addon id: pvr.mythtv.cmyth -# Addon version: 1.6.7 # Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Swedish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sv/)\n" +"Language-Team: Swedish (http://www.transifex.com/projects/p/xbmc-main/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -48,3 +47,179 @@ msgctxt "#30007" msgid "Allow Live TV to move scheduled shows" msgstr "Tillåt direktsänd TV att flytta schemalagda program" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Konflikthantering" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Föredra direktsänd TV när inspelning har ett senare tillfälle" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Föredra inspelning och stoppa direktsänd TV" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Föredra direktsänd TV och avbryt inspelning i konflikt" + +msgctxt "#30012" +msgid "MythTV Backend Ethernet address (WOL)" +msgstr "MythTV-backends lokala nätverksadress (WOL)" + +msgctxt "#30019" +msgid "General" +msgstr "Allmänt" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Mall-leverantör" + +msgctxt "#30021" +msgid "Internal" +msgstr "Intern" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Intern mall" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Slå automatiskt upp metadata" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Raklamflagga nya inspelningar" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Omkoda nya inspelningar" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Kör användarjobb #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Kör användarjobb #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Kör användarjobb #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Kör användarjobb #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Omkodning" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Tillåt inspelningar att gå ut?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Inspelningsmall" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Avancerad" + +msgctxt "#30052" +msgid "Enable demuxing MPEG-TS" +msgstr "Aktivera avmuxning av MPEG-TS" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Protokollversion: %i - Databasversion: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Kunde inte ansluta till MythTV backend" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Kunde inte ansluta till MythTV databas" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Anslutning till MythTV backend förlorad" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Anslutning till MythTV återställd" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Inget svar från MythTV backend" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Kanal otillgänglig" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Inspelare inte tillgänglig" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Avbryter inspelning med konflikt: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Stoppar direktsänd TV pga konflikt med inspelning: %s" + +msgctxt "#30309" +msgid "Not recording" +msgstr "Spelar inte in" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Aktiverad" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Inaktiverad" + +msgctxt "#30312" +msgid "No broadcast found" +msgstr "Ingen sändning hittades" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Ta bort och spela in på nytt" + +msgctxt "#30412" +msgid "Keep LiveTV recording" +msgstr "Fortsätt spela in direktsänd TV" + +msgctxt "#30421" +msgid "Show/hide rules with status 'Not Recording'" +msgstr "Visa/göm regler med status 'Ingen inspelning'" + +msgctxt "#30431" +msgid "Record all showings (this channel)" +msgstr "Spela in alla sändningar (denna kanalen)" + +msgctxt "#30432" +msgid "Record this showing every week" +msgstr "Spela in denna sändning varje vecka" + +msgctxt "#30433" +msgid "Record this showing every day" +msgstr "Spela in denna sändning varje dag" + +msgctxt "#30434" +msgid "Record one showing (all channels)" +msgstr "Spela in en sändning (alla kanaler)" + +msgctxt "#30435" +msgid "Record all new episodes (this channel)" +msgstr "Spela in alla nya avsnitt (denna kanalen)" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Tajik/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Tajik/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Tajik/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Tajik/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,37 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Tajik (http://www.transifex.com/projects/p/xbmc-main/language/tg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30019" +msgid "General" +msgstr "Умумӣ" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Иловагӣ" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Шабака дастнорас аст" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Фаъол" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Ғайрифаъол" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Tamil (India)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Tamil (India)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Tamil (India)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Tamil (India)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,177 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Tamil (India) (http://www.transifex.com/projects/p/xbmc-main/language/ta_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "MythTV Backend Hostname or IP" +msgstr "MythTV பின்தள புரவலன் பெயர் அல்லது ஐபி" + +msgctxt "#30001" +msgid "MythTV Backend Port" +msgstr "MythTV பின்தள போர்ட்" + +msgctxt "#30002" +msgid "MythTV Database Username" +msgstr "MythTV தரவுத்தள பயனர்பெயர்" + +msgctxt "#30003" +msgid "MythTV Database Password" +msgstr "MythTV தரவுத்தள கடவுச்சொல்" + +msgctxt "#30004" +msgid "MythTV Database Databasename" +msgstr "MythTV தரவுத்தளம் தரவுத்தள பெயர்" + +msgctxt "#30005" +msgid "Include more debug information in the log file" +msgstr "பதிவு கோப்பில் இன்னும் பிழைத்திருத்த தகவல் சேர்க்கவும்" + +msgctxt "#30006" +msgid "Enable Live TV" +msgstr "நேரடி தொலைக்காட்சி செயல்படுத்து" + +msgctxt "#30007" +msgid "Allow Live TV to move scheduled shows" +msgstr "அட்டவணைப்படுத்தப்பட்ட நிகழ்ச்சிகள் நகர்த்த நேரடி தொலைக்காட்சி அனுமதி கொடு" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "மோதல் கையாளுதல்" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "பதிவு செய்தல் ஸ்லாட் உள்ள போதும் நேரடி தொலைக்காட்சியை விரும்பு" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "நேரடி தொலைக்காட்சி நிறுத்திவிட்டு பதிவு செய்தலை விரும்பு" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "முரண்பட்ட பதிவு ரத்து செய்துவிட்டு நேரடி தொலைக்காட்சியை விரும்பு" + +msgctxt "#30019" +msgid "General" +msgstr "பொதுவானவை" + +msgctxt "#30020" +msgid "Template provider" +msgstr "வார்ப்புரு வழங்குநர்" + +msgctxt "#30021" +msgid "Internal" +msgstr "உள்ளக" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "உள் வார்ப்புரு" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "தானாக மெட்டாடேட்டா பூட்டிடு" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "வணிக கொடி புதிய பதிவுகள்" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "புதிய பதிவுகள் ட்ரான்ஸ்கோட்" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "பயனர் வேலை # 1 ஓட்டு" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "பயனர் வேலை # 2 ஓட்டு" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "பயனர் வேலை # 3 ஓட்டு" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "பயனர் வேலை # 4 ஓட்டு" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "டிரான்ஸ்கோடர்" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "பதிவுகள் காலாவதியாகும்வரை அனுமதி?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "பதிவு வார்ப்புரு" + +msgctxt "#30050" +msgid "Advanced" +msgstr "மேம்பட்ட" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "நெறிமுறை பதிப்பு: %i - தரவுத்தள பதிப்பு: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "பின்தளத்தில் MythTV இணைக்க முடியவில்லை" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "MythTV தரவுத்தளம் இணைக்க முடியவில்லை" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "MythTV பின்தள இணைப்பு இழந்தது" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "மீண்டும் MythTV இணைக்கப்பட்டுள்ளது" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "MythTV பின்தளத்தில் இருந்து எந்த பதிலும் வரவில்லை" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "சேனல் கிடைக்கவில்லை" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "ரெக்கார்டர் கிடைக்கவில்லை" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "முரண்பட்ட பதிவு ரத்து செய் : %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "முரண்பட்ட பதிவு காரணமாக நேரடி தொலைக்காட்சி நிறுத்தப்படுடுகின்றது: %s" + +msgctxt "#30310" +msgid "Enabled" +msgstr "செயல்படுத்தபட்டுள்ளது" + +msgctxt "#30311" +msgid "Disabled" +msgstr "முடக்கப்பட்டன" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Telugu/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Telugu/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Telugu/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Telugu/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Telugu (http://www.transifex.com/projects/p/xbmc-main/language/te/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: te\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30019" +msgid "General" +msgstr "సాధారణం" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Thai/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Thai/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Thai/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Thai/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,37 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Thai (http://www.transifex.com/projects/p/xbmc-main/language/th/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30019" +msgid "General" +msgstr "ทั่วไป" + +msgctxt "#30050" +msgid "Advanced" +msgstr "ขั้นสูง" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "ช่อง ไม่พร้อมใช้งาน" + +msgctxt "#30310" +msgid "Enabled" +msgstr "ใช้งาน" + +msgctxt "#30311" +msgid "Disabled" +msgstr "ปิดการใช้งาน" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Turkish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Turkish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Turkish/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Turkish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,81 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Turkish (http://www.transifex.com/projects/p/xbmc-main/language/tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "MythTV Backend Hostname or IP" +msgstr "MythTV ana bilgisayar adı yada IP'si" + +msgctxt "#30001" +msgid "MythTV Backend Port" +msgstr "MythTV Kumanda Port'u" + +msgctxt "#30002" +msgid "MythTV Database Username" +msgstr "MythTV Veritabanı Kullanıcı Adı" + +msgctxt "#30003" +msgid "MythTV Database Password" +msgstr "MythTV Veritabanı Şifresi" + +msgctxt "#30004" +msgid "MythTV Database Databasename" +msgstr "MythTV Veritabanı Adı" + +msgctxt "#30006" +msgid "Enable Live TV" +msgstr "Canlı TV aktifleştir" + +msgctxt "#30019" +msgid "General" +msgstr "Genel" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Görünüm sağlayıcısı" + +msgctxt "#30021" +msgid "Internal" +msgstr "Dahili" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Dahili görünüm" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Gelişmiş" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Kanal kullanılamıyor" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Etkin" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Devre dışı" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Sil ve yeniden kaydet" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Ukrainian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Ukrainian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Ukrainian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Ukrainian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,153 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Ukrainian (http://www.transifex.com/projects/p/xbmc-main/language/uk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "MythTV Backend Hostname or IP" +msgstr "Назва сервера MythTV або IP" + +msgctxt "#30001" +msgid "MythTV Backend Port" +msgstr "Порт MythTV" + +msgctxt "#30002" +msgid "MythTV Database Username" +msgstr "Назва користувача до бази даних MythTV" + +msgctxt "#30003" +msgid "MythTV Database Password" +msgstr "Пароль бази даних Myth TV" + +msgctxt "#30004" +msgid "MythTV Database Databasename" +msgstr "Логін до бази даних Myth TV" + +msgctxt "#30005" +msgid "Include more debug information in the log file" +msgstr "Додати більше інформації в файл журналу" + +msgctxt "#30006" +msgid "Enable Live TV" +msgstr "Включити Live TV" + +msgctxt "#30007" +msgid "Allow Live TV to move scheduled shows" +msgstr "Дозволити Live TV переміщувати заплановані шоу" + +msgctxt "#30019" +msgid "General" +msgstr "Загальні" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Постачальник шаблонів" + +msgctxt "#30021" +msgid "Internal" +msgstr "Внутрішній" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Внутрішній шаблон" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Автоматичний пошук метаданих" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Перекодовувати нові записи" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Запуск завдання користувача #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Запуск завдання користувача #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Запуск завдання користувача #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Запуск завдання користувача #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Перекодовувач" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Шаблон запису" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Більше" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Версія протоколу: %i - Версія даних: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Неможливо з’єднатися з MythTV" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Неможливо зв’язатися з даними MythTV" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Зв’язок з MythTV втрачено" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Зв’язок з MythTV відновлено" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Немає відгуку від MythTV" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Канал недоступний" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Записувач недоступний" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Скасування конфліктних записів: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Зупинка Живого Телебачення із-за конфліктних записів: %s" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Увімкн." + +msgctxt "#30311" +msgid "Disabled" +msgstr "Вимкн." diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Uzbek/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Uzbek/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Uzbek/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Uzbek/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Uzbek (http://www.transifex.com/projects/p/xbmc-main/language/uz/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uz\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30019" +msgid "General" +msgstr "Umumiy" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Kanal mavjud emas" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Yoqilgan" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Vietnamese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Vietnamese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Vietnamese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Vietnamese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,177 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Vietnamese (http://www.transifex.com/projects/p/xbmc-main/language/vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "MythTV Backend Hostname or IP" +msgstr "Tên miền hoặc IP của MythTV" + +msgctxt "#30001" +msgid "MythTV Backend Port" +msgstr "Cổng MythTV" + +msgctxt "#30002" +msgid "MythTV Database Username" +msgstr "Tài khoản truy cập cơ sở dữ liệu MythTV" + +msgctxt "#30003" +msgid "MythTV Database Password" +msgstr "Mật khẩu truy cập cơ sở dữ liệu MythTV" + +msgctxt "#30004" +msgid "MythTV Database Databasename" +msgstr "Tên cơ sở dữ liệu MythTV" + +msgctxt "#30005" +msgid "Include more debug information in the log file" +msgstr "Thêm thông tin sửa lỗi chương trình vào báo cáo" + +msgctxt "#30006" +msgid "Enable Live TV" +msgstr "Sử dụng Live TV" + +msgctxt "#30007" +msgid "Allow Live TV to move scheduled shows" +msgstr "Cho phép Live TV thay đổi chương trình đã hẹn giờ" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Giải quyết xung đột" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Ưu tiên Live TV khi bản đang thu có thể chiếu lại" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Ưu tiên bản thu và dừng Live TV" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Ưu tiên Live TV và hủy xung đột bản thu" + +msgctxt "#30019" +msgid "General" +msgstr "Chung" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Nguồn Template" + +msgctxt "#30021" +msgid "Internal" +msgstr "Đi kèm" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Template đi kèm" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Tự động tìm kiếm dữ liệu" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Đánh dấu thương mại hóa cho các bản thu mới" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Chuyển mã các bản thu mới" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Chạy tác vụ người dùng #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Chạy tác vụ người dùng #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Chạy tác vụ người dùng #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Chạy tác vụ người dùng #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Bộ chuyển mã" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Cho phép các bản thu hết hạn?" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Mẫu cho bản thu" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Nâng cao" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Protocol version: %i - Database version: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Lỗi kết nối tới MythTV" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Lỗi kết nối tới MythTV database" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Mất kết nối tới MythTV" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Đã khôi phục lại kết nối tới MythTV" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Không có tín hiệu từ MythTV" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Không có tín hiệu" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Lỗi đầu thu" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Đang hủy xung đột bản thu: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Đang dừng Live TV vì lỗi xung đột bản thu: %s" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Đã bật" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Đã tắt" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Vietnamese (Viet Nam)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Vietnamese (Viet Nam)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Vietnamese (Viet Nam)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Vietnamese (Viet Nam)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/projects/p/xbmc-main/language/vi_VN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi_VN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30019" +msgid "General" +msgstr "Chung" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Nâng ca" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Welsh/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Welsh/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/language/Welsh/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/language/Welsh/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,181 @@ +# XBMC Media Center language file +# Addon Name: MythTV cmyth PVR Client +# Addon id: pvr.mythtv.cmyth +# Addon Provider: Christian Fetzer, Jean-Luc Barrière, Tonny Petersen +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Welsh (http://www.transifex.com/projects/p/xbmc-main/language/cy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" + +msgctxt "#30000" +msgid "MythTV Backend Hostname or IP" +msgstr "Enw gwesteiwr cefn MythTV neu IP" + +msgctxt "#30001" +msgid "MythTV Backend Port" +msgstr "Porth Cefn MythTV" + +msgctxt "#30002" +msgid "MythTV Database Username" +msgstr "Enw Defnyddiwr Cronfa Ddata MythTV" + +msgctxt "#30003" +msgid "MythTV Database Password" +msgstr "Cyfrinair Cronfa Ddata MythTV" + +msgctxt "#30004" +msgid "MythTV Database Databasename" +msgstr "Enw Cronfa Ddata Cronfa Ddata MythTV" + +msgctxt "#30005" +msgid "Include more debug information in the log file" +msgstr "Cynnwys rhagor o wybodaeth dadfygio yn y ffeil cofnod" + +msgctxt "#30006" +msgid "Enable Live TV" +msgstr "Galluogi Teledu Byw" + +msgctxt "#30007" +msgid "Allow Live TV to move scheduled shows" +msgstr "Caniatáu i Deledu Byw symud sioeau wedi eu hamserlenni" + +msgctxt "#30008" +msgid "Conflict handling" +msgstr "Trin gwrthdaro" + +msgctxt "#30009" +msgid "Prefer Live TV when recording has later slot" +msgstr "Ffafrio Teledu Byw pan fod slot hwyrach gan recordiad" + +msgctxt "#30010" +msgid "Prefer recording and stop Live TV" +msgstr "Ffafrio recordio ac atal Teledu Byw" + +msgctxt "#30011" +msgid "Prefer Live TV and cancel conflicting recording" +msgstr "Ffafrio Teledu Byw a diddymu recordio sy'n gwrthdaro" + +msgctxt "#30019" +msgid "General" +msgstr "Cyffredinol" + +msgctxt "#30020" +msgid "Template provider" +msgstr "Darparwr templed" + +msgctxt "#30021" +msgid "Internal" +msgstr "Mewnol" + +msgctxt "#30022" +msgid "MythTV" +msgstr "MythTV" + +msgctxt "#30025" +msgid "Internal template" +msgstr "Templed mewnol" + +msgctxt "#30026" +msgid "Automatically Look Up Metadata" +msgstr "Chwilio'r Metadata'n Awtomatig" + +msgctxt "#30027" +msgid "Commercial Flag new recordings" +msgstr "Baner Masnachol i recordiadau newydd" + +msgctxt "#30028" +msgid "Transcode new recordings" +msgstr "Trawscodio recordiadau newydd" + +msgctxt "#30029" +msgid "Run User Job #1" +msgstr "Rhedeg Gwaith Defnyddiwr #1" + +msgctxt "#30030" +msgid "Run User Job #2" +msgstr "Rhedeg Gwaith Defnyddiwr #2" + +msgctxt "#30031" +msgid "Run User Job #3" +msgstr "Rhedeg Gwaith Defnyddiwr #3" + +msgctxt "#30032" +msgid "Run User Job #4" +msgstr "Rhedeg Gwaith Defnyddiwr #4" + +msgctxt "#30033" +msgid "Transcoder" +msgstr "Trawscodydd" + +msgctxt "#30034" +msgid "Allow recordings to expire?" +msgstr "Caniatáu i recordiadau ddod i ben" + +msgctxt "#30049" +msgid "Recording template" +msgstr "Templed recordio" + +msgctxt "#30050" +msgid "Advanced" +msgstr "Uwch" + +msgctxt "#30100" +msgid "Protocol version: %i - Database version: %i" +msgstr "Fersiwn protocol: %i - Fersiwn cronfa ddata: %i" + +msgctxt "#30300" +msgid "Failed to connect to MythTV backend" +msgstr "Methwyd cysylltu i gefn MythTV" + +msgctxt "#30301" +msgid "Failed to connect to MythTV database" +msgstr "Methwyd cysylltu i gronfa ddata MythTV" + +msgctxt "#30302" +msgid "Connection to MythTV backend lost" +msgstr "Cysylltiad wedi ei golli i gefn MythTV" + +msgctxt "#30303" +msgid "Connection to MythTV restored" +msgstr "Wedi adfer cysylltiad i MythTV" + +msgctxt "#30304" +msgid "No response from MythTV backend" +msgstr "Dim ymateb gan gefn MythTV" + +msgctxt "#30305" +msgid "Channel unavailable" +msgstr "Sianel ddim ar gael" + +msgctxt "#30306" +msgid "Recorder unavailable" +msgstr "Recordydd ddim ar gael" + +msgctxt "#30307" +msgid "Canceling conflicting recording: %s" +msgstr "Diddymu recordio sy'n gwrthdaro: %s" + +msgctxt "#30308" +msgid "Stopping Live TV due to conflicting recording: %s" +msgstr "Atal Teledu Byw oherwydd recordio sy'n gwrthdaro: %s" + +msgctxt "#30310" +msgid "Enabled" +msgstr "Galluogwyd" + +msgctxt "#30311" +msgid "Disabled" +msgstr "Analluogwyd" + +msgctxt "#30411" +msgid "Delete and re-record" +msgstr "Dileu ac ail recordio" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/settings.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/settings.xml --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/addon/resources/settings.xml 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/addon/resources/settings.xml 2014-01-28 20:43:50.000000000 +0000 @@ -2,12 +2,13 @@ - + - + + @@ -20,10 +21,13 @@ - + + + + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/Makefile.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/Makefile.am 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/Makefile.am 2014-01-28 20:43:50.000000000 +0000 @@ -10,7 +10,7 @@ LIBNAME = libmythtvcmyth-addon lib_LTLIBRARIES = libmythtvcmyth-addon.la -LIBS = @abs_top_builddir@/lib/cmyth/libcmyth.la +LIBS = @abs_top_srcdir@/lib/cmyth/libcmyth.la AM_CPPFLAGS = -I$(abs_top_srcdir)/lib/cmyth/include @@ -31,5 +31,18 @@ src/cppmyth/MythStorageGroupFile.cpp \ src/cppmyth/MythSignal.cpp \ src/cppmyth/MythRecordingRule.cpp \ - src/cppmyth/MythTimestamp.cpp - + src/cppmyth/MythTimestamp.cpp \ + src/cppmyth/MythEPGInfo.cpp \ + src/cppmyth/MythScheduleManager.cpp \ + src/demux.cpp \ + src/demuxer/debug.cpp \ + src/demuxer/elementaryStream.cpp \ + src/demuxer/tsDemuxer.cpp \ + src/demuxer/bitstream.cpp \ + src/demuxer/ES_MPEGVideo.cpp \ + src/demuxer/ES_MPEGAudio.cpp \ + src/demuxer/ES_h264.cpp \ + src/demuxer/ES_AAC.cpp \ + src/demuxer/ES_AC3.cpp \ + src/demuxer/ES_Subtitle.cpp \ + src/demuxer/ES_Teletext.cpp diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/project/VS2010Express/pvr.mythtv.cmyth.vcxproj xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/project/VS2010Express/pvr.mythtv.cmyth.vcxproj --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/project/VS2010Express/pvr.mythtv.cmyth.vcxproj 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/project/VS2010Express/pvr.mythtv.cmyth.vcxproj 2014-01-28 20:43:50.000000000 +0000 @@ -16,14 +16,28 @@ + + + + + + + + + + + + + + @@ -34,15 +48,32 @@ + + + + + + + + + + + + + + + + + @@ -109,7 +140,7 @@ Level3 Disabled - _CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;_WINSOCKAPI_;USE_DEMUX;__STDC_CONSTANT_MACROS;__WINDOWS__;TARGET_WINDOWS;_WINDOWS;_MSVC;WIN32;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;_WINSOCKAPI_;USE_DEMUX;__STDC_CONSTANT_MACROS;__STDC_FORMAT_MACROS;__WINDOWS__;TARGET_WINDOWS;_WINDOWS;_MSVC;WIN32;%(PreprocessorDefinitions) ..\..\..\..\project\BuildDependencies\include;..\..\..\..\xbmc;..\..\..\..\lib;..\..\..\..\lib\platform\windows;..\..\..\..\lib\cmyth\include @@ -137,7 +168,7 @@ true true ..\..\..\..\xbmc;..\..\..\..\lib;..\..\..\..\lib\platform\windows;..\..\..\..\project\BuildDependencies\include;..\..\..\..\lib\cmyth\include - _CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;_WINSOCKAPI_;USE_DEMUX;__STDC_CONSTANT_MACROS;__WINDOWS__;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;_WINSOCKAPI_;USE_DEMUX;__STDC_CONSTANT_MACROS;__STDC_FORMAT_MACROS;__WINDOWS__;TARGET_WINDOWS;%(PreprocessorDefinitions) 4996 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/project/VS2010Express/pvr.mythtv.cmyth.vcxproj.filters xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/project/VS2010Express/pvr.mythtv.cmyth.vcxproj.filters --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/project/VS2010Express/pvr.mythtv.cmyth.vcxproj.filters 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/project/VS2010Express/pvr.mythtv.cmyth.vcxproj.filters 2014-01-28 20:43:50.000000000 +0000 @@ -38,6 +38,46 @@ cppmyth + + cppmyth + + + cppmyth + + + demuxer + + + demuxer + + + demuxer + + + demuxer + + + demuxer + + + demuxer + + + demuxer + + + demuxer + + + demuxer + + + demuxer + + + + demuxer + @@ -82,6 +122,55 @@ cppmyth + + cppmyth + + + cppmyth + + + demuxer + + + demuxer + + + demuxer + + + demuxer + + + demuxer + + + demuxer + + + demuxer + + + demuxer + + + demuxer + + + demuxer + + + demuxer + + + demuxer + + + demuxer + + + + demuxer + @@ -99,6 +188,9 @@ {3ba85d2f-45bc-4080-8895-55949f7f52a7} + + {af26b031-f1b0-4eed-bdb7-1e12feef27d0} + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/client.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/client.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/client.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/client.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -32,6 +32,7 @@ * and exported to the other source files. */ CStdString g_szMythHostname = DEFAULT_HOST; ///< The Host name or IP of the mythtv server +CStdString g_szMythHostEther = ""; ///< The Host MAC address of the mythtv server int g_iMythPort = DEFAULT_PORT; ///< The mythtv Port (default is 6543) CStdString g_szDBUser = DEFAULT_DB_USER; ///< The mythtv sql username (default is mythtv) CStdString g_szDBPassword = DEFAULT_DB_PASSWORD; ///< The mythtv sql password (default is mythtv) @@ -52,6 +53,7 @@ bool g_bRecAutoRunJob4 = false; bool g_bRecAutoExpire = false; int g_iRecTranscoder = 0; +bool g_bDemuxing = DEFAULT_HANDLE_DEMUXING; ///* Client member variables */ ADDON_STATUS m_CurStatus = ADDON_STATUS_UNKNOWN; @@ -65,6 +67,7 @@ CHelper_libXBMC_addon *XBMC = NULL; CHelper_libXBMC_pvr *PVR = NULL; CHelper_libXBMC_gui *GUI = NULL; +CHelper_libXBMC_codec *CODEC = NULL; extern "C" { @@ -117,6 +120,15 @@ } XBMC->Log(LOG_DEBUG, "Register handle @ libXBMC_gui...done"); + CODEC = new CHelper_libXBMC_codec; + if (!CODEC->RegisterMe(hdl)) + { + SAFE_DELETE(PVR); + SAFE_DELETE(XBMC); + SAFE_DELETE(GUI); + return ADDON_STATUS_PERMANENT_FAILURE; + } + m_CurStatus = ADDON_STATUS_UNKNOWN; g_szUserPath = pvrprops->strUserPath; g_szClientPath = pvrprops->strClientPath; @@ -230,29 +242,44 @@ XBMC->Log(LOG_ERROR, "Couldn't get 'rec_template_provider' setting, falling back to '%i' as default", DEFAULT_RECORD_TEMPLATE); g_iRecTemplateType = DEFAULT_RECORD_TEMPLATE; } - /* Get internal template settings when selected (0) */ - if (g_iRecTemplateType == 0) + /* Get internal template settings */ + if (!XBMC->GetSetting("rec_autometadata", &g_bRecAutoMetadata)) + g_bRecAutoMetadata = true; + if (!XBMC->GetSetting("rec_autocommflag", &g_bRecAutoCommFlag)) + g_bRecAutoCommFlag = false; + if (!XBMC->GetSetting("rec_autotranscode", &g_bRecAutoTranscode)) + g_bRecAutoTranscode = false; + if (!XBMC->GetSetting("rec_autorunjob1", &g_bRecAutoRunJob1)) + g_bRecAutoRunJob1 = false; + if (!XBMC->GetSetting("rec_autorunjob2", &g_bRecAutoRunJob2)) + g_bRecAutoRunJob2 = false; + if (!XBMC->GetSetting("rec_autorunjob3", &g_bRecAutoRunJob3)) + g_bRecAutoRunJob3 = false; + if (!XBMC->GetSetting("rec_autorunjob4", &g_bRecAutoRunJob4)) + g_bRecAutoRunJob4 = false; + if (!XBMC->GetSetting("rec_autoexpire", &g_bRecAutoExpire)) + g_bRecAutoExpire = false; + if (!XBMC->GetSetting("rec_transcoder", &g_iRecTranscoder)) + g_iRecTranscoder = 0; + + /* Read setting "demuxing" from settings.xml */ + if (!XBMC->GetSetting("demuxing", &g_bDemuxing)) { - if (!XBMC->GetSetting("rec_autometadata", &g_bRecAutoMetadata)) - g_bRecAutoMetadata = true; - if (!XBMC->GetSetting("rec_autocommflag", &g_bRecAutoCommFlag)) - g_bRecAutoCommFlag = false; - if (!XBMC->GetSetting("rec_autotranscode", &g_bRecAutoTranscode)) - g_bRecAutoTranscode = false; - if (!XBMC->GetSetting("rec_autorunjob1", &g_bRecAutoRunJob1)) - g_bRecAutoRunJob1 = false; - if (!XBMC->GetSetting("rec_autorunjob2", &g_bRecAutoRunJob2)) - g_bRecAutoRunJob2 = false; - if (!XBMC->GetSetting("rec_autorunjob3", &g_bRecAutoRunJob3)) - g_bRecAutoRunJob3 = false; - if (!XBMC->GetSetting("rec_autorunjob4", &g_bRecAutoRunJob4)) - g_bRecAutoRunJob4 = false; - if (!XBMC->GetSetting("rec_autoexpire", &g_bRecAutoExpire)) - g_bRecAutoExpire = false; - if (!XBMC->GetSetting("rec_transcoder", &g_iRecTranscoder)) - g_iRecTranscoder = 0; + /* If setting is unknown fallback to defaults */ + XBMC->Log(LOG_ERROR, "Couldn't get 'demuxing' setting, falling back to '%b' as default", DEFAULT_HANDLE_DEMUXING); + g_bDemuxing = DEFAULT_HANDLE_DEMUXING; } + /* Read setting "host_ether" from settings.xml */ + if (XBMC->GetSetting("host_ether", buffer)) + g_szMythHostEther = buffer; + else + { + /* If setting is unknown fallback to defaults */ + g_szMythHostEther = ""; + } + buffer[0] = 0; + free (buffer); // Create our addon @@ -262,6 +289,7 @@ { XBMC->Log(LOG_ERROR, "Failed to connect to backend"); SAFE_DELETE(g_client); + SAFE_DELETE(CODEC); SAFE_DELETE(GUI); SAFE_DELETE(PVR); SAFE_DELETE(XBMC); @@ -280,6 +308,55 @@ g_client->SetLiveTVPriority(savedLiveTVPriority); } + XBMC->Log(LOG_DEBUG, "Creating menu hooks"); + PVR_MENUHOOK menuHookDeleteAndRerecord; + menuHookDeleteAndRerecord.category = PVR_MENUHOOK_RECORDING; + menuHookDeleteAndRerecord.iHookId = MENUHOOK_REC_DELETE_AND_RERECORD; + menuHookDeleteAndRerecord.iLocalizedStringId = 30411; + PVR->AddMenuHook(&menuHookDeleteAndRerecord); + + PVR_MENUHOOK menuHookKeepLiveTVRec; + menuHookKeepLiveTVRec.category = PVR_MENUHOOK_RECORDING; + menuHookKeepLiveTVRec.iHookId = MENUHOOK_KEEP_LIVETV_RECORDING; + menuHookKeepLiveTVRec.iLocalizedStringId = 30412; + PVR->AddMenuHook(&menuHookKeepLiveTVRec); + + PVR_MENUHOOK menuhookSettingShowNR; + menuhookSettingShowNR.category = PVR_MENUHOOK_SETTING; + menuhookSettingShowNR.iHookId = MENUHOOK_SHOW_HIDE_NOT_RECORDING; + menuhookSettingShowNR.iLocalizedStringId = 30421; + PVR->AddMenuHook(&menuhookSettingShowNR); + + PVR_MENUHOOK menuhookEpgRec1; + menuhookEpgRec1.category = PVR_MENUHOOK_EPG; + menuhookEpgRec1.iHookId = MENUHOOK_EPG_REC_CHAN_ALL_SHOWINGS; + menuhookEpgRec1.iLocalizedStringId = 30431; + PVR->AddMenuHook(&menuhookEpgRec1); + + PVR_MENUHOOK menuhookEpgRec2; + menuhookEpgRec2.category = PVR_MENUHOOK_EPG; + menuhookEpgRec2.iHookId = MENUHOOK_EPG_REC_CHAN_WEEKLY; + menuhookEpgRec2.iLocalizedStringId = 30432; + PVR->AddMenuHook(&menuhookEpgRec2); + + PVR_MENUHOOK menuhookEpgRec3; + menuhookEpgRec3.category = PVR_MENUHOOK_EPG; + menuhookEpgRec3.iHookId = MENUHOOK_EPG_REC_CHAN_DAILY; + menuhookEpgRec3.iLocalizedStringId = 30433; + PVR->AddMenuHook(&menuhookEpgRec3); + + PVR_MENUHOOK menuhookEpgRec4; + menuhookEpgRec4.category = PVR_MENUHOOK_EPG; + menuhookEpgRec4.iHookId = MENUHOOK_EPG_REC_ONE_SHOWING; + menuhookEpgRec4.iLocalizedStringId = 30434; + PVR->AddMenuHook(&menuhookEpgRec4); + + PVR_MENUHOOK menuhookEpgRec5; + menuhookEpgRec5.category = PVR_MENUHOOK_EPG; + menuhookEpgRec5.iHookId = MENUHOOK_EPG_REC_NEW_EPISODES; + menuhookEpgRec5.iLocalizedStringId = 30435; + PVR->AddMenuHook(&menuhookEpgRec5); + XBMC->Log(LOG_DEBUG, "MythTV cmyth PVR-Client successfully created"); m_CurStatus = ADDON_STATUS_OK; g_bCreated = true; @@ -295,6 +372,12 @@ g_bCreated = false; } + if (CODEC) + { + delete(CODEC); + CODEC = NULL; + } + if (PVR) { delete(PVR); @@ -316,6 +399,26 @@ m_CurStatus = ADDON_STATUS_UNKNOWN; } +void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ + (void)data; + XBMC->Log(LOG_INFO, "Received announcement: %s, %s, %s", flag, sender, message); + + if (g_client == NULL) + return; + + if (strcmp("xbmc", sender) == 0) + { + if (strcmp("System", flag) == 0) + { + if (strcmp("OnSleep", message) == 0) + g_client->OnSleep(); + else if (strcmp("OnWake", message) == 0) + g_client->OnWake(); + } + } +} + ADDON_STATUS ADDON_GetStatus() { return m_CurStatus; @@ -383,23 +486,23 @@ if (tmp_sDBName != g_szDBName) return ADDON_STATUS_NEED_RESTART; } + else if (str == "demuxing") + { + XBMC->Log(LOG_INFO, "Changed Setting 'demuxing' from %u to %u", g_bDemuxing, *(bool*)settingValue); + if (g_bDemuxing != *(bool*)settingValue) + return ADDON_STATUS_NEED_RESTART; + } else if (str == "extradebug") { XBMC->Log(LOG_INFO, "Changed Setting 'extra debug' from %u to %u", g_bExtraDebug, *(bool*)settingValue); if (g_bExtraDebug != *(bool*)settingValue) - { g_bExtraDebug = *(bool*)settingValue; - return ADDON_STATUS_OK; - } } else if (str == "livetv") { XBMC->Log(LOG_INFO, "Changed Setting 'livetv' from %u to %u", g_bLiveTV, *(bool*)settingValue); if (g_bLiveTV != *(bool*)settingValue) - { g_bLiveTV = *(bool*)settingValue; - return ADDON_STATUS_OK; - } } else if (str == "livetv_priority") { @@ -408,9 +511,68 @@ { g_bLiveTVPriority = *(bool*)settingValue; g_client->SetLiveTVPriority(g_bLiveTVPriority); - return ADDON_STATUS_OK; } } + else if (str == "rec_template_provider") + { + XBMC->Log(LOG_INFO, "Changed Setting 'rec_template_provider' from %u to %u", g_iRecTemplateType, *(int*)settingValue); + if (g_iRecTemplateType != *(int*)settingValue) + g_iRecTemplateType = *(int*)settingValue; + } + else if (str == "rec_autometadata") + { + XBMC->Log(LOG_INFO, "Changed Setting 'rec_autometadata' from %u to %u", g_bRecAutoMetadata, *(bool*)settingValue); + if (g_bRecAutoMetadata != *(bool*)settingValue) + g_bRecAutoMetadata = *(bool*)settingValue; + } + else if (str == "rec_autocommflag") + { + XBMC->Log(LOG_INFO, "Changed Setting 'rec_autocommflag' from %u to %u", g_bRecAutoCommFlag, *(bool*)settingValue); + if (g_bRecAutoCommFlag != *(bool*)settingValue) + g_bRecAutoCommFlag = *(bool*)settingValue; + } + else if (str == "rec_autotranscode") + { + XBMC->Log(LOG_INFO, "Changed Setting 'rec_autotranscode' from %u to %u", g_bRecAutoTranscode, *(bool*)settingValue); + if (g_bRecAutoTranscode != *(bool*)settingValue) + g_bRecAutoTranscode = *(bool*)settingValue; + } + else if (str == "rec_transcoder") + { + XBMC->Log(LOG_INFO, "Changed Setting 'rec_transcoder' from %u to %u", g_iRecTranscoder, *(int*)settingValue); + if (g_iRecTranscoder != *(int*)settingValue) + g_iRecTranscoder = *(int*)settingValue; + } + else if (str == "rec_autorunjob1") + { + XBMC->Log(LOG_INFO, "Changed Setting 'rec_autorunjob1' from %u to %u", g_bRecAutoRunJob1, *(bool*)settingValue); + if (g_bRecAutoRunJob1 != *(bool*)settingValue) + g_bRecAutoRunJob1 = *(bool*)settingValue; + } + else if (str == "rec_autorunjob2") + { + XBMC->Log(LOG_INFO, "Changed Setting 'rec_autorunjob2' from %u to %u", g_bRecAutoRunJob2, *(bool*)settingValue); + if (g_bRecAutoRunJob2 != *(bool*)settingValue) + g_bRecAutoRunJob2 = *(bool*)settingValue; + } + else if (str == "rec_autorunjob3") + { + XBMC->Log(LOG_INFO, "Changed Setting 'rec_autorunjob3' from %u to %u", g_bRecAutoRunJob3, *(bool*)settingValue); + if (g_bRecAutoRunJob3 != *(bool*)settingValue) + g_bRecAutoRunJob3 = *(bool*)settingValue; + } + else if (str == "rec_autorunjob4") + { + XBMC->Log(LOG_INFO, "Changed Setting 'rec_autorunjob4' from %u to %u", g_bRecAutoRunJob4, *(bool*)settingValue); + if (g_bRecAutoRunJob4 != *(bool*)settingValue) + g_bRecAutoRunJob4 = *(bool*)settingValue; + } + else if (str == "rec_autoexpire") + { + XBMC->Log(LOG_INFO, "Changed Setting 'rec_autoexpire' from %u to %u", g_bRecAutoExpire, *(bool*)settingValue); + if (g_bRecAutoExpire != *(bool*)settingValue) + g_bRecAutoExpire = *(bool*)settingValue; + } return ADDON_STATUS_OK; } @@ -441,6 +603,18 @@ return strMinApiVersion; } +const char* GetGUIAPIVersion(void) +{ + static const char *strGuiApiVersion = XBMC_GUI_API_VERSION; + return strGuiApiVersion; +} + +const char* GetMininumGUIAPIVersion(void) +{ + static const char *strMinGuiApiVersion = XBMC_GUI_MIN_API_VERSION; + return strMinGuiApiVersion; +} + PVR_ERROR GetAddonCapabilities(PVR_ADDON_CAPABILITIES *pCapabilities) { if (g_client != NULL) @@ -455,11 +629,12 @@ pCapabilities->bSupportsTimers = true; pCapabilities->bHandlesInputStream = true; - pCapabilities->bHandlesDemuxing = false; + pCapabilities->bHandlesDemuxing = g_bDemuxing; pCapabilities->bSupportsRecordings = true; pCapabilities->bSupportsRecordingPlayCount = true; pCapabilities->bSupportsLastPlayedPosition = true; + pCapabilities->bSupportsRecordingEdl = true; return PVR_ERROR_NO_ERROR; } else @@ -468,12 +643,6 @@ } } -PVR_ERROR GetStreamProperties(PVR_STREAM_PROPERTIES* props) -{ - (void)props; - return PVR_ERROR_NOT_IMPLEMENTED; -} - const char *GetBackendName() { return g_client->GetBackendName(); @@ -499,12 +668,12 @@ return PVR_ERROR_FAILED; } -PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook) +PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_MENUHOOK_DATA &item) { if (g_client == NULL) return PVR_ERROR_SERVER_ERROR; - return g_client->CallMenuHook(menuhook); + return g_client->CallMenuHook(menuhook, item); } /*******************************************/ @@ -653,6 +822,14 @@ return g_client->GetRecordingLastPlayedPosition(recording); } +PVR_ERROR GetRecordingEdl(const PVR_RECORDING &recording, PVR_EDL_ENTRY entries[], int *size) +{ + if (g_client == NULL) + return PVR_ERROR_SERVER_ERROR; + + return g_client->GetRecordingEdl(recording, entries, size); +} + /*******************************************/ /** PVR Timer Functions **/ @@ -726,6 +903,7 @@ if (dataread < 0) { XBMC->Log(LOG_ERROR,"%s: Failed to read liveStream. Errorcode: %d!", __FUNCTION__, dataread); + dataread = 0; } return dataread; } @@ -845,16 +1023,72 @@ return g_client->LengthRecordedStream(); } +/*******************************************/ +/** PVR Demux Functions **/ + +PVR_ERROR GetStreamProperties(PVR_STREAM_PROPERTIES* pProperties) +{ + if (g_client == NULL) + return PVR_ERROR_SERVER_ERROR; + + return g_client->GetStreamProperties(pProperties); +} + +void DemuxAbort(void) +{ + if (g_client != NULL) + g_client->DemuxAbort(); +} + +DemuxPacket* DemuxRead(void) +{ + if (g_client == NULL) + return NULL; + + return g_client->DemuxRead(); +} + +void DemuxFlush(void) +{ + if (g_client != NULL) + g_client->DemuxFlush(); +} + +bool SeekTime(int time, bool backwards, double *startpts) +{ + if (g_client != NULL) + return g_client->SeekTime(time, backwards, startpts); + return false; +} + +/*******************************************/ +/** PVR Timeshift Functions **/ + +time_t GetPlayingTime() +{ + if (g_client != NULL) + return g_client->GetPlayingTime(); + return 0; +} + +time_t GetBufferTimeStart() +{ + if (g_client != NULL) + return g_client->GetBufferTimeStart(); + return 0; +} + +time_t GetBufferTimeEnd() +{ + if (g_client != NULL) + return g_client->GetBufferTimeEnd(); + return 0; +} /*******************************************/ /** Unused API Functions **/ -DemuxPacket* DemuxRead() { return NULL; } -void DemuxAbort() {} void DemuxReset() {} -void DemuxFlush() {} const char * GetLiveStreamURL(const PVR_CHANNEL &) { return ""; } -bool SeekTime(int,bool,double*) { return false; } void SetSpeed(int) {}; - } //end extern "C" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/client.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/client.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/client.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/client.h 2014-01-28 20:43:50.000000000 +0000 @@ -27,6 +27,7 @@ #include #include #include +#include extern "C" { #include @@ -34,6 +35,18 @@ #ifdef __WINDOWS__ #define strdup _strdup // # strdup is POSIX, _strdup should be used instead + +static inline struct tm *localtime_r(const time_t * clock, struct tm *result) +{ + struct tm *data; + if (!clock || !result) + return NULL; + data = localtime(clock); + if (!data) + return NULL; + memcpy(result, data, sizeof(*result)); + return result; +} #endif #define TCP_RCV_BUF_CONTROL_SIZE 128000 // Inherited from MythTV's MythSocket class @@ -60,6 +73,17 @@ #define SUBTITLE_SEPARATOR " - " +#define MENUHOOK_REC_DELETE_AND_RERECORD 1 +#define MENUHOOK_KEEP_LIVETV_RECORDING 2 +#define MENUHOOK_SHOW_HIDE_NOT_RECORDING 3 +#define MENUHOOK_EPG_REC_CHAN_ALL_SHOWINGS 4 +#define MENUHOOK_EPG_REC_CHAN_WEEKLY 5 +#define MENUHOOK_EPG_REC_CHAN_DAILY 6 +#define MENUHOOK_EPG_REC_ONE_SHOWING 7 +#define MENUHOOK_EPG_REC_NEW_EPISODES 8 + +#define DEFAULT_HANDLE_DEMUXING false + /*! * @brief PVR macros for string exchange */ @@ -77,6 +101,7 @@ /* Client Settings */ extern CStdString g_szMythHostname; ///< The Host name or IP of the mythtv server +extern CStdString g_szMythHostEther; ///< The Host MAC address of the mythtv server extern int g_iMythPort; ///< The mythtv Port (default is 6543) extern CStdString g_szDBUser; ///< The mythtv sql username (default is mythtv) extern CStdString g_szDBPassword; ///< The mythtv sql password (default is mythtv) @@ -98,9 +123,11 @@ extern bool g_bRecAutoRunJob4; extern bool g_bRecAutoExpire; extern int g_iRecTranscoder; +extern bool g_bDemuxing; extern ADDON::CHelper_libXBMC_addon *XBMC; extern CHelper_libXBMC_pvr *PVR; extern CHelper_libXBMC_gui *GUI; +extern CHelper_libXBMC_codec *CODEC; #endif /* CLIENT_H */ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythChannel.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythChannel.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythChannel.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythChannel.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -23,13 +23,11 @@ MythChannel::MythChannel() : m_channel_t() - , m_radio(false) { } -MythChannel::MythChannel(cmyth_channel_t cmyth_channel, bool isRadio) +MythChannel::MythChannel(cmyth_channel_t cmyth_channel) : m_channel_t(new MythPointer()) - , m_radio(isRadio) { *m_channel_t = cmyth_channel; } @@ -61,8 +59,10 @@ CStdString MythChannel::Number() { - // Must not be deleted - return CStdString(cmyth_channel_channumstr(*m_channel_t)); + char *cChanNum = cmyth_channel_channumstr(*m_channel_t); + CStdString retval(cChanNum); + ref_release(cChanNum); + return retval; } CStdString MythChannel::Callsign() @@ -86,9 +86,9 @@ return cmyth_channel_visible(*m_channel_t) > 0; } -bool MythChannel::IsRadio() const +bool MythChannel::IsRadio() { - return m_radio; + return cmyth_channel_radio(*m_channel_t) > 0; } unsigned int MythChannel::SourceID() diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythChannel.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythChannel.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythChannel.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythChannel.h 2014-01-04 10:28:12.000000000 +0000 @@ -33,7 +33,7 @@ { public: MythChannel(); - MythChannel(cmyth_channel_t cmyth_channel, bool isRadio); + MythChannel(cmyth_channel_t cmyth_channel); bool IsNull() const; @@ -44,11 +44,10 @@ CStdString Callsign(); CStdString Icon(); bool Visible(); - bool IsRadio() const; + bool IsRadio(); unsigned int SourceID(); unsigned int MultiplexID(); private: boost::shared_ptr > m_channel_t; - bool m_radio; -}; \ No newline at end of file +}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythConnection.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythConnection.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythConnection.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythConnection.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -67,17 +67,23 @@ : m_conn_t(new MythPointerThreadSafe()) , m_server("") , m_port(0) + , m_playback(false) , m_pEventHandler(NULL) { } -MythConnection::MythConnection(const CStdString &server, unsigned short port) +MythConnection::MythConnection(const CStdString &server, unsigned short port, bool playback) : m_conn_t(new MythPointerThreadSafe) , m_server(server) , m_port(port) + , m_playback(playback) , m_pEventHandler(NULL) { - cmyth_conn_t connection = cmyth_conn_connect_ctrl(const_cast(server.c_str()), port, RCV_BUF_CONTROL_SIZE, TCP_RCV_BUF_CONTROL_SIZE); + cmyth_conn_t connection; + if (m_playback) + connection = cmyth_conn_connect_playback(const_cast(server.c_str()), port, RCV_BUF_CONTROL_SIZE, TCP_RCV_BUF_CONTROL_SIZE); + else + connection = cmyth_conn_connect_monitor(const_cast(server.c_str()), port, RCV_BUF_CONTROL_SIZE, TCP_RCV_BUF_CONTROL_SIZE); *m_conn_t = connection; } @@ -128,8 +134,15 @@ bool MythConnection::TryReconnect() { int retval; + + if (!g_szMythHostEther.IsEmpty()) + XBMC->WakeOnLan(g_szMythHostEther); + Lock(); - retval = cmyth_conn_reconnect_ctrl(*m_conn_t); + if (m_playback) + retval = cmyth_conn_reconnect_playback(*m_conn_t); + else + retval = cmyth_conn_reconnect_monitor(*m_conn_t); Unlock(); if (retval == 0) XBMC->Log(LOG_DEBUG, "%s - Unable to reconnect", __FUNCTION__); @@ -208,7 +221,14 @@ bool MythConnection::DeleteRecording(MythProgramInfo &recording) { int retval = 0; - CMYTH_CONN_CALL(retval, retval < 0, cmyth_proginfo_delete_recording(*m_conn_t, *recording.m_proginfo_t)); + CMYTH_CONN_CALL(retval, retval < 0, cmyth_proginfo_delete_recording(*m_conn_t, *recording.m_proginfo_t, 0, 0)); + return retval >= 0; +} + +bool MythConnection::DeleteAndForgetRecording(MythProgramInfo &recording) +{ + int retval = 0; + CMYTH_CONN_CALL(retval, retval < 0, cmyth_proginfo_delete_recording(*m_conn_t, *recording.m_proginfo_t, 0, 1)); return retval >= 0; } @@ -264,6 +284,13 @@ return retval; } +bool MythConnection::GenerateRecordingPreview(MythProgramInfo &recording) +{ + int retval = 0; + CMYTH_CONN_CALL(retval, retval < 0, cmyth_proginfo_generate_pixmap(*m_conn_t, *recording.m_proginfo_t)); + return retval >= 0; +} + ProgramInfoMap MythConnection::GetPendingPrograms() { Lock(); @@ -322,10 +349,10 @@ return (retval >= 0); } -MythStorageGroupFile MythConnection::GetStorageGroupFile(const CStdString &storageGroup, const CStdString &filename) +MythStorageGroupFile MythConnection::GetStorageGroupFile(const CStdString &hostname, const CStdString &storageGroup, const CStdString &filename) { cmyth_storagegroup_file_t file = NULL; - CMYTH_CONN_CALL_REF(file, file == NULL, cmyth_storagegroup_get_fileinfo(*m_conn_t, const_cast(storageGroup.c_str()), const_cast(GetBackendHostname().c_str()), const_cast(filename.c_str()))); + CMYTH_CONN_CALL_REF(file, file == NULL, cmyth_storagegroup_get_fileinfo(*m_conn_t, const_cast(hostname.c_str()), const_cast(storageGroup.c_str()), const_cast(filename.c_str()))); return MythStorageGroupFile(file); } @@ -335,7 +362,7 @@ // so always check after calling cmyth_conn_connect_file if still connected to control socket. cmyth_file_t file = NULL; CMYTH_CONN_CALL_REF(file, true, cmyth_conn_connect_file(*recording.m_proginfo_t, *m_conn_t, RCV_BUF_DATA_SIZE, TCP_RCV_BUF_DATA_SIZE)); - MythFile retval = MythFile(file, *this); + MythFile retval = MythFile(file); return retval; } @@ -343,7 +370,7 @@ { cmyth_file_t file = NULL; CMYTH_CONN_CALL_REF(file, file == NULL, cmyth_conn_connect_path(const_cast(filename.c_str()), *m_conn_t, RCV_BUF_DATA_SIZE, TCP_RCV_BUF_DATA_SIZE, const_cast(storageGroup.c_str()))); - return MythFile(file, *this); + return MythFile(file); } bool MythConnection::SetBookmark(MythProgramInfo &recording, long long bookmark) @@ -359,3 +386,41 @@ CMYTH_CONN_CALL(bookmark, bookmark < 0, cmyth_get_bookmark(*m_conn_t, *recording.m_proginfo_t)); return bookmark; } + +Edl MythConnection::GetCommbreakList(MythProgramInfo &recording) +{ + Edl retval; + cmyth_commbreaklist_t list = NULL; + CMYTH_CONN_CALL(list, list == NULL, cmyth_get_commbreaklist(*m_conn_t, *recording.m_proginfo_t)); + if (!list) + return retval; + + retval.reserve(list->commbreak_count); + for (int i = 0; i < list->commbreak_count; ++i) + { + cmyth_commbreak commbreak = *list->commbreak_list[i]; + retval.push_back(commbreak); + } + + ref_release(list); + return retval; +} + +Edl MythConnection::GetCutList(MythProgramInfo &recording) +{ + Edl retval; + cmyth_commbreaklist_t list = NULL; + CMYTH_CONN_CALL(list, list == NULL, cmyth_get_cutlist(*m_conn_t, *recording.m_proginfo_t)); + if (!list) + return retval; + + retval.reserve(list->commbreak_count); + for (int i = 0; i < list->commbreak_count; ++i) + { + cmyth_commbreak commbreak = *list->commbreak_list[i]; + retval.push_back(commbreak); + } + + ref_release(list); + return retval; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythConnection.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythConnection.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythConnection.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythConnection.h 2014-01-04 10:28:12.000000000 +0000 @@ -42,11 +42,14 @@ typedef std::map ProgramInfoMap; +typedef cmyth_commbreak MythEdlEntry; +typedef std::vector Edl; + class MythConnection { public: MythConnection(); - MythConnection(const CStdString &server, unsigned short port); + MythConnection(const CStdString &server, unsigned short port, bool playback); MythEventHandler *CreateEventHandler(); @@ -71,9 +74,11 @@ // Recordings bool DeleteRecording(MythProgramInfo &recording); + bool DeleteAndForgetRecording(MythProgramInfo &recording); ProgramInfoMap GetRecordedPrograms(); MythProgramInfo GetRecordedProgram(const CStdString &basename); MythProgramInfo GetRecordedProgram(int chanid, const MythTimestamp &recstartts); + bool GenerateRecordingPreview(MythProgramInfo &recording); // Timers ProgramInfoMap GetPendingPrograms(); @@ -84,16 +89,21 @@ // Files MythFile ConnectFile(MythProgramInfo &recording); MythFile ConnectPath(const CStdString &filename, const CStdString &storageGroup); - MythStorageGroupFile GetStorageGroupFile(const CStdString &storageGroup, const CStdString &filename); + MythStorageGroupFile GetStorageGroupFile(const CStdString &hostname, const CStdString &storageGroup, const CStdString &filename); // Bookmarks long long GetBookmark(MythProgramInfo &recording); bool SetBookmark(MythProgramInfo &recording, long long bookmark); + // Edl + Edl GetCutList(MythProgramInfo &recording); + Edl GetCommbreakList(MythProgramInfo &recording); + private: boost::shared_ptr > m_conn_t; CStdString m_server; unsigned short m_port; + bool m_playback; MythEventHandler *m_pEventHandler; }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythDatabase.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythDatabase.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythDatabase.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythDatabase.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -20,6 +20,7 @@ #include "MythDatabase.h" #include "MythChannel.h" +#include "MythEPGInfo.h" #include "MythProgramInfo.h" #include "MythRecordingRule.h" #include "MythPointer.h" @@ -87,24 +88,39 @@ return data; } -bool MythDatabase::FindProgram(time_t starttime, int channelid, const CStdString &title, MythProgram* program) +bool MythDatabase::FindProgram(time_t starttime, int channelid, const CStdString &title, MythEPGInfo &epgInfo) { int retval = 0; - CMYTH_DB_CALL(retval, retval < 0, cmyth_mysql_get_prog_finder_time_title_chan(*m_database_t, program, starttime, const_cast(title.c_str()), channelid)); + cmyth_epginfo_t epg = NULL; + CMYTH_DB_CALL(retval, retval < 0, cmyth_mysql_get_prog_finder_time_title_chan(*m_database_t, &epg, starttime, const_cast(title.c_str()), channelid)); + epgInfo = MythEPGInfo(epg); return retval > 0; } -ProgramList MythDatabase::GetGuide(int channelid, time_t starttime, time_t endtime) +bool MythDatabase::FindCurrentProgram(time_t attime, int channelid, MythEPGInfo &epgInfo) { - MythProgram *programs = 0; - int len = 0; - CMYTH_DB_CALL(len, len < 0, cmyth_mysql_get_guide(*m_database_t, &programs, channelid, starttime, endtime)); + int retval = 0; + cmyth_epginfo_t epg = NULL; + CMYTH_DB_CALL(retval, retval < 0, cmyth_mysql_get_prog_finder_chan(*m_database_t, &epg, attime, channelid)); + epgInfo = MythEPGInfo(epg); + return retval > 0; +} - if (len < 1) - return ProgramList(); +EPGInfoMap MythDatabase::GetGuide(int channelid, time_t starttime, time_t endtime) +{ + int ret; + EPGInfoMap retval; + cmyth_epginfolist_t epgInfoList = NULL; + CMYTH_DB_CALL(ret, ret < 0, cmyth_mysql_get_guide(*m_database_t, &epgInfoList, channelid, starttime, endtime)); + int epgCount = cmyth_epginfolist_get_count(epgInfoList); - ProgramList retval(programs, programs + len); - ref_release(programs); + for (int i = 0; i < epgCount; i++) + { + cmyth_epginfo_t epg = cmyth_epginfolist_get_item(epgInfoList, i); + MythEPGInfo epgInfo = MythEPGInfo(epg); + retval.insert(std::make_pair(epgInfo.StartTime(), epgInfo)); + } + ref_release(epgInfoList); return retval; } @@ -120,8 +136,7 @@ { cmyth_channel_t channel = cmyth_chanlist_get_item(channels, i); int channelID = cmyth_channel_chanid(channel); - bool isRadio = cmyth_mysql_is_radio(*m_database_t, channelID) == 1; - retval.insert(std::pair(channelID, MythChannel(channel, isRadio))); + retval.insert(std::pair(channelID, MythChannel(channel))); } ref_release(channels); return retval; @@ -145,12 +160,12 @@ if (channelCount > 0) { retval.insert(std::make_pair(channelGroups[i].name, std::vector(channelIDs, channelIDs + channelCount))); - ref_release(channelIDs); } else { retval.insert(std::make_pair(channelGroups[i].name, std::vector())); } + ref_release(channelIDs); } ref_release(channelGroups); return retval; @@ -204,10 +219,10 @@ return retval > 0; } -bool MythDatabase::DeleteRecordingRule(unsigned int recordid) +bool MythDatabase::DeleteRecordingRule(const MythRecordingRule &rule) { int retval = 0; - CMYTH_DB_CALL(retval, retval < 0, cmyth_mysql_delete_recordingrule(*m_database_t, recordid)); + CMYTH_DB_CALL(retval, retval < 0, cmyth_mysql_delete_recordingrule(*m_database_t, *rule.m_recordingrule_t)); return retval > 0; } @@ -259,10 +274,10 @@ return mark; } -long long MythDatabase::GetRecordingMarkup(const MythProgramInfo &recording, int type) +long long MythDatabase::GetRecordingMarkup(const MythProgramInfo &recording, cmyth_recording_markup_t type) { long long value = 0; - CMYTH_DB_CALL(value, value < 0, cmyth_mysql_get_recording_markup(*m_database_t, *recording.m_proginfo_t, (cmyth_recording_markup_t)type)); + CMYTH_DB_CALL(value, value < 0, cmyth_mysql_get_recording_markup(*m_database_t, *recording.m_proginfo_t, type)); return value; } @@ -273,6 +288,13 @@ return value; } +int MythDatabase::GetRecordingSeekOffset(const MythProgramInfo &recording, cmyth_recording_markup_t type, int64_t mark, int64_t *psoffset, int64_t *nsoffset) +{ + int mask = 0; + CMYTH_DB_CALL(mask, mask < 0, cmyth_mysql_get_recording_seek_offset(*m_database_t, *recording.m_proginfo_t, type, mark, psoffset, nsoffset)); + return mask; +} + bool MythDatabase::FillRecordingArtwork(MythProgramInfo &recording) { int retval = 0; @@ -290,4 +312,12 @@ return true; } return false; -} \ No newline at end of file +} + +bool MythDatabase::KeepLiveTVRecording(MythProgramInfo& recording, bool keep) +{ + int retval = 0; + CMYTH_DB_CALL(retval, retval < 0, cmyth_mysql_keep_livetv_recording(*m_database_t, *recording.m_proginfo_t, (keep ? 1 : 0))); + return (retval > 0); +} + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythDatabase.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythDatabase.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythDatabase.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythDatabase.h 2014-01-04 10:28:12.000000000 +0000 @@ -31,13 +31,13 @@ }; class MythChannel; +class MythEPGInfo; class MythRecordingRule; class MythProgramInfo; template class MythPointerThreadSafe; -typedef cmyth_program_t MythProgram; -typedef std::vector ProgramList; +typedef std::map EPGInfoMap; typedef std::map ChannelIdMap; typedef std::multimap ChannelNumberMap; @@ -70,8 +70,9 @@ CStdString GetSetting(const CStdString &setting); - bool FindProgram(time_t starttime, int channelid, const CStdString &title, MythProgram* pprogram); - ProgramList GetGuide(int channelid, time_t starttime, time_t endtime); + bool FindProgram(time_t starttime, int channelid, const CStdString &title, MythEPGInfo &epgInfo); + bool FindCurrentProgram(time_t attime, int channelid, MythEPGInfo &epgInfo); + EPGInfoMap GetGuide(int channelid, time_t starttime, time_t endtime); ChannelIdMap GetChannels(); ChannelGroupMap GetChannelGroups(); @@ -81,7 +82,7 @@ RecordingRuleMap GetRecordingRules(); bool AddRecordingRule(const MythRecordingRule &rule); bool UpdateRecordingRule(const MythRecordingRule &rule); - bool DeleteRecordingRule(unsigned int recordid); + bool DeleteRecordingRule(const MythRecordingRule &rule); MythRecordingRule LoadRecordingRuleTemplate(const CStdString &category, const CStdString &category_type); RecordingProfileList GetRecordingProfiles(); @@ -89,10 +90,12 @@ bool SetWatchedStatus(const MythProgramInfo &recording, bool watched); long long GetBookmarkMark(const MythProgramInfo &recording, long long bk, int mode); - long long GetRecordingMarkup(const MythProgramInfo &recording, int type); + long long GetRecordingMarkup(const MythProgramInfo &recording, cmyth_recording_markup_t type); long long GetRecordingFrameRate(const MythProgramInfo &recording); + int GetRecordingSeekOffset(const MythProgramInfo &recording, cmyth_recording_markup_t type, int64_t mark, int64_t *psoffset, int64_t *nsoffset); bool FillRecordingArtwork(MythProgramInfo &recording); + bool KeepLiveTVRecording(MythProgramInfo &recording, bool keep); private: boost::shared_ptr > m_database_t; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythEPGInfo.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythEPGInfo.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythEPGInfo.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythEPGInfo.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "MythEPGInfo.h" +#include "MythPointer.h" + +MythEPGInfo::MythEPGInfo() + : m_epginfo_t() +{ +} + +MythEPGInfo::MythEPGInfo(cmyth_epginfo_t cmyth_epginfo) + : m_epginfo_t(new MythPointer()) +{ + *m_epginfo_t = cmyth_epginfo; +} + +bool MythEPGInfo::IsNull() const +{ + if (m_epginfo_t == NULL) + return true; + return *m_epginfo_t == NULL; +} + +unsigned int MythEPGInfo::ChannelID() +{ + return cmyth_epginfo_chanid(*m_epginfo_t); +} + +CStdString MythEPGInfo::ChannelName() +{ + char* buf = cmyth_epginfo_channame(*m_epginfo_t); + CStdString retval(buf); + ref_release(buf); + return retval; +} + +CStdString MythEPGInfo::Callsign() +{ + char* buf = cmyth_epginfo_callsign(*m_epginfo_t); + CStdString retval(buf); + ref_release(buf); + return retval; +} + +unsigned int MythEPGInfo::SourceID() +{ + return cmyth_epginfo_sourceid(*m_epginfo_t); +} + +CStdString MythEPGInfo::Title() +{ + char* buf = cmyth_epginfo_title(*m_epginfo_t); + CStdString retval(buf); + ref_release(buf); + return retval; +} + +CStdString MythEPGInfo::Subtitle() +{ + char* buf = cmyth_epginfo_subtitle(*m_epginfo_t); + CStdString retval(buf); + ref_release(buf); + return retval; +} + +CStdString MythEPGInfo::Description() +{ + char* buf = cmyth_epginfo_description(*m_epginfo_t); + CStdString retval(buf); + ref_release(buf); + return retval; +} + +time_t MythEPGInfo::StartTime() +{ + return cmyth_epginfo_starttime(*m_epginfo_t); +} + +time_t MythEPGInfo::EndTime() +{ + return cmyth_epginfo_endtime(*m_epginfo_t); +} + +CStdString MythEPGInfo::ProgramID() +{ + char* buf = cmyth_epginfo_programid(*m_epginfo_t); + CStdString retval(buf); + ref_release(buf); + return retval; +} + +CStdString MythEPGInfo::SeriesID() +{ + char* buf = cmyth_epginfo_seriesid(*m_epginfo_t); + CStdString retval(buf); + ref_release(buf); + return retval; +} + +CStdString MythEPGInfo::Category() +{ + char* buf = cmyth_epginfo_category(*m_epginfo_t); + CStdString retval(buf); + ref_release(buf); + return retval; +} + +CStdString MythEPGInfo::CategoryType() +{ + char* buf = cmyth_epginfo_category_type(*m_epginfo_t); + CStdString retval(buf); + ref_release(buf); + return retval; +} + +unsigned int MythEPGInfo::ChannelNumberInt() +{ + return cmyth_epginfo_channum(*m_epginfo_t); +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythEPGInfo.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythEPGInfo.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythEPGInfo.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythEPGInfo.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,57 @@ +#pragma once +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "platform/util/StdString.h" + +#include + +extern "C" { +#include +}; + +template class MythPointer; + +class MythEPGInfo +{ +public: + MythEPGInfo(); + MythEPGInfo(cmyth_epginfo_t cmyth_epginfo); + + bool IsNull() const; + + unsigned int ChannelID(); + CStdString ChannelName(); + CStdString Callsign(); + unsigned int SourceID(); + CStdString Title(); + CStdString Subtitle(); + CStdString Description(); + time_t StartTime(); + time_t EndTime(); + CStdString ProgramID(); + CStdString SeriesID(); + CStdString Category(); + CStdString CategoryType(); + unsigned int ChannelNumberInt(); + +private: + boost::shared_ptr > m_epginfo_t; +}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythEventHandler.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythEventHandler.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythEventHandler.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythEventHandler.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -30,6 +30,7 @@ #include using namespace ADDON; +using namespace PLATFORM; template void tokenize(const std::string& str, ContainerT& tokens, @@ -56,7 +57,7 @@ } }; -class MythEventHandler::MythEventHandlerPrivate : public CThread, public CMutex +class MythEventHandler::MythEventHandlerPrivate : public CThread { public: friend class MythEventHandler; @@ -70,18 +71,29 @@ void HandleUpdateSignal(const CStdString &buffer); + void HandleScheduleChange(const CStdString &buffer); + void SetRecordingEventListener(const CStdString &recordid, const MythFile &file); void HandleUpdateFileSize(const CStdString &buffer); + void HandleLiveTVWatch(const CStdString &buffer); + void HandleUpdateLiveTVChain(const CStdString &buffer); + void HandleDoneRecording(const CStdString &buffer); + + void SignalRecordingListEvent(bool changeEvent); + void HandleRecordingListChangeAdd(const CStdString &buffer); + void HandleRecordingListChangeUpdate(const CStdString &buffer, MythProgramInfo &programInfo); + void HandleRecordingListChangeDelete(const CStdString &buffer); + void HandleRecordingListChange(); void RetryConnect(); bool TryReconnect(); - void RecordingListChange(); // Data CStdString m_server; unsigned short m_port; boost::shared_ptr > m_conn_t; + timeval m_timeout; MythEventObserver *m_observer; @@ -90,24 +102,30 @@ bool m_playback; bool m_hang; + bool m_sendWOL; CStdString m_currentRecordID; MythFile m_currentFile; std::list m_recordingChangeEventList; + int m_recordingChangePinCount; + + PLATFORM::CMutex m_lock; }; MythEventHandler::MythEventHandlerPrivate::MythEventHandlerPrivate(const CStdString &server, unsigned short port) : CThread() - , CMutex() , m_server(server) , m_port(port) , m_conn_t(new MythPointerThreadSafe()) + , m_timeout() , m_observer(NULL) , m_recorder(MythRecorder()) , m_signal() , m_playback(false) , m_hang(false) + , m_sendWOL(false) , m_recordingChangeEventList() + , m_recordingChangePinCount(0) { *m_conn_t = cmyth_conn_connect_event(const_cast(m_server.c_str()), port, RCV_BUF_CONTROL_SIZE, TCP_RCV_BUF_CONTROL_SIZE); } @@ -143,18 +161,15 @@ cmyth_event_t myth_event; char databuf[2049]; databuf[0] = 0; - bool triggerRecordingUpdate = false; - unsigned int recordingChangeCount = 0; - timeval timeout; - timeout.tv_sec = 0; - timeout.tv_usec = 100000; + m_timeout.tv_sec = 0; + m_timeout.tv_usec = 100000; while (!IsStopped()) { - bool recordingChange = false; + bool recordingChangeEvent = false; int select = 0; m_conn_t->Lock(); - select = cmyth_event_select(*m_conn_t, &timeout); + select = cmyth_event_select(*m_conn_t, &m_timeout); m_conn_t->Unlock(); if (select > 0) @@ -169,60 +184,22 @@ if (myth_event == CMYTH_EVENT_UPDATE_FILE_SIZE) { - if (g_bExtraDebug) - XBMC->Log(LOG_NOTICE,"%s - Event file size update: %s", __FUNCTION__, databuf); HandleUpdateFileSize(databuf); } else if (myth_event == CMYTH_EVENT_LIVETV_CHAIN_UPDATE) { - Lock(); - if (!m_recorder.IsNull()) - { - bool retval = m_recorder.LiveTVChainUpdate(databuf); - if (g_bExtraDebug) - XBMC->Log(LOG_NOTICE, "%s - Event chain update: %s", __FUNCTION__, (retval ? "true" : "false")); - } - else - if (g_bExtraDebug) - XBMC->Log(LOG_NOTICE, "%s - Event chain update: No recorder", __FUNCTION__); - Unlock(); + HandleUpdateLiveTVChain(databuf); } else if (myth_event == CMYTH_EVENT_LIVETV_WATCH) { - if (g_bExtraDebug) - XBMC->Log(LOG_NOTICE,"%s: Event LIVETV_WATCH: recoder %s", __FUNCTION__, databuf); - - Lock(); - if (!m_recorder.IsNull()) - { - bool retval = m_recorder.LiveTVWatch(databuf); - if (g_bExtraDebug) - XBMC->Log(LOG_NOTICE, "%s: Event LIVETV_WATCH: %s", __FUNCTION__, (retval) ? "true " : "false"); - } - else - if (g_bExtraDebug) - XBMC->Log(LOG_NOTICE, "%s: Event LIVETV_WATCH: No recorder", __FUNCTION__); - Unlock(); + HandleLiveTVWatch(databuf); } else if(myth_event == CMYTH_EVENT_DONE_RECORDING) { - if (g_bExtraDebug) - XBMC->Log(LOG_NOTICE, "%s: Event DONE_RECORDING: recorder %s", __FUNCTION__, databuf); - - Lock(); - if (!m_recorder.IsNull()) - { - bool retval = m_recorder.LiveTVDoneRecording(databuf); - if (g_bExtraDebug) - XBMC->Log(LOG_NOTICE, "%s: Event DONE_RECORDING: %s", __FUNCTION__, (retval) ? "true" : "false"); - } - else - if (g_bExtraDebug) - XBMC->Log(LOG_NOTICE, "%s: Event DONE_RECORDING: No recorder", __FUNCTION__); - Unlock(); + HandleDoneRecording(databuf); } else if (myth_event == CMYTH_EVENT_ASK_RECORDING) @@ -238,61 +215,32 @@ if (myth_event == CMYTH_EVENT_SCHEDULE_CHANGE) { - if (g_bExtraDebug) - XBMC->Log(LOG_NOTICE, "%s - Event schedule change", __FUNCTION__); - PVR->TriggerTimerUpdate(); + HandleScheduleChange(databuf); } else if (myth_event == CMYTH_EVENT_RECORDING_LIST_CHANGE_ADD) { - //Event data: "4121 2010-03-06T01:06:43[]:[]empty" - unsigned int chanid; - char recstartts[20]; - if (strlen(databuf)>=24 && sscanf(databuf, "%u %19s", &chanid, recstartts) == 2) { - Lock(); - m_recordingChangeEventList.push_back(RecordingChangeEvent(CHANGE_ADD, chanid, recstartts)); - Unlock(); - if (g_bExtraDebug) - XBMC->Log(LOG_DEBUG,"%s - Event recording list add: CHANID=%u TS=%s", __FUNCTION__, chanid, recstartts); - recordingChange = true; - } + HandleRecordingListChangeAdd(databuf); + recordingChangeEvent = true; } else if (myth_event == CMYTH_EVENT_RECORDING_LIST_CHANGE_UPDATE) { - //Event data: Updated 'proginfo' is returned - MythProgramInfo prog = MythProgramInfo(proginfo); - if (!prog.IsNull()) - { - Lock(); - m_recordingChangeEventList.push_back(RecordingChangeEvent(CHANGE_UPDATE, prog)); - Unlock(); - if (g_bExtraDebug) - XBMC->Log(LOG_DEBUG,"%s - Event recording list update: UID=%s", __FUNCTION__, prog.UID().c_str()); - recordingChange = true; - } + MythProgramInfo prog(proginfo); + HandleRecordingListChangeUpdate(databuf, prog); + recordingChangeEvent = true; } else if (myth_event == CMYTH_EVENT_RECORDING_LIST_CHANGE_DELETE) { - //Event data: "4121 2010-03-06T01:06:43[]:[]empty" - unsigned int chanid; - char recstartts[20]; - if (strlen(databuf)>=24 && sscanf(databuf, "%u %19s", &chanid, recstartts) == 2) { - Lock(); - m_recordingChangeEventList.push_back(RecordingChangeEvent(CHANGE_DELETE, chanid, recstartts)); - Unlock(); - if (g_bExtraDebug) - XBMC->Log(LOG_DEBUG,"%s - Event recording list delete: CHANID=%u TS=%s", __FUNCTION__, chanid, recstartts); - recordingChange = true; - } + HandleRecordingListChangeDelete(databuf); + recordingChangeEvent = true; } else if (myth_event == CMYTH_EVENT_RECORDING_LIST_CHANGE) { - if (g_bExtraDebug) - XBMC->Log(LOG_NOTICE, "%s - Event recording list change", __FUNCTION__); - RecordingListChange(); + HandleRecordingListChange(); + recordingChangeEvent = true; } else if (myth_event == CMYTH_EVENT_UNKNOWN) @@ -320,38 +268,8 @@ RetryConnect(); } - //Accumulate recording change events before triggering PVR event - //First timeout is 0.5 sec and next 2 secs - if (recordingChange) - { - if (recordingChangeCount == 0) - { - timeout.tv_sec = 0; - timeout.tv_usec = 500000; - } - else - { - timeout.tv_sec = 2; - timeout.tv_usec = 0; - } - recordingChangeCount++; - triggerRecordingUpdate = true; - } - else - { - //Restore timeout - timeout.tv_sec = 0; - timeout.tv_usec = 100000; - //Need PVR update ? - if (triggerRecordingUpdate) - { - XBMC->Log(LOG_DEBUG, "%s - Trigger PVR recording update: %lu recording(s)", __FUNCTION__, recordingChangeCount); - PVR->TriggerRecordingUpdate(); - triggerRecordingUpdate = false; - } - //Reset counter - recordingChangeCount = 0; - } + // Adjust timeout to accumulate more changes or trigger observer as needed + SignalRecordingListEvent(recordingChangeEvent); } // Free recording change event m_recordingChangeEventList.clear(); @@ -361,9 +279,7 @@ void MythEventHandler::MythEventHandlerPrivate::SetRecordingEventListener(const CStdString &recordid, const MythFile &file) { m_currentFile = file; - char recordIDBuffer[20]; - sscanf(recordid.c_str(),"/%4s_%14s", recordIDBuffer, recordIDBuffer + 4); - m_currentRecordID = recordIDBuffer; + m_currentRecordID = recordid; } void MythEventHandler::MythEventHandlerPrivate::HandleAskRecording(const CStdString &databuf, MythProgramInfo &programInfo) @@ -434,29 +350,197 @@ } } +void MythEventHandler::MythEventHandlerPrivate::HandleScheduleChange(const CStdString& buffer) +{ + if (g_bExtraDebug) + XBMC->Log(LOG_NOTICE, "%s: Event SCHEDULE_CHANGE: %s", __FUNCTION__, buffer.c_str()); + m_observer->UpdateSchedules(); +} + void MythEventHandler::MythEventHandlerPrivate::HandleUpdateFileSize(const CStdString &buffer) { - // UPDATE_FILE_SIZE - // Example: 4092 2009-09-29T02:58:42 290586314 + // UPDATE_FILE_SIZE + // Example local time: 4092 2009-09-29T02:58:42 290586314 + // Example UTC time : 4092 2009-09-29T02:58:42Z 290586314 + unsigned int chanid; + char recstartts[21]; long long length; - char recordIDBuffer[20]; - sscanf(buffer.c_str(),"%4s %4s-%2s-%2sT%2s:%2s:%2s %lld", recordIDBuffer, recordIDBuffer + 4, recordIDBuffer + 8, recordIDBuffer + 10, recordIDBuffer + 12, recordIDBuffer + 14, recordIDBuffer + 16, &length); - CStdString recordID = recordIDBuffer; + if (g_bExtraDebug) + XBMC->Log(LOG_NOTICE,"%s: Event UPDATE_FILE_SIZE: %s", __FUNCTION__, buffer.c_str()); + if (sscanf(buffer.c_str(), "%u %20s %lld", &chanid, recstartts, &length) == 3) + { + // Make UID from recstartts + MythTimestamp ts = MythTimestamp(recstartts); + CStdString UID = MythProgramInfo::MakeUID(chanid, ts); + if (m_currentRecordID.compare(UID) == 0) { + if (g_bExtraDebug) + XBMC->Log(LOG_DEBUG,"%s: Event UPDATE_FILE_SIZE: UID=%s length=%lld", __FUNCTION__, UID.c_str(), length); + m_currentFile.UpdateLength(length); + } + } +} - if (m_currentRecordID.compare(recordID) == 0) { +void MythEventHandler::MythEventHandlerPrivate::HandleLiveTVWatch(const CStdString &buffer) +{ + CLockObject lock(m_lock); + if (!m_recorder.IsNull()) + { + if (g_bExtraDebug) + XBMC->Log(LOG_NOTICE,"%s: Event LIVETV_WATCH: recoder %s", __FUNCTION__, buffer.c_str()); + bool retval = m_recorder.LiveTVWatch(buffer); + if (g_bExtraDebug) + XBMC->Log(LOG_NOTICE, "%s: Event LIVETV_WATCH: %s", __FUNCTION__, (retval) ? "true " : "false"); + } +} + +void MythEventHandler::MythEventHandlerPrivate::HandleUpdateLiveTVChain(const CStdString &buffer) +{ + CLockObject lock(m_lock); + if (!m_recorder.IsNull()) + { if (g_bExtraDebug) - XBMC->Log(LOG_DEBUG,"EVENT: %s, --UPDATING CURRENT RECORDING LENGTH-- EVENT msg: %s %lld", __FUNCTION__, recordID.c_str(), length); - m_currentFile.UpdateLength(length); + XBMC->Log(LOG_NOTICE, "%s: Event LIVETV_CHAIN_UPDATE: %s", __FUNCTION__, buffer.c_str()); + bool retval = m_recorder.LiveTVChainUpdate(buffer); + if (g_bExtraDebug) + XBMC->Log(LOG_NOTICE, "%s: Event LIVETV_CHAIN_UPDATE: %s", __FUNCTION__, (retval ? "true" : "false")); + // On success then set recording event listener + if (retval) + { + int last = m_recorder.GetLiveTVChainLast(); + MythProgramInfo prog = m_recorder.GetLiveTVChainProgram(last); + if (m_currentRecordID.compare(prog.UID()) != 0) + { + this->SetRecordingEventListener(prog.UID(), m_recorder.GetLiveTVChainFile(last)); + if (g_bExtraDebug) + XBMC->Log(LOG_DEBUG,"%s: Event LIVETV_CHAIN_UPDATE: UID=%s Length=%llu", __FUNCTION__, m_currentRecordID.c_str(), m_currentFile.Length()); + } + } } } +void MythEventHandler::MythEventHandlerPrivate::HandleDoneRecording(const CStdString &buffer) +{ + CLockObject lock(m_lock); + if (!m_recorder.IsNull()) + { + if (g_bExtraDebug) + XBMC->Log(LOG_NOTICE, "%s: Event DONE_RECORDING: recorder %s", __FUNCTION__, buffer.c_str()); + bool retval = m_recorder.LiveTVDoneRecording(buffer); + if (g_bExtraDebug) + XBMC->Log(LOG_NOTICE, "%s: Event DONE_RECORDING: %s", __FUNCTION__, (retval) ? "true" : "false"); + if (retval) + { + // In critical case the chain could be updated here. + // So on success then set recording event listener. Cf CMYTH_EVENT_LIVETV_CHAIN_UPDATE + int last = m_recorder.GetLiveTVChainLast(); + MythProgramInfo prog = m_recorder.GetLiveTVChainProgram(last); + if (m_currentRecordID.compare(prog.UID()) != 0) + this->SetRecordingEventListener(prog.UID(), m_recorder.GetLiveTVChainFile(last)); + } + } +} + +void MythEventHandler::MythEventHandlerPrivate::SignalRecordingListEvent(bool newChangeEvent) +{ + if (!newChangeEvent || m_recordingChangePinCount < 0) + { + //Restore timeout + m_timeout.tv_sec = 0; + m_timeout.tv_usec = 100000; + //Need PVR update ? + if (m_recordingChangePinCount != 0) + { + XBMC->Log(LOG_DEBUG, "%s - Trigger PVR recording update: %d", __FUNCTION__, m_recordingChangePinCount); + m_observer->UpdateRecordings(); + m_recordingChangePinCount = 0; + } + } + else + { + // Accumulate recording change events before triggering observer + // First timeout is 0.5 sec and next 2 secs + if (m_recordingChangePinCount < 2) + { + m_timeout.tv_sec = 0; + m_timeout.tv_usec = 500000; + } + else + { + m_timeout.tv_sec = 2; + m_timeout.tv_usec = 0; + } + } +} + +void MythEventHandler::MythEventHandlerPrivate::HandleRecordingListChangeAdd(const CStdString& buffer) +{ + //Event data: "4121 2010-03-06T01:06:43[]:[]empty" + unsigned int chanid; + char recstartts[21]; + if (buffer.length() >= 24 && sscanf(buffer.c_str(), "%u %20s", &chanid, recstartts) == 2) + { + { + CLockObject lock(m_lock); + m_recordingChangeEventList.push_back(RecordingChangeEvent(CHANGE_ADD, chanid, recstartts)); + m_recordingChangePinCount++; + } + if (g_bExtraDebug) + XBMC->Log(LOG_DEBUG,"%s: Event RECORDING_LIST_CHANGE_ADD: CHANID=%u TS=%s", __FUNCTION__, chanid, recstartts); + } +} + +void MythEventHandler::MythEventHandlerPrivate::HandleRecordingListChangeUpdate(const CStdString& buffer, MythProgramInfo& programInfo) +{ + (void)buffer; + if (!programInfo.IsNull()) + { + { + CLockObject lock(m_lock); + m_recordingChangeEventList.push_back(RecordingChangeEvent(CHANGE_UPDATE, programInfo)); + m_recordingChangePinCount++; + } + if (g_bExtraDebug) + XBMC->Log(LOG_DEBUG,"%s: Event RECORDING_LIST_CHANGE_UPDATE: UID=%s", __FUNCTION__, programInfo.UID().c_str()); + } +} + +void MythEventHandler::MythEventHandlerPrivate::HandleRecordingListChangeDelete(const CStdString& buffer) +{ + //Event data: "4121 2010-03-06T01:06:43[]:[]empty" + unsigned int chanid; + char recstartts[21]; + if (buffer.length() >= 24 && sscanf(buffer.c_str(), "%u %20s", &chanid, recstartts) == 2) + { + { + CLockObject lock(m_lock); + m_recordingChangeEventList.push_back(RecordingChangeEvent(CHANGE_DELETE, chanid, recstartts)); + m_recordingChangePinCount++; + } + if (g_bExtraDebug) + XBMC->Log(LOG_DEBUG,"%s: Event RECORDING_LIST_CHANGE_DELETE: CHANID=%u TS=%s", __FUNCTION__, chanid, recstartts); + } +} + +void MythEventHandler::MythEventHandlerPrivate::HandleRecordingListChange() +{ + CLockObject lock(m_lock); + m_recordingChangeEventList.push_back(RecordingChangeEvent(CHANGE_ALL)); + m_recordingChangePinCount = -1; // Trigger observer anyway + if (g_bExtraDebug) + XBMC->Log(LOG_DEBUG,"%s: Event RECORDING_LIST_CHANGE", __FUNCTION__); +} + void MythEventHandler::MythEventHandlerPrivate::RetryConnect() { XBMC->QueueNotification(QUEUE_ERROR, XBMC->GetLocalizedString(30302)); // MythTV backend unavailable m_hang = true; while (!IsStopped()) { + // wake up the backend sending magic packet + if (m_sendWOL && !g_szMythHostEther.IsEmpty()) + XBMC->WakeOnLan(g_szMythHostEther); + usleep(999999); ref_release(*m_conn_t); *m_conn_t = NULL; @@ -469,7 +553,8 @@ XBMC->Log(LOG_NOTICE, "%s - Connected client to event socket", __FUNCTION__); XBMC->QueueNotification(QUEUE_INFO, XBMC->GetLocalizedString(30303)); // MythTV backend available m_hang = false; - RecordingListChange(); + m_sendWOL = false; + HandleRecordingListChange(); // Reload all recordings break; } } @@ -489,14 +574,6 @@ return retval == 1; } -void MythEventHandler::MythEventHandlerPrivate::RecordingListChange() -{ - Lock(); - m_recordingChangeEventList.push_back(RecordingChangeEvent(CHANGE_ALL)); - Unlock(); - PVR->TriggerRecordingUpdate(); -} - MythEventHandler::MythEventHandler(const CStdString &server, unsigned short port) : m_imp(new MythEventHandlerPrivate(server, port)) { @@ -508,14 +585,38 @@ m_imp->m_observer = observer; } +void MythEventHandler::Suspend() +{ + if (m_imp->IsRunning()) + { + m_imp->StopThread(); + // We must close the connection to be able to restart properly. + // On resume the thread will retry to connect by RetryConnect(). + // So all recordings will be reloaded after restoring the connection. + m_imp->m_hang = true; + ref_release(*(m_imp->m_conn_t)); + *(m_imp->m_conn_t) = NULL; + } +} + +void MythEventHandler::Resume(bool sendWOL) +{ + if (m_imp->IsStopped()) + { + m_imp->m_sendWOL = sendWOL; + m_imp->m_lock.Clear(); + m_imp->CreateThread(); + } +} + void MythEventHandler::PreventLiveChainUpdate() { - m_imp->Lock(); + m_imp->m_lock.Lock(); } void MythEventHandler::AllowLiveChainUpdate() { - m_imp->Unlock(); + m_imp->m_lock.Unlock(); } MythSignal MythEventHandler::GetSignal() @@ -525,24 +626,21 @@ void MythEventHandler::SetRecorder(const MythRecorder &recorder) { - m_imp->Lock(); + CLockObject lock(m_imp->m_lock); m_imp->m_recorder = recorder; - m_imp->Unlock(); } void MythEventHandler::EnablePlayback() { - m_imp->Lock(); + CLockObject lock(m_imp->m_lock); m_imp->m_playback = true; - m_imp->Unlock(); XBMC->Log(LOG_DEBUG, "%s", __FUNCTION__); } void MythEventHandler::DisablePlayback() { - m_imp->Lock(); + CLockObject lock(m_imp->m_lock); m_imp->m_playback = false; - m_imp->Unlock(); XBMC->Log(LOG_DEBUG, "%s", __FUNCTION__); } @@ -558,9 +656,8 @@ void MythEventHandler::SetRecordingListener(const CStdString &recordid, const MythFile &file) { - m_imp->Lock(); + CLockObject lock(m_imp->m_lock); m_imp->SetRecordingEventListener(recordid, file); - m_imp->Unlock(); } bool MythEventHandler::HasRecordingChangeEvent() const @@ -570,16 +667,14 @@ MythEventHandler::RecordingChangeEvent MythEventHandler::NextRecordingChangeEvent() { - m_imp->Lock(); + CLockObject lock(m_imp->m_lock); RecordingChangeEvent event = m_imp->m_recordingChangeEventList.front(); m_imp->m_recordingChangeEventList.pop_front(); - m_imp->Unlock(); return event; } void MythEventHandler::ClearRecordingChangeEvents() { - m_imp->Lock(); + CLockObject lock(m_imp->m_lock); m_imp->m_recordingChangeEventList.clear(); - m_imp->Unlock(); } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythEventHandler.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythEventHandler.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythEventHandler.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythEventHandler.h 2014-01-28 20:43:50.000000000 +0000 @@ -43,6 +43,8 @@ public: // Request to stop Live TV virtual void CloseLiveStream() = 0; + virtual void UpdateSchedules() = 0; + virtual void UpdateRecordings() = 0; }; class MythEventHandler @@ -51,6 +53,9 @@ MythEventHandler(const CStdString &server, unsigned short port); void RegisterObserver(MythEventObserver *observer); + void Suspend(); + void Resume(bool sendWOL = false); + void PreventLiveChainUpdate(); void AllowLiveChainUpdate(); @@ -79,7 +84,7 @@ : m_type(type) , m_channelID(chanid) { - m_recordingStartTimeSlot = MythTimestamp(recstartts, false); + m_recordingStartTimeSlot = MythTimestamp(recstartts); } RecordingChangeEvent(RecordingChangeType type, const MythProgramInfo &prog) diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythFile.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythFile.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythFile.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythFile.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -23,13 +23,11 @@ MythFile::MythFile() : m_file_t(new MythPointer()) - , m_conn(MythConnection()) { } -MythFile::MythFile(cmyth_file_t myth_file, MythConnection conn) +MythFile::MythFile(cmyth_file_t myth_file) : m_file_t(new MythPointer()) - , m_conn(conn) { *m_file_t = myth_file; } @@ -43,9 +41,8 @@ unsigned long long MythFile::Length() { - unsigned long long retval = 0; - retval = cmyth_file_length(*m_file_t); - return retval; + int64_t length = cmyth_file_length(*m_file_t); + return length > 0 ? length : 0; } void MythFile::UpdateLength(unsigned long long length) diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythFile.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythFile.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythFile.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythFile.h 2014-01-04 10:28:12.000000000 +0000 @@ -31,7 +31,7 @@ { public: MythFile(); - MythFile(cmyth_file_t myth_file, MythConnection conn); + MythFile(cmyth_file_t myth_file); bool IsNull() const; @@ -44,5 +44,4 @@ private: boost::shared_ptr > m_file_t; - MythConnection m_conn; }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythProgramInfo.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythProgramInfo.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythProgramInfo.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythProgramInfo.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -24,6 +24,7 @@ MythProgramInfo::MythProgramInfo() : m_proginfo_t() + , m_UID() , m_frameRate(-1) , m_coverart("") , m_fanart("") @@ -32,11 +33,33 @@ MythProgramInfo::MythProgramInfo(cmyth_proginfo_t cmyth_proginfo) : m_proginfo_t(new MythPointer()) + , m_UID() , m_frameRate(-1) , m_coverart("") , m_fanart("") { *m_proginfo_t = cmyth_proginfo; + // Make Unique Identifier + if (cmyth_proginfo) + { + MythTimestamp ts = MythTimestamp(cmyth_proginfo_rec_start(cmyth_proginfo)); + m_UID = MakeUID(ChannelID(), ts); + } +} + +CStdString MythProgramInfo::MakeUID(unsigned int chanid, MythTimestamp &ts) +{ + char buf[50] = ""; + CStdString timestr; + if (!ts.IsUTC()) + { + MythTimestamp utc = ts.ToUTC(); + timestr = utc.String(); + } + else + timestr = ts.String(); + sprintf(buf, "%u %s", chanid, timestr.c_str()); + return CStdString(buf); } bool MythProgramInfo::IsNull() const @@ -46,13 +69,21 @@ return *m_proginfo_t == NULL; } -CStdString MythProgramInfo::UID() +bool MythProgramInfo::operator ==(MythProgramInfo &other) { - // Creates unique IDs from ChannelID, StartTime and RecordID like "100_2011-12-10T12:00:00_247" - char buf[50] = ""; - MythTimestamp time(RecordingStartTime()); - sprintf(buf, "%u_%s_%u", ChannelID(), time.String().c_str(), RecordID()); - return CStdString(buf); + if (!this->IsNull() && !other.IsNull() && this->UID() == other.UID()) + return true; + return false; +} + +bool MythProgramInfo::operator !=(MythProgramInfo &other) +{ + return !(*this == other); +} + +CStdString MythProgramInfo::UID() const +{ + return m_UID; } CStdString MythProgramInfo::ProgramID() @@ -145,12 +176,12 @@ bool MythProgramInfo::IsVisible() { - // Filter out recording of special storage groups (like LiveTV or Deleted) - + // Filter out recording of special storage group Deleted + // Filter out recording with duration less than 5 seconds // When deleting a recording, it might not be deleted immediately but marked as 'pending delete'. // Depending on the protocol version the recording is moved to the group Deleted or // the 'delete pending' flag is set - if (RecordingGroup() == "LiveTV" || RecordingGroup() == "Deleted" || IsDeletePending()) + if (Duration() < 5 || RecordingGroup() == "Deleted" || IsDeletePending()) { return false; } @@ -158,6 +189,11 @@ return true; } +bool MythProgramInfo::IsLiveTV() +{ + return (RecordingGroup() == "LiveTV"); +} + unsigned int MythProgramInfo::ChannelID() { return cmyth_proginfo_chan_id(*m_proginfo_t); @@ -208,6 +244,14 @@ return cmyth_proginfo_priority(*m_proginfo_t); // Might want to use recpriority2 instead } +CStdString MythProgramInfo::StorageGroup() +{ + char* storageGroup = cmyth_proginfo_storagegroup(*m_proginfo_t); + CStdString retval(storageGroup); + ref_release(storageGroup); + return retval; +} + void MythProgramInfo::SetFrameRate(const long long frameRate) { m_frameRate = frameRate; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythProgramInfo.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythProgramInfo.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythProgramInfo.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythProgramInfo.h 2014-01-04 10:28:12.000000000 +0000 @@ -41,9 +41,22 @@ MythProgramInfo(); MythProgramInfo(cmyth_proginfo_t cmyth_proginfo); + /** + * \brief Returns internal Unique Identifier for recording + * + * Make recording UID like "1001 2011-12-10T12:00:00Z" based on 'channelid' + * and 'recstartts'. + * 'channelid' is the myth channel identifier of the RECORDED PROGRAM. + * 'recstartts' is the start time of the RECORDED PROGRAM. Do not confuse with + * start time of PROGRAM which is time of EPG program. + */ + static CStdString MakeUID(unsigned int chanid, MythTimestamp &ts); + bool IsNull() const; + bool operator ==(MythProgramInfo &other); + bool operator !=(MythProgramInfo &other); - CStdString UID(); + CStdString UID() const; CStdString ProgramID(); CStdString Title(); CStdString Subtitle(); @@ -57,6 +70,7 @@ bool IsDeletePending(); bool HasBookmark(); bool IsVisible(); + bool IsLiveTV(); unsigned int ChannelID(); CStdString ChannelName(); @@ -67,6 +81,7 @@ time_t RecordingStartTime(); time_t RecordingEndTime(); int Priority(); + CStdString StorageGroup(); void SetFrameRate(const long long frameRate); long long FrameRate() const; @@ -77,11 +92,10 @@ private: boost::shared_ptr > m_proginfo_t; + CStdString m_UID; // Cached PVR attributes long long m_frameRate; - - // Artworks CStdString m_coverart; CStdString m_fanart; }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythRecorder.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythRecorder.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythRecorder.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythRecorder.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -22,6 +22,7 @@ #include "MythProgramInfo.h" #include "MythChannel.h" #include "MythPointer.h" +#include "MythFile.h" #include "../client.h" using namespace ADDON; @@ -30,6 +31,7 @@ : m_recorder_t(new MythPointerThreadSafe()) , m_liveChainUpdated(new int(0)) , m_conn() + , m_liveRecording(false) { } @@ -37,6 +39,7 @@ : m_recorder_t(new MythPointerThreadSafe()) , m_liveChainUpdated(new int(0)) , m_conn(conn) + , m_liveRecording(false) { *m_recorder_t = cmyth_recorder; } @@ -202,67 +205,44 @@ { Lock(); - if (!IsRecording()) - { - XBMC->Log(LOG_ERROR, "%s: Recorder %u is not recording", __FUNCTION__, ID(), const_cast(channel.Name().c_str())); - // m_recorder_t->Unlock(); - Unlock(); - return false; - } - CStdString channelNum = channel.Number(); if (cmyth_recorder_pause(*m_recorder_t) != 0) { XBMC->Log(LOG_ERROR, "%s: Failed to pause recorder %u", __FUNCTION__, ID()); - // m_recorder_t->Unlock(); Unlock(); return false; } - if (!CheckChannel(channel)) - { - XBMC->Log(LOG_ERROR, "%s: Recorder %u doesn't provide channel %s", __FUNCTION__, ID(), channel.Name().c_str()); - // m_recorder_t->Unlock(); - Unlock(); - return false; - } + *m_liveChainUpdated = 0; - if (cmyth_recorder_set_channel(*m_recorder_t,channelNum.GetBuffer())!=0) + if (cmyth_recorder_set_channel(*m_recorder_t,channelNum.GetBuffer()) != 0) { XBMC->Log(LOG_ERROR, "%s: Failed to change recorder %u to channel %s", __FUNCTION__, ID(), channel.Name().c_str()); - // m_recorder_t->Unlock(); Unlock(); return false; } - if (cmyth_livetv_chain_switch_last(*m_recorder_t) != 1) - { - XBMC->Log(LOG_ERROR,"%s: Failed to switch chain for recorder %u", __FUNCTION__, ID(), channel.Name().c_str()); - // m_recorder_t->Unlock(); + // Wait for chain update for 30s before break + int i = 0; + while (*m_liveChainUpdated == 0 && i < 30000) { + // Release the latch to allow chain update Unlock(); - return false; + usleep(100000); + // Get the latch before reading chain status + Lock(); + i += 100; + XBMC->Log(LOG_DEBUG, "%s: Delay channel switch: %d", __FUNCTION__, i); } - - *m_liveChainUpdated = 0; - int i = 20; - while (*m_liveChainUpdated == 0 && i-- != 0) + if (*m_liveChainUpdated == 0) { + XBMC->Log(LOG_ERROR,"%s - Chain update failed", __FUNCTION__); Unlock(); - usleep(100000); - Lock(); + return false; } Unlock(); - for (int i = 0; i < 20; i++) - { - if (!IsRecording()) - usleep(1000); - else - break; - } - return true; } @@ -289,6 +269,9 @@ { int retval = 0; Lock(); + // Recording is now completed and recorder doesn't keep anymore. Track it. + m_liveRecording = false; + // Return feedback to check the chain retval = cmyth_livetv_done_recording(*m_recorder_t, const_cast(msg.c_str())); Unlock(); if (retval != 0) @@ -330,12 +313,25 @@ long long MythRecorder::LiveTVDuration() { long long retval = 0; - Lock(); retval = cmyth_livetv_chain_duration(*m_recorder_t); - Unlock(); return retval; } +int MythRecorder::GetLiveTVChainLast() +{ + return cmyth_livetv_chain_last(*m_recorder_t); +} + +MythProgramInfo MythRecorder::GetLiveTVChainProgram(int index) +{ + return MythProgramInfo(cmyth_livetv_chain_prog(*m_recorder_t, index)); +} + +MythFile MythRecorder::GetLiveTVChainFile(int index) +{ + return MythFile(cmyth_livetv_chain_file(*m_recorder_t, index)); +} + bool MythRecorder::Stop() { int retval = 0; @@ -344,6 +340,29 @@ Unlock(); return retval >= 0; } + +bool MythRecorder::IsLiveRecording() +{ + bool retval; + Lock(); + retval = m_liveRecording; + Unlock(); + return retval; +} + +bool MythRecorder::SetLiveRecording(bool recording) +{ + int retval = 0; + Lock(); + retval = cmyth_recorder_set_live_recording(*m_recorder_t, (recording ? 1 : 0)); + // Check feedback (Response == Request ?) then track it + if (recording && retval == 1) + m_liveRecording = true; + else if (!recording && retval == 0) + m_liveRecording = false; + Unlock(); + return retval >= 0; +} void MythRecorder::prog_update_callback(cmyth_proginfo_t prog) { diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythRecorder.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythRecorder.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythRecorder.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythRecorder.h 2014-01-04 10:28:12.000000000 +0000 @@ -31,6 +31,7 @@ class MythProgramInfo; class MythChannel; +class MythFile; template class MythPointer; @@ -60,13 +61,20 @@ int ReadLiveTV(void *buffer, unsigned int length); long long LiveTVSeek(long long offset, int whence); long long LiveTVDuration(); + int GetLiveTVChainLast(); + MythProgramInfo GetLiveTVChainProgram(int index); + MythFile GetLiveTVChainFile(int index); bool Stop(); + bool IsLiveRecording(); + bool SetLiveRecording(bool recording); + private: boost::shared_ptr > m_recorder_t; boost::shared_ptr m_liveChainUpdated; MythConnection m_conn; + bool m_liveRecording; static void prog_update_callback(cmyth_proginfo_t prog); }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythRecordingRule.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythRecordingRule.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythRecordingRule.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythRecordingRule.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -40,6 +40,11 @@ return *m_recordingrule_t == NULL; } +MythRecordingRule MythRecordingRule::DuplicateRecordingRule() const +{ + return MythRecordingRule(cmyth_recordingrule_dup(*m_recordingrule_t)); +} + unsigned int MythRecordingRule::RecordID() const { return cmyth_recordingrule_recordid(*m_recordingrule_t); @@ -362,3 +367,49 @@ { cmyth_recordingrule_set_transcoder(*m_recordingrule_t, transcoder); } + +unsigned int MythRecordingRule::ParentID() const +{ + return cmyth_recordingrule_parentid(*m_recordingrule_t); +} + +void MythRecordingRule::SetParentID(unsigned int parentid) +{ + cmyth_recordingrule_set_parentid(*m_recordingrule_t, parentid); +} + +unsigned int MythRecordingRule::Filter() const +{ + return cmyth_recordingrule_filter(*m_recordingrule_t); +} + +void MythRecordingRule::SetFilter(unsigned int filter) +{ + cmyth_recordingrule_set_filter(*m_recordingrule_t, filter); +} + +CStdString MythRecordingRule::ProgramID() const +{ + char *buf = cmyth_recordingrule_programid(*m_recordingrule_t); + CStdString retval(buf); + ref_release(buf); + return retval; +} + +void MythRecordingRule::SetProgramID(const CStdString &programid) +{ + cmyth_recordingrule_set_programid(*m_recordingrule_t, const_cast(programid.c_str())); +} + +CStdString MythRecordingRule::SeriesID() const +{ + char *buf = cmyth_recordingrule_seriesid(*m_recordingrule_t); + CStdString retval(buf); + ref_release(buf); + return retval; +} + +void MythRecordingRule::SetSeriesID(const CStdString &seriesid) +{ + cmyth_recordingrule_set_seriesid(*m_recordingrule_t, const_cast(seriesid.c_str())); +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythRecordingRule.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythRecordingRule.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythRecordingRule.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythRecordingRule.h 2014-01-28 20:43:50.000000000 +0000 @@ -36,45 +36,60 @@ public: enum RuleType { - NotRecording = 0, - SingleRecord = 1, - TimeslotRecord, - ChannelRecord, - AllRecord, - WeekslotRecord, - FindOneRecord, - OverrideRecord, - DontRecord, - FindDailyRecord, - FindWeeklyRecord, - TemplateRecord + RT_NotRecording = 0, + RT_SingleRecord = 1, + RT_DailyRecord = 2, + RT_ChannelRecord = 3, + RT_AllRecord = 4, + RT_WeeklyRecord = 5, + RT_OneRecord = 6, + RT_OverrideRecord = 7, + RT_DontRecord = 8, + RT_FindDailyRecord = 9, // Obsolete (0.27). cf DailyRecord + RT_FindWeeklyRecord = 10, // Obsolete (0.27). cf WeeklyRecord + RT_TemplateRecord = 11 }; enum RuleSearchType { - NoSearch = 0, - PowerSearch, - TitleSearch, - KeywordSearch, - PeopleSearch, - ManualSearch + ST_NoSearch = 0, + ST_PowerSearch, + ST_TitleSearch, + ST_KeywordSearch, + ST_PeopleSearch, + ST_ManualSearch }; enum RuleDuplicateControlMethod { - CheckNone = 0x01, - CheckSubtitle = 0x02, - CheckDescription = 0x04, - CheckSubtitleAndDescription = 0x06, - CheckSubtitleThenDescription = 0x08 + DM_CheckNone = 0x01, + DM_CheckSubtitle = 0x02, + DM_CheckDescription = 0x04, + DM_CheckSubtitleAndDescription = 0x06, + DM_CheckSubtitleThenDescription = 0x08 }; enum RuleCheckDuplicatesInType { - InRecorded = 0x01, - InOldRecorded = 0x02, - InAll = 0x0F, - NewEpi = 0x10 + DI_InRecorded = 0x01, + DI_InOldRecorded = 0x02, + DI_InAll = 0x0F, + DI_NewEpi = 0x10 + }; + + enum RuleFilterMask + { + FM_NewEpisode = 0x001, + FM_IdentifiableEpisode = 0x002, + FM_FirstShowing = 0x004, + FM_PrimeTime = 0x008, + FM_CommercialFree = 0x010, + FM_HighDefinition = 0x020, + FM_ThisEpisode = 0x040, + FM_ThisSeries = 0x080, + FM_ThisTime = 0x100, + FM_ThisDayAndTime = 0x200, + FM_ThisChannel = 0x400 }; MythRecordingRule(); @@ -82,6 +97,8 @@ bool IsNull() const; + MythRecordingRule DuplicateRecordingRule() const; + unsigned int RecordID() const; void SetRecordID(unsigned int recordid); @@ -169,6 +186,18 @@ unsigned int Transcoder() const; void SetTranscoder(unsigned int transcoder); + unsigned int ParentID() const; + void SetParentID(unsigned int parentid); + + unsigned int Filter() const; + void SetFilter(unsigned int filter); + + CStdString ProgramID() const; + void SetProgramID(const CStdString &programid); + + CStdString SeriesID() const; + void SetSeriesID(const CStdString &seriesid); + private: boost::shared_ptr > m_recordingrule_t; }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythScheduleManager.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythScheduleManager.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythScheduleManager.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythScheduleManager.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,1458 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "MythScheduleManager.h" +#include "../client.h" +#include "../tools.h" + +using namespace ADDON; +using namespace PLATFORM; + +enum +{ + METHOD_UNKNOWN = 0, + METHOD_UPDATE_INACTIVE = 1, + METHOD_CREATE_OVERRIDE = 2, + METHOD_DELETE = 3, + METHOD_DISCREET_UPDATE = 4, + METHOD_FULL_UPDATE = 5 +}; + +static uint_fast32_t hashvalue(uint_fast32_t maxsize, const char *value) +{ + uint_fast32_t h = 0, g; + + while (*value) + { + h = (h << 4) + *value++; + if ((g = h & 0xF0000000L)) + { + h ^= g >> 24; + } + h &= ~g; + } + + return h % maxsize; +} + + +/////////////////////////////////////////////////////////////////////////////// +//// +//// MythRecordingRuleNode +//// + +MythRecordingRuleNode::MythRecordingRuleNode(const MythRecordingRule &rule) + : m_rule(rule) + , m_mainRule() + , m_overrideRules() +{ +} + +bool MythRecordingRuleNode::IsOverrideRule() const +{ + return (m_rule.Type() == MythRecordingRule::RT_DontRecord || m_rule.Type() == MythRecordingRule::RT_OverrideRecord); +} + +MythRecordingRule MythRecordingRuleNode::GetRule() const +{ + return m_rule; +} + +MythRecordingRule MythRecordingRuleNode::GetMainRule() const +{ + if (this->IsOverrideRule()) + return m_mainRule; + return m_rule; +} + +bool MythRecordingRuleNode::HasOverrideRules() const +{ + return (!m_overrideRules.empty()); +} + +OverrideRuleList MythRecordingRuleNode::GetOverrideRules() const +{ + return m_overrideRules; +} + +bool MythRecordingRuleNode::IsInactiveRule() const +{ + return m_rule.Inactive(); +} + + +/////////////////////////////////////////////////////////////////////////////// +//// +//// MythScheduleManager +//// + +MythScheduleManager::MythScheduleManager() + : m_con() + , m_db() + , m_dbSchemaVersion(0) + , m_versionHelper(new MythScheduleHelperNoHelper()) + , m_showNotRecording(false) +{ +} + +MythScheduleManager::MythScheduleManager(MythConnection &con, MythDatabase &db) + : m_con(con) + , m_db(db) + , m_dbSchemaVersion(0) + , m_showNotRecording(false) +{ + this->Update(); +} + +void MythScheduleManager::Setup() +{ + int old = m_dbSchemaVersion; + m_dbSchemaVersion = m_db.GetSchemaVersion(); + + // On new DB connection the schema version could change + if (m_dbSchemaVersion != old) + { + if (m_dbSchemaVersion >= 1309) + m_versionHelper = boost::shared_ptr(new MythScheduleHelper1309(m_db)); + else if (m_dbSchemaVersion >= 1302) + m_versionHelper = boost::shared_ptr(new MythScheduleHelper1302(m_db)); + else if (m_dbSchemaVersion >= 1276) + m_versionHelper = boost::shared_ptr(new MythScheduleHelper1278(m_db)); + else if (m_dbSchemaVersion > 0) + m_versionHelper = boost::shared_ptr(new MythScheduleHelper1226(m_db)); + else + m_versionHelper = boost::shared_ptr(new MythScheduleHelperNoHelper()); + } +} + +unsigned int MythScheduleManager::MakeIndex(MythProgramInfo& recording) const +{ + // Recordings must keep same identifier even after refreshing cache (cf Update). + // Numeric hash of UID is used to make the constant numeric identifier. + return (recording.RecordID() << 16) + hashvalue(0xFFFF, recording.UID().c_str()); +} + +ScheduleList MythScheduleManager::GetUpcomingRecordings() +{ + ScheduleList recordings; + CLockObject lock(m_lock); + for (RecordingList::iterator it = m_recordings.begin(); it != m_recordings.end(); ++it) + { + recordings.push_back(std::make_pair(it->first, it->second)); + } + return recordings; +} + +MythScheduleManager::MSM_ERROR MythScheduleManager::ScheduleRecording(const MythRecordingRule &rule) +{ + // Don't schedule nil + if (rule.Type() == MythRecordingRule::RT_NotRecording) + return MSM_ERROR_FAILED; + + if (!m_db.AddRecordingRule(rule)) + return MSM_ERROR_FAILED; + + if (!m_con.UpdateSchedules(rule.RecordID())) + return MSM_ERROR_FAILED; + + return MSM_ERROR_SUCCESS; +} + +MythScheduleManager::MSM_ERROR MythScheduleManager::DeleteRecording(unsigned int index) +{ + CLockObject lock(m_lock); + + boost::shared_ptr recording = this->FindUpComingByIndex(index); + if (!recording) + return MSM_ERROR_FAILED; + + boost::shared_ptr node = this->FindRuleById(recording->RecordID()); + if (node) + { + XBMC->Log(LOG_DEBUG, "%s - %u : Found rule %u type %d", __FUNCTION__, index, node->m_rule.RecordID(), node->m_rule.Type()); + + // Delete override rules + if (node->HasOverrideRules()) + { + for (OverrideRuleList::iterator ito = node->m_overrideRules.begin(); ito != node->m_overrideRules.end(); ++ito) + { + XBMC->Log(LOG_DEBUG, "%s - %u : Found override rule %u type %d", __FUNCTION__, index, ito->RecordID(), ito->Type()); + ScheduleList rec = this->FindUpComingByRuleId(ito->RecordID()); + for (ScheduleList::iterator itr = rec.begin(); itr != rec.end(); ++itr) + { + XBMC->Log(LOG_DEBUG, "%s - %u : Found override recording %s status %d", __FUNCTION__, index, itr->second->UID().c_str(), itr->second->Status()); + if (itr->second->Status() == RS_RECORDING || itr->second->Status() == RS_TUNING) + { + XBMC->Log(LOG_DEBUG, "%s - Stop recording %s", __FUNCTION__, itr->second->UID().c_str()); + m_con.StopRecording(*(itr->second)); + } + } + XBMC->Log(LOG_DEBUG, "%s - Delete recording rule %u (modifier of rule %u)", __FUNCTION__, ito->RecordID(), node->m_rule.RecordID()); + if (!m_db.DeleteRecordingRule(*ito)) + XBMC->Log(LOG_ERROR, "%s - Delete recording rule failed", __FUNCTION__); + } + } + + // Delete main rule + ScheduleList rec = this->FindUpComingByRuleId(node->m_rule.RecordID()); + for (ScheduleList::iterator itr = rec.begin(); itr != rec.end(); ++itr) + { + XBMC->Log(LOG_DEBUG, "%s - %u : Found recording %s status %d", __FUNCTION__, index, itr->second->UID().c_str(), itr->second->Status()); + if (itr->second->Status() == RS_RECORDING || itr->second->Status() == RS_TUNING) + { + XBMC->Log(LOG_DEBUG, "%s - Stop recording %s", __FUNCTION__, itr->second->UID().c_str()); + m_con.StopRecording(*(itr->second)); + } + } + XBMC->Log(LOG_DEBUG, "%s - Delete recording rule %u", __FUNCTION__, node->m_rule.RecordID()); + if (!m_db.DeleteRecordingRule(node->m_rule)) + XBMC->Log(LOG_ERROR, "%s - Delete recording rule failed", __FUNCTION__); + + if (!m_con.UpdateSchedules(-1)) + return MSM_ERROR_FAILED; + + // Another client could delete the rule at the same time. Therefore always SUCCESS even if database delete fails. + return MSM_ERROR_SUCCESS; + } + else + { + XBMC->Log(LOG_DEBUG, "%s - %u : No rule for recording %s status %d", __FUNCTION__, index, recording->UID().c_str(), recording->Status()); + if (recording->Status() == RS_RECORDING || recording->Status() == RS_TUNING) + { + XBMC->Log(LOG_DEBUG, "%s - Stop recording %s", __FUNCTION__, recording->UID().c_str()); + m_con.StopRecording(*recording); + return MSM_ERROR_SUCCESS; + } + } + + return MSM_ERROR_NOT_IMPLEMENTED; +} + +MythScheduleManager::MSM_ERROR MythScheduleManager::DisableRecording(unsigned int index) +{ + CLockObject lock(m_lock); + + boost::shared_ptr recording = this->FindUpComingByIndex(index); + if (!recording) + return MSM_ERROR_FAILED; + + if (recording->Status() == RS_INACTIVE || recording->Status() == RS_DONT_RECORD) + return MSM_ERROR_SUCCESS; + + boost::shared_ptr node = this->FindRuleById(recording->RecordID()); + if (node) + { + XBMC->Log(LOG_DEBUG, "%s - %u : Found rule %u type %d", __FUNCTION__, index, node->m_rule.RecordID(), node->m_rule.Type()); + int method = METHOD_UNKNOWN; + MythRecordingRule handle = node->m_rule.DuplicateRecordingRule(); + + // Not recording. Simply inactivate the rule + if (recording->Status() == RS_UNKNOWN) + { + method = METHOD_UPDATE_INACTIVE; + } + else + { + // Method depends of its rule type + switch (node->m_rule.Type()) + { + case MythRecordingRule::RT_SingleRecord: + if (recording->Status() == RS_RECORDING || recording->Status() == RS_TUNING) + method = METHOD_DELETE; + else + method = METHOD_UPDATE_INACTIVE; + break; + case MythRecordingRule::RT_NotRecording: + method = METHOD_UPDATE_INACTIVE; + break; + case MythRecordingRule::RT_OneRecord: + case MythRecordingRule::RT_ChannelRecord: + case MythRecordingRule::RT_AllRecord: + case MythRecordingRule::RT_DailyRecord: + case MythRecordingRule::RT_WeeklyRecord: + case MythRecordingRule::RT_FindDailyRecord: + case MythRecordingRule::RT_FindWeeklyRecord: + method = METHOD_CREATE_OVERRIDE; + break; + case MythRecordingRule::RT_OverrideRecord: + method = METHOD_DELETE; + break; + default: + break; + } + } + + if (method == METHOD_UNKNOWN) + { + return MSM_ERROR_NOT_IMPLEMENTED; + } + if (method == METHOD_UPDATE_INACTIVE) + { + handle.SetInactive(true); + if (!m_db.UpdateRecordingRule(handle)) + return MSM_ERROR_FAILED; + node->m_rule = handle; // sync node + if (!m_con.UpdateSchedules(handle.RecordID())) + return MSM_ERROR_FAILED; + return MSM_ERROR_SUCCESS; + } + if (method == METHOD_CREATE_OVERRIDE) + { + handle.SetRecordID(0); + handle.SetInactive(false); + handle.SetType(MythRecordingRule::RT_DontRecord); + handle.SetStartTime(recording->StartTime()); + handle.SetEndTime(recording->EndTime()); + handle.SetParentID(node->m_rule.RecordID()); + if (!m_db.AddRecordingRule(handle)) + return MSM_ERROR_FAILED; + node->m_overrideRules.push_back(handle); // sync node + if (!m_con.UpdateSchedules(handle.RecordID())) + return MSM_ERROR_FAILED; + return MSM_ERROR_SUCCESS; + } + if (method == METHOD_DELETE) + { + return this->DeleteRecording(index); + } + } + + return MSM_ERROR_NOT_IMPLEMENTED; +} + +MythScheduleManager::MSM_ERROR MythScheduleManager::EnableRecording(unsigned int index) +{ + CLockObject lock(m_lock); + + boost::shared_ptr recording = this->FindUpComingByIndex(index); + if (!recording) + return MSM_ERROR_FAILED; + + boost::shared_ptr node = this->FindRuleById(recording->RecordID()); + if (node) + { + XBMC->Log(LOG_DEBUG, "%s - %u : Found rule %u type %d", __FUNCTION__, index, node->m_rule.RecordID(), node->m_rule.Type()); + int method = METHOD_UNKNOWN; + MythRecordingRule handle = node->m_rule.DuplicateRecordingRule(); + + if (recording->Status() == RS_UNKNOWN) + { + // Not recording. Simply activate the rule + method = METHOD_UPDATE_INACTIVE; + } + else if (recording->Status() == RS_NEVER_RECORD) + { + // Add override to record anyway + method = METHOD_CREATE_OVERRIDE; + } + else + { + // Method depends of its rule type + switch (node->m_rule.Type()) + { + case MythRecordingRule::RT_DontRecord: + case MythRecordingRule::RT_OverrideRecord: + method = METHOD_DELETE; + break; + case MythRecordingRule::RT_SingleRecord: + case MythRecordingRule::RT_NotRecording: + case MythRecordingRule::RT_OneRecord: + case MythRecordingRule::RT_ChannelRecord: + case MythRecordingRule::RT_AllRecord: + case MythRecordingRule::RT_DailyRecord: + case MythRecordingRule::RT_WeeklyRecord: + case MythRecordingRule::RT_FindDailyRecord: + case MythRecordingRule::RT_FindWeeklyRecord: + // Is it inactive ? Try to enable rule + method = METHOD_UPDATE_INACTIVE; + break; + default: + break; + } + } + + if (method == METHOD_UNKNOWN) + { + return MSM_ERROR_NOT_IMPLEMENTED; + } + if (method == METHOD_UPDATE_INACTIVE) + { + handle.SetInactive(false); + if (!m_db.UpdateRecordingRule(handle)) + return MSM_ERROR_FAILED; + node->m_rule = handle; // sync node + if (!m_con.UpdateSchedules(handle.RecordID())) + return MSM_ERROR_FAILED; + return MSM_ERROR_SUCCESS; + } + if (method == METHOD_CREATE_OVERRIDE) + { + handle.SetRecordID(0); + handle.SetInactive(false); + handle.SetType(MythRecordingRule::RT_OverrideRecord); + handle.SetStartTime(recording->StartTime()); + handle.SetEndTime(recording->EndTime()); + handle.SetParentID(node->m_rule.RecordID()); + if (!m_db.AddRecordingRule(handle)) + return MSM_ERROR_FAILED; + node->m_overrideRules.push_back(handle); // sync node + if (!m_con.UpdateSchedules(handle.RecordID())) + return MSM_ERROR_FAILED; + return MSM_ERROR_SUCCESS; + } + if (method == METHOD_DELETE) + { + return this->DeleteRecording(index); + } + } + + return MSM_ERROR_NOT_IMPLEMENTED; +} + +MythScheduleManager::MSM_ERROR MythScheduleManager::UpdateRecording(unsigned int index, MythRecordingRule &newrule) +{ + CLockObject lock(m_lock); + + boost::shared_ptr recording = this->FindUpComingByIndex(index); + if (!recording) + return MSM_ERROR_FAILED; + + boost::shared_ptr node = this->FindRuleById(recording->RecordID()); + if (node) + { + XBMC->Log(LOG_DEBUG, "%s - %u : Found rule %u type %d", __FUNCTION__, index, node->m_rule.RecordID(), node->m_rule.Type()); + int method = METHOD_UNKNOWN; + MythRecordingRule handle = node->m_rule.DuplicateRecordingRule(); + + // Rule update method depends of current rule type: + // - Updating override rule is limited. + // - Enabled repeating rule must to be overriden. + // - All others could be fully updated until it is recording. + switch (node->m_rule.Type()) + { + case MythRecordingRule::RT_DontRecord: + case MythRecordingRule::RT_NotRecording: + case MythRecordingRule::RT_TemplateRecord: + // Deny update + method = METHOD_UNKNOWN; + break; + case MythRecordingRule::RT_AllRecord: + case MythRecordingRule::RT_ChannelRecord: + case MythRecordingRule::RT_OneRecord: + case MythRecordingRule::RT_FindDailyRecord: + case MythRecordingRule::RT_FindWeeklyRecord: + case MythRecordingRule::RT_DailyRecord: + case MythRecordingRule::RT_WeeklyRecord: + // When inactive we can replace with the new rule + if (handle.Inactive()) + { + method = METHOD_FULL_UPDATE; + } + // When active we create override rule + else + { + // Only priority can be overriden + if (newrule.Priority() != handle.Priority()) + { + handle.SetPriority(newrule.Priority()); + method = METHOD_CREATE_OVERRIDE; + } + else + method = METHOD_UNKNOWN; + } + break; + case MythRecordingRule::RT_OverrideRecord: + // Only priority can be overriden + handle.SetPriority(newrule.Priority()); + method = METHOD_DISCREET_UPDATE; + break; + case MythRecordingRule::RT_SingleRecord: + if (recording->Status() == RS_RECORDING || recording->Status() == RS_TUNING) + { + // Discreet update + handle.SetEndTime(newrule.EndTime()); + handle.SetEndOffset(newrule.EndOffset()); + method = METHOD_DISCREET_UPDATE; + } + else + { + method = METHOD_FULL_UPDATE; + } + break; + default: + break; + } + + if (method == METHOD_UNKNOWN) + { + return MSM_ERROR_NOT_IMPLEMENTED; + } + if (method == METHOD_DISCREET_UPDATE) + { + if (!m_db.UpdateRecordingRule(handle)) + return MSM_ERROR_FAILED; + node->m_rule = handle; // sync node + if (!m_con.UpdateSchedules(handle.RecordID())) + return MSM_ERROR_FAILED; + return MSM_ERROR_SUCCESS; + } + if (method == METHOD_CREATE_OVERRIDE) + { + handle.SetRecordID(0); + handle.SetInactive(false); + handle.SetType(MythRecordingRule::RT_OverrideRecord); + handle.SetStartTime(recording->StartTime()); + handle.SetEndTime(recording->EndTime()); + handle.SetParentID(node->m_rule.RecordID()); + if (!m_db.AddRecordingRule(handle)) + return MSM_ERROR_FAILED; + node->m_overrideRules.push_back(handle); // sync node + if (!m_con.UpdateSchedules(handle.RecordID())) + return MSM_ERROR_FAILED; + return MSM_ERROR_SUCCESS; + } + if (method == METHOD_FULL_UPDATE) + { + handle = newrule; + handle.SetRecordID(node->m_rule.RecordID()); + if (!m_db.UpdateRecordingRule(handle)) + return MSM_ERROR_FAILED; + node->m_rule = handle; // sync node + if (!m_con.UpdateSchedules(handle.RecordID())) + return MSM_ERROR_FAILED; + return MSM_ERROR_SUCCESS; + } + } + + return MSM_ERROR_NOT_IMPLEMENTED; +} + +boost::shared_ptr MythScheduleManager::FindRuleById(unsigned int recordID) const +{ + CLockObject lock(m_lock); + + NodeById::const_iterator it = m_rulesById.find(recordID); + if (it != m_rulesById.end()) + return it->second; + return boost::shared_ptr(); +} + +ScheduleList MythScheduleManager::FindUpComingByRuleId(unsigned int recordID) const +{ + CLockObject lock(m_lock); + + ScheduleList found; + std::pair range = m_recordingIndexByRuleId.equal_range(recordID); + if (range.first != m_recordingIndexByRuleId.end()) + { + for (RecordingIndexByRuleId::const_iterator it = range.first; it != range.second; ++it) + { + RecordingList::const_iterator recordingIt = m_recordings.find(it->second); + if (recordingIt != m_recordings.end()) + found.push_back(std::make_pair(it->second, recordingIt->second)); + } + } + return found; +} + +boost::shared_ptr MythScheduleManager::FindUpComingByIndex(unsigned int index) const +{ + CLockObject lock(m_lock); + + RecordingList::const_iterator it = m_recordings.find(index); + if (it != m_recordings.end()) + return it->second; + else + return boost::shared_ptr(); +} + +void MythScheduleManager::Update() +{ + CLockObject lock(m_lock); + + // Setup VersionHelper for the new set + this->Setup(); + RecordingRuleMap rules = m_db.GetRecordingRules(); + m_rules.clear(); + m_rulesById.clear(); + for (RecordingRuleMap::iterator it = rules.begin(); it != rules.end(); ++it) + { + boost::shared_ptr node = boost::shared_ptr(new MythRecordingRuleNode(it->second)); + m_rules.push_back(node); + m_rulesById.insert(NodeById::value_type(it->second.RecordID(), node)); + } + + for (NodeList::iterator it = m_rules.begin(); it != m_rules.end(); ++it) + // Is override rule ? Then find main rule and link to it + if ((*it)->IsOverrideRule()) + { + // First check parentid. Then fallback searching the same timeslot + NodeById::iterator itp = m_rulesById.find((*it)->m_rule.ParentID()); + if (itp != m_rulesById.end()) + { + itp->second->m_overrideRules.push_back((*it)->m_rule); + (*it)->m_mainRule = itp->second->m_rule; + } + else + { + for (NodeList::iterator itm = m_rules.begin(); itm != m_rules.end(); ++itm) + if (!(*itm)->IsOverrideRule() && m_versionHelper->SameTimeslot((*it)->m_rule, (*itm)->m_rule)) + { + (*itm)->m_overrideRules.push_back((*it)->m_rule); + (*it)->m_mainRule = (*itm)->m_rule; + } + + } + } + + // Add pending programs to upcoming recordings + ProgramInfoMap pending = m_con.GetPendingPrograms(); + m_recordings.clear(); + m_recordingIndexByRuleId.clear(); + for (ProgramInfoMap::iterator it = pending.begin(); it != pending.end(); ++it) + { + boost::shared_ptr rec = boost::shared_ptr(new MythProgramInfo()); + *rec = it->second; + unsigned int index = MakeIndex(it->second); + m_recordings.insert(RecordingList::value_type(index, rec)); + m_recordingIndexByRuleId.insert(std::make_pair(it->second.RecordID(), index)); + } + + // Add missed programs (NOT RECORDING) to upcoming recordings. User could delete them as needed. + if (m_showNotRecording) + { + ProgramInfoMap schedule = m_con.GetScheduledPrograms(); + for (ProgramInfoMap::iterator it = schedule.begin(); it != schedule.end(); ++it) + { + if (m_recordingIndexByRuleId.count(it->second.RecordID()) == 0) + { + NodeById::const_iterator itr = m_rulesById.find(it->second.RecordID()); + if (itr != m_rulesById.end() && !itr->second->HasOverrideRules()) + { + boost::shared_ptr rec = boost::shared_ptr(new MythProgramInfo()); + *rec = it->second; + unsigned int index = MakeIndex(it->second); + m_recordings.insert(RecordingList::value_type(index, rec)); + m_recordingIndexByRuleId.insert(std::make_pair(it->second.RecordID(), index)); + } + } + } + } + + if (g_bExtraDebug) + { + for (NodeList::iterator it = m_rules.begin(); it != m_rules.end(); ++it) + XBMC->Log(LOG_DEBUG, "%s - Rule node - recordid: %u, parentid: %u, type: %d, overriden: %s", __FUNCTION__, (*it)->m_rule.RecordID(), (*it)->m_rule.ParentID(), (*it)->m_rule.Type(), ((*it)->HasOverrideRules() ? "Yes" : "No")); + for (RecordingList::iterator it = m_recordings.begin(); it != m_recordings.end(); ++it) + XBMC->Log(LOG_DEBUG, "%s - Recording - recordid: %u, index: %d, status: %d, title: %s", __FUNCTION__, it->second->RecordID(), it->first, it->second->Status(), it->second->Title().c_str()); + } +} + +RuleMetadata MythScheduleManager::GetMetadata(const MythRecordingRule &rule) const +{ + return m_versionHelper->GetMetadata(rule); +} + +MythRecordingRule MythScheduleManager::NewFromTemplate(MythEPGInfo &epgInfo) +{ + return m_versionHelper->NewFromTemplate(epgInfo); +} + +MythRecordingRule MythScheduleManager::NewSingleRecord(MythEPGInfo &epgInfo) +{ + return m_versionHelper->NewSingleRecord(epgInfo); +} + +MythRecordingRule MythScheduleManager::NewDailyRecord(MythEPGInfo &epgInfo) +{ + return m_versionHelper->NewDailyRecord(epgInfo); +} + +MythRecordingRule MythScheduleManager::NewWeeklyRecord(MythEPGInfo &epgInfo) +{ + return m_versionHelper->NewWeeklyRecord(epgInfo); +} + +MythRecordingRule MythScheduleManager::NewChannelRecord(MythEPGInfo &epgInfo) +{ + return m_versionHelper->NewChannelRecord(epgInfo); +} + +MythRecordingRule MythScheduleManager::NewOneRecord(MythEPGInfo &epgInfo) +{ + return m_versionHelper->NewOneRecord(epgInfo); +} + +bool MythScheduleManager::ToggleShowNotRecording() +{ + m_showNotRecording ^= true; + return m_showNotRecording; +} + +/////////////////////////////////////////////////////////////////////////////// +//// +//// Version Helper for unknown version (no helper) +//// + +bool MythScheduleHelperNoHelper::SameTimeslot(MythRecordingRule &first, MythRecordingRule &second) const +{ + (void)first; + (void)second; + return false; +} + +RuleMetadata MythScheduleHelperNoHelper::GetMetadata(const MythRecordingRule &rule) const +{ + RuleMetadata meta; + (void)rule; + meta.isRepeating = false; + meta.weekDays = 0; + meta.marker = ""; + return meta; +} + +MythRecordingRule MythScheduleHelperNoHelper::NewFromTemplate(MythEPGInfo &epgInfo) +{ + (void)epgInfo; + return MythRecordingRule(); +} + +MythRecordingRule MythScheduleHelperNoHelper::NewSingleRecord(MythEPGInfo &epgInfo) +{ + (void)epgInfo; + return MythRecordingRule(); +} + +MythRecordingRule MythScheduleHelperNoHelper::NewDailyRecord(MythEPGInfo &epgInfo) +{ + (void)epgInfo; + return MythRecordingRule(); +} + +MythRecordingRule MythScheduleHelperNoHelper::NewWeeklyRecord(MythEPGInfo &epgInfo) +{ + (void)epgInfo; + return MythRecordingRule(); +} + +MythRecordingRule MythScheduleHelperNoHelper::NewChannelRecord(MythEPGInfo &epgInfo) +{ + (void)epgInfo; + return MythRecordingRule(); +} + +MythRecordingRule MythScheduleHelperNoHelper::NewOneRecord(MythEPGInfo &epgInfo) +{ + (void)epgInfo; + return MythRecordingRule(); +} + +/////////////////////////////////////////////////////////////////////////////// +//// +//// Version Helper for database up to 1226 (0.24)) +//// + +bool MythScheduleHelper1226::SameTimeslot(MythRecordingRule &first, MythRecordingRule &second) const +{ + time_t first_st = first.StartTime(); + time_t second_st = second.StartTime(); + + switch (first.Type()) + { + case MythRecordingRule::RT_NotRecording: + case MythRecordingRule::RT_SingleRecord: + case MythRecordingRule::RT_OverrideRecord: + case MythRecordingRule::RT_DontRecord: + return + second_st == first_st && + second.EndTime() == first.EndTime() && + second.ChannelID() == first.ChannelID(); + + case MythRecordingRule::RT_OneRecord: // FindOneRecord + return + second.Title() == first.Title() && + second.ChannelID() == first.ChannelID(); + + case MythRecordingRule::RT_DailyRecord: // TimeslotRecord + return + second.Title() == first.Title() && + daytime(&first_st) == daytime(&second_st) && + second.ChannelID() == first.ChannelID(); + + case MythRecordingRule::RT_WeeklyRecord: // WeekslotRecord + return + second.Title() == first.Title() && + daytime(&first_st) == daytime(&second_st) && + weekday(&first_st) == weekday(&second_st) && + second.ChannelID() == first.ChannelID(); + + case MythRecordingRule::RT_FindDailyRecord: + return + second.Title() == first.Title() && + second.ChannelID() == first.ChannelID(); + + case MythRecordingRule::RT_FindWeeklyRecord: + return + second.Title() == first.Title() && + weekday(&first_st) == weekday(&second_st) && + second.ChannelID() == first.ChannelID(); + + case MythRecordingRule::RT_ChannelRecord: + return + second.Title() == first.Title() && + second.ChannelID() == first.ChannelID(); + + case MythRecordingRule::RT_AllRecord: + return + second.Title() == first.Title(); + + default: + break; + } + return false; +} + +RuleMetadata MythScheduleHelper1226::GetMetadata(const MythRecordingRule &rule) const +{ + RuleMetadata meta; + time_t st = rule.StartTime(); + meta.isRepeating = false; + meta.weekDays = 0; + meta.marker = ""; + switch (rule.Type()) + { + case MythRecordingRule::RT_DailyRecord: + case MythRecordingRule::RT_FindDailyRecord: + meta.isRepeating = true; + meta.weekDays = 0x7F; + meta.marker = "d"; + break; + case MythRecordingRule::RT_WeeklyRecord: + case MythRecordingRule::RT_FindWeeklyRecord: + meta.isRepeating = true; + meta.weekDays = 1 << ((weekday(&st) + 6) % 7); + meta.marker = "w"; + break; + case MythRecordingRule::RT_ChannelRecord: + meta.isRepeating = true; + meta.weekDays = 0x7F; + meta.marker = "C"; + break; + case MythRecordingRule::RT_AllRecord: + meta.isRepeating = true; + meta.weekDays = 0x7F; + meta.marker = "A"; + break; + case MythRecordingRule::RT_OneRecord: + meta.isRepeating = false; + meta.weekDays = 0; + meta.marker = "1"; + break; + case MythRecordingRule::RT_DontRecord: + meta.isRepeating = false; + meta.weekDays = 0; + meta.marker = "x"; + break; + case MythRecordingRule::RT_OverrideRecord: + meta.isRepeating = false; + meta.weekDays = 0; + meta.marker = "o"; + break; + default: + break; + } + return meta; +} + +MythRecordingRule MythScheduleHelper1226::NewFromTemplate(MythEPGInfo &epgInfo) +{ + MythRecordingRule rule; + // Load rule template from selected provider + switch (g_iRecTemplateType) + { + case 1: // Template provider is 'MythTV', then load the template from backend. + rule = m_db.LoadRecordingRuleTemplate("", ""); + break; + case 0: // Template provider is 'Internal', then set rule with settings + rule.SetAutoCommFlag(g_bRecAutoCommFlag); + rule.SetAutoTranscode(g_bRecAutoTranscode); + rule.SetUserJob(1, g_bRecAutoRunJob1); + rule.SetUserJob(2, g_bRecAutoRunJob2); + rule.SetUserJob(3, g_bRecAutoRunJob3); + rule.SetUserJob(4, g_bRecAutoRunJob4); + rule.SetAutoExpire(g_bRecAutoExpire); + rule.SetTranscoder(g_iRecTranscoder); + } + + // Category override + if (!epgInfo.IsNull()) + { + CStdString overTimeCategory = m_db.GetSetting("OverTimeCategory"); + if (!overTimeCategory.IsEmpty() && (overTimeCategory.Equals(epgInfo.Category()) || overTimeCategory.Equals(epgInfo.CategoryType()))) + { + CStdString categoryOverTime = m_db.GetSetting("CategoryOverTime"); + XBMC->Log(LOG_DEBUG, "Overriding end offset for category %s: +%s", overTimeCategory.c_str(), categoryOverTime.c_str()); + rule.SetEndOffset(atoi(categoryOverTime)); + } + } + return rule; +} + +MythRecordingRule MythScheduleHelper1226::NewSingleRecord(MythEPGInfo &epgInfo) +{ + MythRecordingRule rule = this->NewFromTemplate(epgInfo); + + rule.SetType(MythRecordingRule::RT_SingleRecord); + + if (!epgInfo.IsNull()) + { + rule.SetChannelID(epgInfo.ChannelID()); + rule.SetStartTime(epgInfo.StartTime()); + rule.SetEndTime(epgInfo.EndTime()); + rule.SetSearchType(MythRecordingRule::ST_NoSearch); + rule.SetTitle(epgInfo.Title()); + rule.SetSubtitle(epgInfo.Subtitle()); + rule.SetCategory(epgInfo.Category()); + rule.SetDescription(epgInfo.Description()); + rule.SetCallsign(epgInfo.Callsign()); + rule.SetProgramID(epgInfo.ProgramID()); + rule.SetSeriesID(epgInfo.SeriesID()); + } + else + { + // kManualSearch = http://www.gossamer-threads.com/lists/mythtv/dev/155150?search_string=kManualSearch;#155150 + rule.SetSearchType(MythRecordingRule::ST_ManualSearch); + } + rule.SetDuplicateControlMethod(MythRecordingRule::DM_CheckNone); + rule.SetCheckDuplicatesInType(MythRecordingRule::DI_InAll); + rule.SetInactive(false); + return rule; +} + +MythRecordingRule MythScheduleHelper1226::NewDailyRecord(MythEPGInfo &epgInfo) +{ + MythRecordingRule rule = this->NewFromTemplate(epgInfo); + + rule.SetType(MythRecordingRule::RT_DailyRecord); + + if (!epgInfo.IsNull()) + { + rule.SetSearchType(MythRecordingRule::ST_NoSearch); + rule.SetChannelID(epgInfo.ChannelID()); + rule.SetStartTime(epgInfo.StartTime()); + rule.SetEndTime(epgInfo.EndTime()); + rule.SetTitle(epgInfo.Title()); + rule.SetSubtitle(epgInfo.Subtitle()); + rule.SetCategory(epgInfo.Category()); + rule.SetDescription(epgInfo.Description()); + rule.SetCallsign(epgInfo.Callsign()); + rule.SetProgramID(epgInfo.ProgramID()); + rule.SetSeriesID(epgInfo.SeriesID()); + } + else + { + // kManualSearch = http://www.gossamer-threads.com/lists/mythtv/dev/155150?search_string=kManualSearch;#155150 + rule.SetSearchType(MythRecordingRule::ST_ManualSearch); + } + rule.SetDuplicateControlMethod(MythRecordingRule::DM_CheckSubtitleAndDescription); + rule.SetCheckDuplicatesInType(MythRecordingRule::DI_InAll); + rule.SetInactive(false); + return rule; +} + +MythRecordingRule MythScheduleHelper1226::NewWeeklyRecord(MythEPGInfo &epgInfo) +{ + MythRecordingRule rule = this->NewFromTemplate(epgInfo); + + rule.SetType(MythRecordingRule::RT_WeeklyRecord); + + if (!epgInfo.IsNull()) + { + rule.SetSearchType(MythRecordingRule::ST_NoSearch); + rule.SetChannelID(epgInfo.ChannelID()); + rule.SetStartTime(epgInfo.StartTime()); + rule.SetEndTime(epgInfo.EndTime()); + rule.SetTitle(epgInfo.Title()); + rule.SetSubtitle(epgInfo.Subtitle()); + rule.SetCategory(epgInfo.Category()); + rule.SetDescription(epgInfo.Description()); + rule.SetCallsign(epgInfo.Callsign()); + rule.SetProgramID(epgInfo.ProgramID()); + rule.SetSeriesID(epgInfo.SeriesID()); + } + else + { + // kManualSearch = http://www.gossamer-threads.com/lists/mythtv/dev/155150?search_string=kManualSearch;#155150 + rule.SetSearchType(MythRecordingRule::ST_ManualSearch); + } + rule.SetDuplicateControlMethod(MythRecordingRule::DM_CheckSubtitleAndDescription); + rule.SetCheckDuplicatesInType(MythRecordingRule::DI_InAll); + rule.SetInactive(false); + return rule; +} + +MythRecordingRule MythScheduleHelper1226::NewChannelRecord(MythEPGInfo &epgInfo) +{ + MythRecordingRule rule = this->NewFromTemplate(epgInfo); + + rule.SetType(MythRecordingRule::RT_ChannelRecord); + + if (!epgInfo.IsNull()) + { + rule.SetSearchType(MythRecordingRule::ST_TitleSearch); + rule.SetChannelID(epgInfo.ChannelID()); + rule.SetStartTime(epgInfo.StartTime()); + rule.SetEndTime(epgInfo.EndTime()); + rule.SetTitle(epgInfo.Title()); + // Backend use the description to find program by keywords or title + rule.SetSubtitle(""); + rule.SetDescription(epgInfo.Title()); + rule.SetCategory(epgInfo.Category()); + rule.SetCallsign(epgInfo.Callsign()); + rule.SetProgramID(epgInfo.ProgramID()); + rule.SetSeriesID(epgInfo.SeriesID()); + } + else + { + // Not feasible + rule.SetType(MythRecordingRule::RT_NotRecording); + } + rule.SetDuplicateControlMethod(MythRecordingRule::DM_CheckSubtitleAndDescription); + rule.SetCheckDuplicatesInType(MythRecordingRule::DI_InAll); + rule.SetInactive(false); + return rule; +} + +MythRecordingRule MythScheduleHelper1226::NewOneRecord(MythEPGInfo &epgInfo) +{ + MythRecordingRule rule = this->NewFromTemplate(epgInfo); + + rule.SetType(MythRecordingRule::RT_OneRecord); + + if (!epgInfo.IsNull()) + { + rule.SetSearchType(MythRecordingRule::ST_TitleSearch); + rule.SetChannelID(epgInfo.ChannelID()); + rule.SetStartTime(epgInfo.StartTime()); + rule.SetEndTime(epgInfo.EndTime()); + rule.SetTitle(epgInfo.Title()); + // Backend use the description to find program by keywords or title + rule.SetSubtitle(""); + rule.SetDescription(epgInfo.Title()); + rule.SetCategory(epgInfo.Category()); + rule.SetCallsign(epgInfo.Callsign()); + rule.SetProgramID(epgInfo.ProgramID()); + rule.SetSeriesID(epgInfo.SeriesID()); + } + else + { + // Not feasible + rule.SetType(MythRecordingRule::RT_NotRecording); + } + rule.SetDuplicateControlMethod(MythRecordingRule::DM_CheckSubtitleAndDescription); + rule.SetCheckDuplicatesInType(MythRecordingRule::DI_InAll); + rule.SetInactive(false); + return rule; +} + +/////////////////////////////////////////////////////////////////////////////// +//// +//// Version Helper for database up to 1278 (0.25) +//// +//// New filter mask (1276) +//// New autometadata flag (1278) +//// + +bool MythScheduleHelper1278::SameTimeslot(MythRecordingRule &first, MythRecordingRule &second) const +{ + time_t first_st = first.StartTime(); + time_t second_st = second.StartTime(); + + switch (first.Type()) + { + case MythRecordingRule::RT_NotRecording: + case MythRecordingRule::RT_SingleRecord: + case MythRecordingRule::RT_OverrideRecord: + case MythRecordingRule::RT_DontRecord: + return + second_st == first_st && + second.EndTime() == first.EndTime() && + second.ChannelID() == first.ChannelID() && + second.Filter() == first.Filter(); + + case MythRecordingRule::RT_OneRecord: // FindOneRecord + return + second.Title() == first.Title() && + second.ChannelID() == first.ChannelID() && + second.Filter() == first.Filter(); + + case MythRecordingRule::RT_DailyRecord: // TimeslotRecord + return + second.Title() == first.Title() && + daytime(&first_st) == daytime(&second_st) && + second.ChannelID() == first.ChannelID() && + second.Filter() == first.Filter(); + + case MythRecordingRule::RT_WeeklyRecord: // WeekslotRecord + return + second.Title() == first.Title() && + daytime(&first_st) == daytime(&second_st) && + weekday(&first_st) == weekday(&second_st) && + second.ChannelID() == first.ChannelID() && + second.Filter() == first.Filter(); + + case MythRecordingRule::RT_FindDailyRecord: + return + second.Title() == first.Title() && + second.ChannelID() == first.ChannelID() && + second.Filter() == first.Filter(); + + case MythRecordingRule::RT_FindWeeklyRecord: + return + second.Title() == first.Title() && + weekday(&first_st) == weekday(&second_st) && + second.ChannelID() == first.ChannelID() && + second.Filter() == first.Filter(); + + case MythRecordingRule::RT_ChannelRecord: + return + second.Title() == first.Title() && + second.ChannelID() == first.ChannelID() && + second.Filter() == first.Filter(); + + case MythRecordingRule::RT_AllRecord: + return + second.Title() == first.Title() && + second.Filter() == first.Filter(); + + default: + break; + } + return false; +} + +MythRecordingRule MythScheduleHelper1278::NewFromTemplate(MythEPGInfo &epgInfo) +{ + MythRecordingRule rule; + // Load rule template from selected provider + switch (g_iRecTemplateType) + { + case 1: // Template provider is 'MythTV', then load the template from backend. + rule = m_db.LoadRecordingRuleTemplate("", ""); + break; + case 0: // Template provider is 'Internal', then set rule with settings + rule.SetAutoCommFlag(g_bRecAutoCommFlag); + rule.SetAutoMetadata(g_bRecAutoMetadata); + rule.SetAutoTranscode(g_bRecAutoTranscode); + rule.SetUserJob(1, g_bRecAutoRunJob1); + rule.SetUserJob(2, g_bRecAutoRunJob2); + rule.SetUserJob(3, g_bRecAutoRunJob3); + rule.SetUserJob(4, g_bRecAutoRunJob4); + rule.SetAutoExpire(g_bRecAutoExpire); + rule.SetTranscoder(g_iRecTranscoder); + } + + // Category override + if (!epgInfo.IsNull()) + { + CStdString overTimeCategory = m_db.GetSetting("OverTimeCategory"); + if (!overTimeCategory.IsEmpty() && (overTimeCategory.Equals(epgInfo.Category()) || overTimeCategory.Equals(epgInfo.CategoryType()))) + { + CStdString categoryOverTime = m_db.GetSetting("CategoryOverTime"); + XBMC->Log(LOG_DEBUG, "Overriding end offset for category %s: +%s", overTimeCategory.c_str(), categoryOverTime.c_str()); + rule.SetEndOffset(atoi(categoryOverTime)); + } + } + return rule; +} + +/////////////////////////////////////////////////////////////////////////////// +//// +//// Version helper for database up to 1302 (0.26) +//// +//// TemplateRecord replaces static settings +//// + +MythRecordingRule MythScheduleHelper1302::NewFromTemplate(MythEPGInfo &epgInfo) +{ + MythRecordingRule rule; + // Load rule template from selected provider + switch (g_iRecTemplateType) + { + case 1: // Template provider is 'MythTV', then load the template from backend. + if (!epgInfo.IsNull()) + rule = m_db.LoadRecordingRuleTemplate(epgInfo.Category(), epgInfo.CategoryType()); + else + rule = m_db.LoadRecordingRuleTemplate("", ""); + break; + case 0: // Template provider is 'Internal', then set rule with settings + rule.SetAutoCommFlag(g_bRecAutoCommFlag); + rule.SetAutoMetadata(g_bRecAutoMetadata); + rule.SetAutoTranscode(g_bRecAutoTranscode); + rule.SetUserJob(1, g_bRecAutoRunJob1); + rule.SetUserJob(2, g_bRecAutoRunJob2); + rule.SetUserJob(3, g_bRecAutoRunJob3); + rule.SetUserJob(4, g_bRecAutoRunJob4); + rule.SetAutoExpire(g_bRecAutoExpire); + rule.SetTranscoder(g_iRecTranscoder); + } + + // Category override + if (!epgInfo.IsNull()) + { + CStdString overTimeCategory = m_db.GetSetting("OverTimeCategory"); + if (!overTimeCategory.IsEmpty() && (overTimeCategory.Equals(epgInfo.Category()) || overTimeCategory.Equals(epgInfo.CategoryType()))) + { + CStdString categoryOverTime = m_db.GetSetting("CategoryOverTime"); + XBMC->Log(LOG_DEBUG, "Overriding end offset for category %s: +%s", overTimeCategory.c_str(), categoryOverTime.c_str()); + rule.SetEndOffset(atoi(categoryOverTime)); + } + } + return rule; +} + +/////////////////////////////////////////////////////////////////////////////// +//// +//// Version helper for database up to 1309 (0.27) +//// +//// Remove the Timeslot and Weekslot recording rule types. These rule +//// types are too rigid and don't work when a broadcaster shifts the +//// starting time of a program by a few minutes. Users should now use +//// Channel recording rules in place of Timeslot and Weekslot rules. To +//// approximate the old functionality, two new schedule filters have been +//// added. In addition, the new "This time" and "This day and time" +//// filters are less strict and match any program starting within 10 +//// minutes of the recording rule time. +//// Restrict the use of the FindDaily? and FindWeekly? recording rule types +//// (now simply called Daily and Weekly) to search and manual recording +//// rules. These rule types are rarely needed and limiting their use to +//// the most powerful cases simplifies the user interface for the more +//// common cases. Users should now use Daily and Weekly, custom search +//// rules in place of FindDaily? and FindWeekly? rules. +//// Any existing recording rules using the no longer supported or allowed +//// types are automatically converted to the suggested alternatives. +//// + +RuleMetadata MythScheduleHelper1309::GetMetadata(const MythRecordingRule &rule) const +{ + RuleMetadata meta; + time_t st = rule.StartTime(); + meta.isRepeating = false; + meta.weekDays = 0; + meta.marker = ""; + switch (rule.Type()) + { + case MythRecordingRule::RT_DailyRecord: + case MythRecordingRule::RT_FindDailyRecord: + meta.isRepeating = true; + meta.weekDays = 0x7F; + meta.marker = "d"; + break; + case MythRecordingRule::RT_WeeklyRecord: + case MythRecordingRule::RT_FindWeeklyRecord: + meta.isRepeating = true; + meta.weekDays = 1 << ((weekday(&st) + 6) % 7); + meta.marker = "w"; + break; + case MythRecordingRule::RT_ChannelRecord: + meta.isRepeating = true; + meta.weekDays = 0x7F; + meta.marker = "C"; + break; + case MythRecordingRule::RT_AllRecord: + meta.isRepeating = true; + if ((rule.Filter() & MythRecordingRule::FM_ThisDayAndTime)) + { + meta.weekDays = 1 << ((weekday(&st) + 6) % 7); + meta.marker = "w"; + } + else if ((rule.Filter() & MythRecordingRule::FM_ThisTime)) + { + meta.weekDays = 0x7F; + meta.marker = "d"; + } + else + { + meta.weekDays = 0x7F; + meta.marker = "A"; + } + break; + case MythRecordingRule::RT_OneRecord: + meta.isRepeating = false; + meta.weekDays = 0; + meta.marker = "1"; + break; + case MythRecordingRule::RT_DontRecord: + meta.isRepeating = false; + meta.weekDays = 0; + meta.marker = "x"; + break; + case MythRecordingRule::RT_OverrideRecord: + meta.isRepeating = false; + meta.weekDays = 0; + meta.marker = "o"; + break; + default: + break; + } + return meta; +} + +MythRecordingRule MythScheduleHelper1309::NewDailyRecord(MythEPGInfo &epgInfo) +{ + unsigned int filter; + MythRecordingRule rule = this->NewFromTemplate(epgInfo); + + rule.SetType(MythRecordingRule::RT_AllRecord); + filter = MythRecordingRule::FM_ThisChannel + MythRecordingRule::FM_ThisTime; + rule.SetFilter(filter); + + if (!epgInfo.IsNull()) + { + rule.SetSearchType(MythRecordingRule::ST_NoSearch); + rule.SetChannelID(epgInfo.ChannelID()); + rule.SetStartTime(epgInfo.StartTime()); + rule.SetEndTime(epgInfo.EndTime()); + rule.SetTitle(epgInfo.Title()); + rule.SetSubtitle(epgInfo.Subtitle()); + rule.SetCategory(epgInfo.Category()); + rule.SetDescription(epgInfo.Description()); + rule.SetCallsign(epgInfo.Callsign()); + rule.SetProgramID(epgInfo.ProgramID()); + rule.SetSeriesID(epgInfo.SeriesID()); + } + else + { + // No EPG! Create custom daily for this channel + rule.SetType(MythRecordingRule::RT_DailyRecord); + rule.SetFilter(MythRecordingRule::FM_ThisChannel); + // kManualSearch = http://www.gossamer-threads.com/lists/mythtv/dev/155150?search_string=kManualSearch;#155150 + rule.SetSearchType(MythRecordingRule::ST_ManualSearch); + } + rule.SetDuplicateControlMethod(MythRecordingRule::DM_CheckSubtitleAndDescription); + rule.SetCheckDuplicatesInType(MythRecordingRule::DI_InAll); + rule.SetInactive(false); + return rule; +} + +MythRecordingRule MythScheduleHelper1309::NewWeeklyRecord(MythEPGInfo &epgInfo) +{ + unsigned int filter; + MythRecordingRule rule = this->NewFromTemplate(epgInfo); + + rule.SetType(MythRecordingRule::RT_AllRecord); + filter = MythRecordingRule::FM_ThisChannel + MythRecordingRule::FM_ThisDayAndTime; + rule.SetFilter(filter); + + if (!epgInfo.IsNull()) + { + rule.SetSearchType(MythRecordingRule::ST_NoSearch); + rule.SetChannelID(epgInfo.ChannelID()); + rule.SetStartTime(epgInfo.StartTime()); + rule.SetEndTime(epgInfo.EndTime()); + rule.SetTitle(epgInfo.Title()); + rule.SetSubtitle(epgInfo.Subtitle()); + rule.SetCategory(epgInfo.Category()); + rule.SetDescription(epgInfo.Description()); + rule.SetCallsign(epgInfo.Callsign()); + rule.SetProgramID(epgInfo.ProgramID()); + rule.SetSeriesID(epgInfo.SeriesID()); + } + else + { + // No EPG! Create custom weekly for this channel + rule.SetType(MythRecordingRule::RT_WeeklyRecord); + rule.SetFilter(MythRecordingRule::FM_ThisChannel); + // kManualSearch = http://www.gossamer-threads.com/lists/mythtv/dev/155150?search_string=kManualSearch;#155150 + rule.SetSearchType(MythRecordingRule::ST_ManualSearch); + } + rule.SetDuplicateControlMethod(MythRecordingRule::DM_CheckSubtitleAndDescription); + rule.SetCheckDuplicatesInType(MythRecordingRule::DI_InAll); + rule.SetInactive(false); + return rule; +} + +MythRecordingRule MythScheduleHelper1309::NewChannelRecord(MythEPGInfo &epgInfo) +{ + unsigned int filter; + MythRecordingRule rule = this->NewFromTemplate(epgInfo); + + rule.SetType(MythRecordingRule::RT_AllRecord); + filter = MythRecordingRule::FM_ThisChannel; + rule.SetFilter(filter); + + if (!epgInfo.IsNull()) + { + rule.SetSearchType(MythRecordingRule::ST_NoSearch); + rule.SetChannelID(epgInfo.ChannelID()); + rule.SetStartTime(epgInfo.StartTime()); + rule.SetEndTime(epgInfo.EndTime()); + rule.SetTitle(epgInfo.Title()); + rule.SetSubtitle(epgInfo.Subtitle()); + rule.SetCategory(epgInfo.Category()); + rule.SetDescription(epgInfo.Description()); + rule.SetCallsign(epgInfo.Callsign()); + rule.SetProgramID(epgInfo.ProgramID()); + rule.SetSeriesID(epgInfo.SeriesID()); + } + else + { + // Not feasible + rule.SetType(MythRecordingRule::RT_NotRecording); + } + rule.SetDuplicateControlMethod(MythRecordingRule::DM_CheckSubtitleAndDescription); + rule.SetCheckDuplicatesInType(MythRecordingRule::DI_InAll); + rule.SetInactive(false); + return rule; +} + +MythRecordingRule MythScheduleHelper1309::NewOneRecord(MythEPGInfo &epgInfo) +{ + unsigned int filter; + MythRecordingRule rule = this->NewFromTemplate(epgInfo); + + rule.SetType(MythRecordingRule::RT_OneRecord); + filter = MythRecordingRule::FM_ThisEpisode; + rule.SetFilter(filter); + + if (!epgInfo.IsNull()) + { + rule.SetSearchType(MythRecordingRule::ST_NoSearch); + rule.SetChannelID(epgInfo.ChannelID()); + rule.SetStartTime(epgInfo.StartTime()); + rule.SetEndTime(epgInfo.EndTime()); + rule.SetTitle(epgInfo.Title()); + rule.SetSubtitle(epgInfo.Subtitle()); + rule.SetCategory(epgInfo.Category()); + rule.SetDescription(epgInfo.Description()); + rule.SetCallsign(epgInfo.Callsign()); + rule.SetProgramID(epgInfo.ProgramID()); + rule.SetSeriesID(epgInfo.SeriesID()); + } + else + { + // Not feasible + rule.SetType(MythRecordingRule::RT_NotRecording); + } + rule.SetDuplicateControlMethod(MythRecordingRule::DM_CheckSubtitleAndDescription); + rule.SetCheckDuplicatesInType(MythRecordingRule::DI_InAll); + rule.SetInactive(false); + return rule; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythScheduleManager.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythScheduleManager.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythScheduleManager.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythScheduleManager.h 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,229 @@ +#pragma once +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "MythRecordingRule.h" +#include "MythProgramInfo.h" +#include "MythConnection.h" +#include "MythDatabase.h" +#include "MythEPGInfo.h" + +#include + +#include +#include +#include + +typedef std::vector OverrideRuleList; + +// Schedule element is pair < index of schedule , program info of schedule > +typedef std::vector > > ScheduleList; + +typedef struct +{ + bool isRepeating; + int weekDays; + const char* marker; +} RuleMetadata; + +class MythRecordingRuleNode +{ +public: + friend class MythScheduleManager; + + MythRecordingRuleNode(const MythRecordingRule &rule); + + bool IsOverrideRule() const; + MythRecordingRule GetRule() const; + MythRecordingRule GetMainRule() const; + + bool HasOverrideRules() const; + OverrideRuleList GetOverrideRules() const; + + bool IsInactiveRule() const; + +private: + MythRecordingRule m_rule; + MythRecordingRule m_mainRule; + std::vector m_overrideRules; +}; + +class MythScheduleManager +{ +public: + enum MSM_ERROR { + MSM_ERROR_FAILED = -1, + MSM_ERROR_NOT_IMPLEMENTED = 0, + MSM_ERROR_SUCCESS = 1 + }; + + MythScheduleManager(); + MythScheduleManager(MythConnection &con, MythDatabase &db); + + // Called by GetTimers + ScheduleList GetUpcomingRecordings(); + + // Called by AddTimer + MSM_ERROR ScheduleRecording(const MythRecordingRule &rule); + + // Called by DeleteTimer + MSM_ERROR DeleteRecording(unsigned int index); + + MSM_ERROR DisableRecording(unsigned int index); + MSM_ERROR EnableRecording(unsigned int index); + MSM_ERROR UpdateRecording(unsigned int index, MythRecordingRule &newrule); + + boost::shared_ptr FindRuleById(unsigned int recordID) const; + ScheduleList FindUpComingByRuleId(unsigned int recordID) const; + boost::shared_ptr FindUpComingByIndex(unsigned int index) const; + + void Update(); + + class VersionHelper + { + public: + friend class MythScheduleManager; + + VersionHelper() {} + virtual ~VersionHelper(); + virtual bool SameTimeslot(MythRecordingRule &first, MythRecordingRule &second) const = 0; + virtual RuleMetadata GetMetadata(const MythRecordingRule &rule) const = 0; + virtual MythRecordingRule NewFromTemplate(MythEPGInfo &epgInfo) = 0; + virtual MythRecordingRule NewSingleRecord(MythEPGInfo &epgInfo) = 0; + virtual MythRecordingRule NewDailyRecord(MythEPGInfo &epgInfo) = 0; + virtual MythRecordingRule NewWeeklyRecord(MythEPGInfo &epgInfo) = 0; + virtual MythRecordingRule NewChannelRecord(MythEPGInfo &epgInfo) = 0; + virtual MythRecordingRule NewOneRecord(MythEPGInfo &epgInfo) = 0; + }; + + RuleMetadata GetMetadata(const MythRecordingRule &rule) const; + MythRecordingRule NewFromTemplate(MythEPGInfo &epgInfo); + MythRecordingRule NewSingleRecord(MythEPGInfo &epgInfo); + MythRecordingRule NewDailyRecord(MythEPGInfo &epgInfo); + MythRecordingRule NewWeeklyRecord(MythEPGInfo &epgInfo); + MythRecordingRule NewChannelRecord(MythEPGInfo &epgInfo); + MythRecordingRule NewOneRecord(MythEPGInfo &epgInfo); + + bool ToggleShowNotRecording(); + +private: + mutable PLATFORM::CMutex m_lock; + MythConnection m_con; + MythDatabase m_db; + + int m_dbSchemaVersion; + boost::shared_ptr m_versionHelper; + void Setup(); + + unsigned int MakeIndex(MythProgramInfo &recording) const; + + // The list of rule nodes + typedef std::list > NodeList; + // To find a rule node by its key (recordID) + typedef std::map > NodeById; + // Store and find up coming recordings by index + typedef std::map > RecordingList; + // To find all indexes of schedule by rule Id : pair < Rule Id , index of schedule > + typedef std::multimap RecordingIndexByRuleId; + + NodeList m_rules; + NodeById m_rulesById; + RecordingList m_recordings; + RecordingIndexByRuleId m_recordingIndexByRuleId; + + bool m_showNotRecording; +}; + + +/////////////////////////////////////////////////////////////////////////////// +//// +//// VersionHelper +//// + +inline MythScheduleManager::VersionHelper::~VersionHelper() { +} + +// No helper + +class MythScheduleHelperNoHelper : public MythScheduleManager::VersionHelper { +public: + virtual bool SameTimeslot(MythRecordingRule &first, MythRecordingRule &second) const; + virtual RuleMetadata GetMetadata(const MythRecordingRule &rule) const; + virtual MythRecordingRule NewFromTemplate(MythEPGInfo &epgInfo); + virtual MythRecordingRule NewSingleRecord(MythEPGInfo &epgInfo); + virtual MythRecordingRule NewDailyRecord(MythEPGInfo &epgInfo); + virtual MythRecordingRule NewWeeklyRecord(MythEPGInfo &epgInfo); + virtual MythRecordingRule NewChannelRecord(MythEPGInfo &epgInfo); + virtual MythRecordingRule NewOneRecord(MythEPGInfo &epgInfo); +}; + +// Base 0.24 + +class MythScheduleHelper1226 : public MythScheduleHelperNoHelper { +public: + + MythScheduleHelper1226(MythDatabase &db) : m_db(db) { + } + virtual bool SameTimeslot(MythRecordingRule &first, MythRecordingRule &second) const; + virtual RuleMetadata GetMetadata(const MythRecordingRule &rule) const; + virtual MythRecordingRule NewFromTemplate(MythEPGInfo &epgInfo); + virtual MythRecordingRule NewSingleRecord(MythEPGInfo &epgInfo); + virtual MythRecordingRule NewDailyRecord(MythEPGInfo &epgInfo); + virtual MythRecordingRule NewWeeklyRecord(MythEPGInfo &epgInfo); + virtual MythRecordingRule NewChannelRecord(MythEPGInfo &epgInfo); + virtual MythRecordingRule NewOneRecord(MythEPGInfo &epgInfo); +protected: + MythDatabase m_db; +}; + +// News in 0.25 + +class MythScheduleHelper1278 : public MythScheduleHelper1226 { +public: + + MythScheduleHelper1278(MythDatabase &db) : MythScheduleHelper1226(db) { + } + virtual bool SameTimeslot(MythRecordingRule &first, MythRecordingRule &second) const; + virtual MythRecordingRule NewFromTemplate(MythEPGInfo &epgInfo); +}; + +// News in 0.26 + +class MythScheduleHelper1302 : public MythScheduleHelper1278 { +public: + + MythScheduleHelper1302(MythDatabase &db) : MythScheduleHelper1278(db) { + } + virtual MythRecordingRule NewFromTemplate(MythEPGInfo &epgInfo); +}; + +// News in 0.27 + +class MythScheduleHelper1309 : public MythScheduleHelper1302 { +public: + + MythScheduleHelper1309(MythDatabase &db) : MythScheduleHelper1302(db) { + } + virtual RuleMetadata GetMetadata(const MythRecordingRule &rule) const; + virtual MythRecordingRule NewDailyRecord(MythEPGInfo &epgInfo); + virtual MythRecordingRule NewWeeklyRecord(MythEPGInfo &epgInfo); + virtual MythRecordingRule NewChannelRecord(MythEPGInfo &epgInfo); + virtual MythRecordingRule NewOneRecord(MythEPGInfo &epgInfo); +}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythTimestamp.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythTimestamp.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythTimestamp.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythTimestamp.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -32,19 +32,19 @@ *m_timestamp_t = cmyth_timestamp; } -MythTimestamp::MythTimestamp(CStdString time, bool datetime) +MythTimestamp::MythTimestamp(CStdString time) : m_timestamp_t(new MythPointer()) { - // datetime ? DatetimeFromString(time.Buffer()) : cmyth_timestamp_from_string(time.Buffer()) - (void)datetime; - *m_timestamp_t = (cmyth_timestamp_from_string(time.Buffer())); } -MythTimestamp::MythTimestamp(time_t time) +MythTimestamp::MythTimestamp(time_t time, bool utc) : m_timestamp_t(new MythPointer()) { - *m_timestamp_t = cmyth_timestamp_from_unixtime(time); + if (utc) + *m_timestamp_t = cmyth_timestamp_utc_from_unixtime(time); + else + *m_timestamp_t = cmyth_timestamp_from_unixtime(time); } bool MythTimestamp::operator==(const MythTimestamp &other) @@ -91,7 +91,7 @@ CStdString MythTimestamp::DisplayString(bool use12hClock) { char time[25]; - bool succeded=cmyth_timestamp_to_display_string(time, *m_timestamp_t, use12hClock) == 0; + bool succeded = cmyth_timestamp_to_display_string(time, *m_timestamp_t, use12hClock) == 0; return succeded ? CStdString(time) : CStdString(""); } @@ -100,4 +100,18 @@ char time[15]; bool succeded = cmyth_timestamp_to_numstring(time, *m_timestamp_t) == 0; return succeded ? CStdString(time) : CStdString(""); -} \ No newline at end of file +} + +bool MythTimestamp::IsUTC() +{ + if (cmyth_timestamp_isutc(*m_timestamp_t) == 1) + return true; + return false; +} + +MythTimestamp MythTimestamp::ToUTC() +{ + if (this->IsUTC()) + return *this; + return MythTimestamp(cmyth_timestamp_to_utc(*m_timestamp_t)); +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythTimestamp.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythTimestamp.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth/MythTimestamp.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth/MythTimestamp.h 2014-01-04 10:28:12.000000000 +0000 @@ -36,8 +36,8 @@ MythTimestamp(); MythTimestamp(cmyth_timestamp_t cmyth_timestamp); - MythTimestamp(CStdString time, bool datetime); - MythTimestamp(time_t time); + MythTimestamp(CStdString time); + MythTimestamp(time_t time, bool utc); bool operator==(const MythTimestamp &other); bool operator!=(const MythTimestamp &other) { return !(*this == other); } @@ -54,6 +54,9 @@ CStdString DisplayString(bool use12hClock); CStdString NumString(); + bool IsUTC(); + MythTimestamp ToUTC(); + private: boost::shared_ptr > m_timestamp_t; }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/cppmyth.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/cppmyth.h 2014-01-04 10:28:12.000000000 +0000 @@ -1,6 +1,7 @@ #pragma once #include "cppmyth/MythChannel.h" +#include "cppmyth/MythEPGInfo.h" #include "cppmyth/MythConnection.h" #include "cppmyth/MythDatabase.h" #include "cppmyth/MythEventHandler.h" @@ -10,3 +11,4 @@ #include "cppmyth/MythSignal.h" #include "cppmyth/MythRecordingRule.h" #include "cppmyth/MythTimestamp.h" +#include "cppmyth/MythScheduleManager.h" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demux.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demux.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demux.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demux.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,584 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "platform/os.h" + +#include "libXBMC_pvr.h" +#include "xbmc_codec_types.h" + +#include "demux.h" +#include "client.h" + +extern "C" { +#include +}; + +#define LOGTAG "[DEMUX] " +#define POSMAP_PTS_INTERVAL (PTS_TIME_BASE * 2) // 2 secs + +using namespace PLATFORM; +using namespace ADDON; + +void DemuxLog(int level, char *msg) +{ + if (msg && level != DEMUX_DBG_NONE) + { + bool doLog = g_bExtraDebug; + addon_log_t loglevel = LOG_DEBUG; + switch (level) + { + case DEMUX_DBG_ERROR: + loglevel = LOG_ERROR; + doLog = true; + break; + case DEMUX_DBG_WARN: + case DEMUX_DBG_INFO: + loglevel = LOG_INFO; + break; + case DEMUX_DBG_DEBUG: + case DEMUX_DBG_PARSE: + case DEMUX_DBG_ALL: + loglevel = LOG_DEBUG; + break; + } + if (XBMC && doLog) + XBMC->Log(loglevel, LOGTAG"%s", msg); + } +} + +Demux::Demux(MythRecorder &recorder) + : CThread() + , m_recorder(recorder) + , m_channel(1) + , m_av_buf_size(AV_BUFFER_SIZE) + , m_av_pos(0) + , m_av_buf(NULL) + , m_av_rbs(NULL) + , m_av_rbe(NULL) + , m_AVContext(NULL) + , m_mainStreamPID(0xffff) + , m_DTS(PTS_UNSET) + , m_PTS(PTS_UNSET) + , m_pinTime(0) + , m_curTime(0) + , m_endTime(0) + , m_isChangePlaced(false) +{ + m_av_buf = (unsigned char*)malloc(sizeof(*m_av_buf) * (m_av_buf_size + 1)); + if (m_av_buf) + { + m_av_rbs = m_av_buf; + m_av_rbe = m_av_buf; + + if (g_bExtraDebug) + demux_dbg_level(DEMUX_DBG_DEBUG); + else + demux_dbg_level(DEMUX_DBG_ERROR); + demux_set_dbg_msgcallback(DemuxLog); + + m_AVContext = new AVContext(this, m_av_pos, m_channel); + + CreateThread(true); + } + else + { + XBMC->Log(LOG_ERROR, LOGTAG"alloc AV buffer failed"); + } +} + +Demux::~Demux() +{ + StopThread(0); + Flush(); + + // Free AV context + if (m_AVContext) + SAFE_DELETE(m_AVContext); + // Free AV buffer + if (m_av_buf) + { + if (g_bExtraDebug) + XBMC->Log(LOG_DEBUG, LOGTAG"free AV buffer: allocated size was %zu", m_av_buf_size); + free(m_av_buf); + m_av_buf = NULL; + } +} + +/* + * Implement our AV reader + */ +const unsigned char* Demux::ReadAV(uint64_t pos, size_t n) +{ + // out of range + if (n > m_av_buf_size) + return NULL; + + // Already read ? + size_t sz = m_av_rbe - m_av_buf; + if (pos < m_av_pos || pos > (m_av_pos + sz)) + { + // seek and reset buffer + int64_t newpos = m_recorder.LiveTVSeek((int64_t)pos, WHENCE_SET); + if (newpos < 0) + return NULL; + m_av_pos = (uint64_t)newpos; + m_av_rbs = m_av_rbe = m_av_buf; + } + else + { + // move to the desired pos in buffer + m_av_rbs = m_av_buf + (size_t)(pos - m_av_pos); + } + + size_t dataread = m_av_rbe - m_av_rbs; + if (dataread >= n) + return m_av_rbs; + + memmove(m_av_buf, m_av_rbs, dataread); + m_av_rbs = m_av_buf; + m_av_rbe = m_av_rbs + dataread; + m_av_pos = pos; + unsigned int len = (unsigned int)(m_av_buf_size - dataread); + int wait = 5000; + while (wait > 0 && !IsStopped() ) + { + int ret = m_recorder.ReadLiveTV(m_av_rbe, len); + if (ret > 0) + { + m_av_rbe += ret; + dataread += ret; + len -= ret; + } + if (dataread >= n || ret < 0) + break; + wait -= 1000; + usleep(100000); + } + return dataread >= n ? m_av_rbs : NULL; +} + +void* Demux::Process() +{ + if (!m_AVContext) + { + XBMC->Log(LOG_ERROR, LOGTAG"%s: no AVContext", __FUNCTION__); + return NULL; + } + + int ret = 0; + + while (!IsStopped()) + { + { + CLockObject lock(m_mutex); + ret = m_AVContext->TSResync(); + } + if (ret != AVCONTEXT_CONTINUE) + break; + + ret = m_AVContext->ProcessTSPacket(); + + if (m_AVContext->HasPIDStreamData()) + { + ElementaryStream::STREAM_PKT pkt; + while (get_stream_data(&pkt)) + { + if (pkt.streamChange && update_pvr_stream(pkt.pid)) + push_stream_change(); + DemuxPacket* dxp = stream_pvr_data(&pkt); + if (dxp) + push_stream_data(dxp); + } + } + if (m_AVContext->HasPIDPayload()) + { + ret = m_AVContext->ProcessTSPayload(); + if (ret == AVCONTEXT_PROGRAM_CHANGE) + { + populate_pvr_streams(); + push_stream_change(); + } + } + + if (ret < 0) + XBMC->Log(LOG_NOTICE, LOGTAG"%s: error %d", __FUNCTION__, ret); + + if (ret == AVCONTEXT_TS_ERROR) + m_AVContext->Shift(); + else + m_AVContext->GoNext(); + } + + XBMC->Log(LOG_DEBUG, LOGTAG"%s: stopped with status %d", __FUNCTION__, ret); + return NULL; +} + +bool Demux::GetStreamProperties(PVR_STREAM_PROPERTIES* props) +{ + int wait = 0; + // Wait until setup is completed for all streams + while (IsRunning() && !m_nosetup.empty() && wait < 20) + { + if (g_bExtraDebug) + XBMC->Log(LOG_DEBUG, LOGTAG"%s: waiting until setup will be completed ...", __FUNCTION__); + usleep(100000); + wait++; + } + if (!m_nosetup.empty()) + XBMC->Log(LOG_ERROR, LOGTAG"%s: incomplete setup", __FUNCTION__); + + CLockObject lock(m_mutex); + m_isChangePlaced = false; + return m_streams.GetProperties(props); +} + +void Demux::Flush(void) +{ + CLockObject lock(m_mutex); + DemuxPacket* pkt(NULL); + while (m_demuxPacketBuffer.Pop(pkt)) + PVR->FreeDemuxPacket(pkt); +} + +void Demux::Abort() +{ + StopThread(0); +} + +DemuxPacket* Demux::Read() +{ + DemuxPacket* packet(NULL); + if (m_demuxPacketBuffer.Pop(packet, 100)) + return packet; + return PVR->AllocateDemuxPacket(0); +} + +bool Demux::SeekTime(int time, bool backwards, double* startpts) +{ + // Current PTS must be valid to estimate offset + if (m_PTS == PTS_UNSET) + return false; + // time is in MSEC not PTS_TIME_BASE. Rescale time to PTS (90Khz) + uint64_t pts = (uint64_t)time * PTS_TIME_BASE / 1000; + // Compute offset from current PTS + int64_t offset = (int64_t)(pts - m_PTS); + // Limit offset to deal with invalid request or PTS discontinuity + // Backwards : Limiting offset to +6 secs + // Forwards : Limiting offset to -6 secs + if (backwards) + offset = std::min(offset, (int64_t)(PTS_TIME_BASE * 6)); + else + offset = std::max(offset, (int64_t)(PTS_TIME_BASE * (-6))); + // Compute desired time position + int64_t desired = m_curTime + offset; + + CLockObject lock(m_mutex); + + std::map::const_iterator it; + if (offset < 0) + { + it = m_posmap.upper_bound(desired); + if (backwards && it != m_posmap.begin()) + --it; + } + else + { + it = m_posmap.upper_bound(desired); + // On end shift back if possible + if (it == m_posmap.end() && it != m_posmap.begin()) + --it; + } + + if (g_bExtraDebug) + XBMC->Log(LOG_DEBUG, LOGTAG"%s: bw:%d tm:%d tm_pts:%"PRIu64" c_pts:%"PRIu64" offset:%+6.3f c_tm:%+6.3f n_tm:%+6.3f", __FUNCTION__, + backwards, time, pts, m_PTS, (double)offset / PTS_TIME_BASE, (double)m_curTime / PTS_TIME_BASE, (double)desired / PTS_TIME_BASE); + + if (it != m_posmap.end()) + { + int64_t new_time = it->first; + uint64_t new_pos = it->second.av_pos; + uint64_t new_pts = it->second.av_pts; + XBMC->Log(LOG_DEBUG, LOGTAG"seek to %"PRId64" pts=%"PRIu64, new_time, new_pts); + + Flush(); + m_AVContext->GoPosition(new_pos); + m_AVContext->ResetPackets(); + m_curTime = m_pinTime = new_time; + m_DTS = m_PTS = new_pts; + } + + *startpts = (double)m_PTS * DVD_TIME_BASE / PTS_TIME_BASE; + + return true; +} + +int Demux::GetPlayingTime() +{ + double time_ms = (double)m_curTime * 1000 / PTS_TIME_BASE; + if (time_ms > INT_MAX) + return INT_MAX; + return (int)time_ms; +} + +bool Demux::get_stream_data(ElementaryStream::STREAM_PKT* pkt) +{ + ElementaryStream* es = m_AVContext->GetPIDStream(); + if (!es) + return false; + + if (!es->GetStreamPacket(pkt)) + return false; + + if (pkt->duration > 180000) + { + pkt->duration = 0; + } + else if (pkt->pid == m_mainStreamPID) + { + // Fill duration map for main stream + m_curTime += pkt->duration; + if (m_curTime >= m_pinTime) + { + m_pinTime += POSMAP_PTS_INTERVAL; + if (m_curTime > m_endTime) + { + AV_POSMAP_ITEM item; + item.av_pts = pkt->pts; + item.av_pos = m_AVContext->GetPosition(); + m_posmap.insert(std::make_pair(m_curTime, item)); + m_endTime = m_curTime; + } + } + // Sync main DTS & PTS + m_DTS = pkt->dts; + m_PTS = pkt->pts; + } + return true; +} + +void Demux::reset_posmap() +{ + if (m_posmap.empty()) + return; + + { + CLockObject lock(m_mutex); + m_posmap.clear(); + m_pinTime = m_curTime = m_endTime = 0; + } +} + +static inline int stream_identifier(int composition_id, int ancillary_id) +{ + return ((composition_id & 0xff00) >> 8) + | ((composition_id & 0xff) << 8) + | ((ancillary_id & 0xff00) << 16) + | ((ancillary_id & 0xff) << 24); +} + +static void recode_language(const char* muxLanguage, char* strLanguage) +{ + /* + * While XBMC does'nt support them. + * Fix unsupported language codes (EN 300 468 Annex F & J) + * 'qaa' : Original audio + * 'qad','NAR' : Audio Description + */ + if (strncmp(muxLanguage, "qaa", 3) == 0 || + strncmp(muxLanguage, "qad", 3) == 0 || + strncmp(muxLanguage, "NAR", 3) == 0) + { + strLanguage[0] = 0; + strLanguage[1] = 0; + strLanguage[2] = 0; + strLanguage[3] = 0; + } + else + { + strLanguage[0] = muxLanguage[0]; + strLanguage[1] = muxLanguage[1]; + strLanguage[2] = muxLanguage[2]; + strLanguage[3] = 0; + } +} + +void Demux::populate_pvr_streams() +{ + CLockObject Lock(m_mutex); + + uint16_t mainPid = 0xffff; + int mainType = XBMC_CODEC_TYPE_UNKNOWN; + std::vector new_streams; + const std::vector es_streams = m_AVContext->GetStreams(); + for (std::vector::const_iterator it = es_streams.begin(); it != es_streams.end(); it++) + { + const char* codec_name = (*it)->GetStreamCodecName(); + xbmc_codec_t codec = CODEC->GetCodecByName(codec_name); + if (codec.codec_type != XBMC_CODEC_TYPE_UNKNOWN) + { + // Find the main stream: + // The best candidate would be the first video. Else the first audio + switch (mainType) + { + case XBMC_CODEC_TYPE_VIDEO: + break; + case XBMC_CODEC_TYPE_AUDIO: + if (codec.codec_type != XBMC_CODEC_TYPE_VIDEO) + break; + default: + mainPid = (*it)->pid; + mainType = codec.codec_type; + } + + XbmcPvrStream new_stream; + m_streams.GetStreamData((*it)->pid, &new_stream); + + new_stream.iCodecId = codec.codec_id; + new_stream.iCodecType = codec.codec_type; + recode_language((*it)->stream_info.language, new_stream.strLanguage); + new_stream.iIdentifier = stream_identifier((*it)->stream_info.composition_id, (*it)->stream_info.ancillary_id); + new_stream.iFPSScale = (*it)->stream_info.fps_scale; + new_stream.iFPSRate = (*it)->stream_info.fps_rate; + new_stream.iHeight = (*it)->stream_info.height; + new_stream.iWidth = (*it)->stream_info.width; + new_stream.fAspect = (*it)->stream_info.aspect; + new_stream.iChannels = (*it)->stream_info.channels; + new_stream.iSampleRate = (*it)->stream_info.sample_rate; + new_stream.iBlockAlign = (*it)->stream_info.block_align; + new_stream.iBitRate = (*it)->stream_info.bit_rate; + new_stream.iBitsPerSample = (*it)->stream_info.bits_Per_sample; + + new_streams.push_back(new_stream); + m_AVContext->StartStreaming((*it)->pid); + + // Add stream to no setup set + if (!(*it)->has_stream_info) + m_nosetup.insert((*it)->pid); + + if (g_bExtraDebug) + XBMC->Log(LOG_DEBUG, LOGTAG"%s: register PES %.4x %s", __FUNCTION__, (*it)->pid, codec_name); + } + } + m_streams.UpdateStreams(new_streams); + // Renew main stream + m_mainStreamPID = mainPid; +} + +bool Demux::update_pvr_stream(uint16_t pid) +{ + ElementaryStream* es = m_AVContext->GetStream(pid); + if (!es) + return false; + + if (g_bExtraDebug) + XBMC->Log(LOG_DEBUG, LOGTAG"%s: update info PES %.4x %s", __FUNCTION__, es->pid, es->GetStreamCodecName()); + + CLockObject Lock(m_mutex); + + XbmcPvrStream* stream = m_streams.GetStreamById(es->pid); + if (stream) + { + recode_language(es->stream_info.language, stream->strLanguage); + stream->iIdentifier = stream_identifier(es->stream_info.composition_id, es->stream_info.ancillary_id); + stream->iFPSScale = es->stream_info.fps_scale; + stream->iFPSRate = es->stream_info.fps_rate; + stream->iHeight = es->stream_info.height; + stream->iWidth = es->stream_info.width; + stream->fAspect = es->stream_info.aspect; + stream->iChannels = es->stream_info.channels; + stream->iSampleRate = es->stream_info.sample_rate; + stream->iBlockAlign = es->stream_info.block_align; + stream->iBitRate = es->stream_info.bit_rate; + stream->iBitsPerSample = es->stream_info.bits_Per_sample; + + if (es->has_stream_info) + { + // Now stream is setup. Remove it from no setup set + std::set::iterator it = m_nosetup.find(es->pid); + if (it != m_nosetup.end()) + { + m_nosetup.erase(it); + if (m_nosetup.empty()) + XBMC->Log(LOG_DEBUG, LOGTAG"%s: setup is completed", __FUNCTION__); + } + } + return true; + } + return false; +} + +void Demux::push_stream_change() +{ + if (!m_isChangePlaced) + { + bool ret = false; + DemuxPacket* dxp = PVR->AllocateDemuxPacket(0); + dxp->iStreamId = DMX_SPECIALID_STREAMCHANGE; + + while (!IsStopped() && !(ret = m_demuxPacketBuffer.Push(dxp))) + usleep(100000); + if (!ret) + PVR->FreeDemuxPacket(dxp); + else + { + m_isChangePlaced = true; + XBMC->Log(LOG_DEBUG, LOGTAG"%s: done", __FUNCTION__); + } + } +} + +DemuxPacket* Demux::stream_pvr_data(ElementaryStream::STREAM_PKT* pkt) +{ + if (!pkt) + return NULL; + + DemuxPacket* dxp = PVR->AllocateDemuxPacket(pkt->size); + if (dxp) + { + if (pkt->size > 0 && pkt->data) + memcpy(dxp->pData, pkt->data, pkt->size); + + dxp->iSize = pkt->size; + dxp->duration = (double)pkt->duration * DVD_TIME_BASE / PTS_TIME_BASE; + if (pkt->dts != PTS_UNSET) + dxp->dts = (double)pkt->dts * DVD_TIME_BASE / PTS_TIME_BASE; + else + dxp->dts = DVD_NOPTS_VALUE; + if (pkt->pts != PTS_UNSET) + dxp->pts = (double)pkt->pts * DVD_TIME_BASE / PTS_TIME_BASE; + else + dxp->pts = DVD_NOPTS_VALUE; + + dxp->iStreamId = m_streams.GetStreamId((unsigned int)pkt->pid); + } + return dxp; +} + +void Demux::push_stream_data(DemuxPacket* dxp) +{ + if (dxp) + { + bool ret = false; + while (!IsStopped() && !(ret = m_demuxPacketBuffer.Push(dxp))) + usleep(100000); + if (!ret) + PVR->FreeDemuxPacket(dxp); + } +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/bitstream.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/bitstream.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/bitstream.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/bitstream.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,143 @@ +/* + * Copyright (C) 2005-2012 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include +#include +#include "bitstream.h" + +cBitstream::cBitstream(uint8_t *data, int bits) +{ + m_data = data; + m_offset = 0; + m_len = bits; + m_error = false; +} + +void cBitstream::setBitstream(uint8_t *data, int bits) +{ + m_data = data; + m_offset = 0; + m_len = bits; + m_error = false; +} + +void cBitstream::skipBits(int num) +{ + m_offset += num; +} + +unsigned int cBitstream::readBits(int num) +{ + int r = 0; + + while(num > 0) + { + if(m_offset >= m_len) + { + m_error = true; + return 0; + } + + num--; + + if(m_data[m_offset / 8] & (1 << (7 - (m_offset & 7)))) + r |= 1 << num; + + m_offset++; + } + return r; +} + +unsigned int cBitstream::showBits(int num) +{ + int r = 0; + int offs = m_offset; + + while(num > 0) + { + if(offs >= m_len) + { + m_error = true; + return 0; + } + + num--; + + if(m_data[offs / 8] & (1 << (7 - (offs & 7)))) + r |= 1 << num; + + offs++; + } + return r; +} + +unsigned int cBitstream::readGolombUE(int maxbits) +{ + int lzb = -1; + int bits = 0; + + for(int b = 0; !b; lzb++, bits++) + { + if (bits > maxbits) + return 0; + b = readBits1(); + } + + return (1 << lzb) - 1 + readBits(lzb); +} + +signed int cBitstream::readGolombSE() +{ + int v, pos; + v = readGolombUE(); + if(v == 0) + return 0; + + pos = (v & 1); + v = (v + 1) >> 1; + return pos ? v : -v; +} + + +unsigned int cBitstream::remainingBits() +{ + return m_len - m_offset; +} + + +void cBitstream::putBits(int val, int num) +{ + while(num > 0) { + if(m_offset >= m_len) + { + m_error = true; + return; + } + + num--; + + if(val & (1 << num)) + m_data[m_offset / 8] |= 1 << (7 - (m_offset & 7)); + else + m_data[m_offset / 8] &= ~(1 << (7 - (m_offset & 7))); + + m_offset++; + } +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/bitstream.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/bitstream.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/bitstream.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/bitstream.h 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2005-2012 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#ifndef BITSTREAM_H +#define BITSTREAM_H + +#include + +class cBitstream +{ +private: + uint8_t *m_data; + int m_offset; + int m_len; + bool m_error; + +public: + cBitstream(uint8_t *data, int bits); + + void setBitstream(uint8_t *data, int bits); + void skipBits(int num); + unsigned int readBits(int num); + unsigned int showBits(int num); + unsigned int readBits1() { return readBits(1); } + unsigned int readGolombUE(int maxbits = 32); + signed int readGolombSE(); + unsigned int remainingBits(); + void putBits(int val, int num); + int length() { return m_len; } + bool isError() { return m_error; } +}; + +#endif /* BITSTREAM_H */ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/common.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/common.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/common.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/common.h 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2013 Jean-Luc Barriere + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#ifndef COMMON_H +#define COMMON_H + +#include +#include +#include +#include +#include +#include + +extern "C" { +#include "debug.h" +} + +#define ES_INIT_BUFFER_SIZE 64000 +#define ES_MAX_BUFFER_SIZE 1048576 +#define MAX_RESYNC_SIZE 65536 +#define PTS_MASK 0x1ffffffffLL +#define PTS_UNSET 0x1ffffffffLL +#define PTS_TIME_BASE 90000LL +#define RESCALE_TIME_BASE 1000000LL + +#endif /* COMMON_H */ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/debug.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/debug.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/debug.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/debug.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2013 Jean-Luc Barriere + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#include "debug.h" + +extern "C" { + +#include +#include +#include +#include + +typedef struct { + const char *name; + int cur_level; + int (*selector)(int plevel, int slevel); + void (*msg_callback)(int level, char *msg); +} demux_debug_ctx_t; + +#define DEMUX_DEBUG_CTX_INIT(n,l,s) { n, l, s, NULL } + +static demux_debug_ctx_t demux_debug_ctx = DEMUX_DEBUG_CTX_INIT("demuxer", DEMUX_DBG_NONE, NULL); + +/** + * Set the debug level to be used for the subsystem + * \param ctx the subsystem debug context to use + * \param level the debug level for the subsystem + * \return an integer subsystem id used for future interaction + */ +static inline void +__demux_dbg_setlevel(demux_debug_ctx_t *ctx, int level) +{ + if (ctx != NULL) { + ctx->cur_level = level; + } +} + +/** + * Generate a debug message at a given debug level + * \param ctx the subsystem debug context to use + * \param level the debug level of the debug message + * \param fmt a printf style format string for the message + * \param ... arguments to the format + */ +static inline void +__demux_dbg(demux_debug_ctx_t *ctx, int level, const char *fmt, va_list ap) +{ + char msg[4096]; + int len; + if (!ctx) { + return; + } + if ((ctx->selector && ctx->selector(level, ctx->cur_level)) || + (!ctx->selector && (level <= ctx->cur_level))) { + len = snprintf(msg, sizeof(msg), "(%s)", ctx->name); + vsnprintf(msg + len, sizeof(msg)-len, fmt, ap); + if (ctx->msg_callback) { + ctx->msg_callback(level, msg); + } else { + fwrite(msg, strlen(msg), 1, stdout); + } + } +} + +void demux_dbg_level(int l) +{ + __demux_dbg_setlevel(&demux_debug_ctx, l); +} + +void demux_dbg_all() +{ + __demux_dbg_setlevel(&demux_debug_ctx, DEMUX_DBG_ALL); +} + +void demux_dbg_none() +{ + __demux_dbg_setlevel(&demux_debug_ctx, DEMUX_DBG_NONE); +} + +void demux_dbg(int level, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + __demux_dbg(&demux_debug_ctx, level, fmt, ap); + va_end(ap); +} + +void demux_set_dbg_msgcallback(void (*msgcb)(int level, char *)) +{ + demux_debug_ctx.msg_callback = msgcb; +} + +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/debug.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/debug.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/debug.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/debug.h 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2013 Jean-Luc Barriere + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#ifndef DEBUG_H +#define DEBUG_H + +#define DEMUX_DBG_NONE -1 +#define DEMUX_DBG_ERROR 0 +#define DEMUX_DBG_WARN 1 +#define DEMUX_DBG_INFO 2 +#define DEMUX_DBG_DEBUG 3 +#define DEMUX_DBG_PARSE 4 +#define DEMUX_DBG_ALL 6 + +#ifdef _MSC_VER +#define snprintf _snprintf +#endif + +extern "C" { +extern void demux_dbg_level(int l); +extern void demux_dbg_all(void); +extern void demux_dbg_none(void); +extern void demux_dbg(int level, const char *fmt, ...); +extern void demux_set_dbg_msgcallback(void (*msgcb)(int level,char *)); +} + +#endif /* DEBUG_H */ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/elementaryStream.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/elementaryStream.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/elementaryStream.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/elementaryStream.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,279 @@ +/* + * Copyright (C) 2013 Jean-Luc Barriere + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#include "elementaryStream.h" + +ElementaryStream::ElementaryStream(uint16_t pes_pid) + : pid(pes_pid) + , stream_type(STREAM_TYPE_UNKNOWN) + , c_dts(PTS_UNSET) + , c_pts(PTS_UNSET) + , p_dts(PTS_UNSET) + , p_pts(PTS_UNSET) + , has_stream_info(false) + , es_alloc_init(ES_INIT_BUFFER_SIZE) + , es_buf(NULL) + , es_alloc(0) + , es_len(0) + , es_consumed(0) + , es_pts_pointer(0) + , es_parsed(0) + , es_found_frame(false) +{ + memset(&stream_info, 0, sizeof(ElementaryStream::STREAM_INFO)); +} + +ElementaryStream::~ElementaryStream(void) +{ + if (es_buf) + { + demux_dbg(DEMUX_DBG_DEBUG, "free stream buffer %.4x: allocated size was %zu\n", pid, es_alloc); + free(es_buf); + es_buf = NULL; + } +} + +void ElementaryStream::Reset(void) +{ + ClearBuffer(); + es_found_frame = false; +} + +void ElementaryStream::ClearBuffer() +{ + es_len = es_consumed = es_pts_pointer = es_parsed = 0; +} + +int ElementaryStream::Append(const unsigned char* buf, size_t len, bool new_pts) +{ + // Mark position where current pts become applicable + if (new_pts) + es_pts_pointer = es_len; + + if (es_buf && es_consumed) + { + if (es_consumed < es_len) + { + memmove(es_buf, es_buf + es_consumed, es_len - es_consumed); + es_len -= es_consumed; + es_parsed -= es_consumed; + if (es_pts_pointer > es_consumed) + es_pts_pointer -= es_consumed; + else + es_pts_pointer = 0; + + es_consumed = 0; + } + else + ClearBuffer(); + } + if (es_len + len > es_alloc) + { + if (es_alloc >= ES_MAX_BUFFER_SIZE) + return -ENOMEM; + + size_t n = (es_alloc ? (es_alloc + len) * 2 : es_alloc_init); + if (n > ES_MAX_BUFFER_SIZE) + n = ES_MAX_BUFFER_SIZE; + + demux_dbg(DEMUX_DBG_DEBUG, "realloc buffer size to %zu for stream %.4x\n", n, pid); + unsigned char* p = es_buf; + es_buf = (unsigned char*)realloc(es_buf, n * sizeof(*es_buf)); + if (es_buf) + { + es_alloc = n; + } + else + { + free(p); + es_alloc = 0; + es_len = 0; + return -ENOMEM; + } + } + + if (!es_buf) + return -ENOMEM; + + memcpy(es_buf + es_len, buf, len); + es_len += len; + + return 0; +} + +const char* ElementaryStream::GetStreamCodecName(STREAM_TYPE stream_type) +{ + switch (stream_type) + { + case STREAM_TYPE_VIDEO_MPEG1: + return "mpeg1video"; + case STREAM_TYPE_VIDEO_MPEG2: + return "mpeg2video"; + case STREAM_TYPE_AUDIO_MPEG1: + return "mp1"; + case STREAM_TYPE_AUDIO_MPEG2: + return "mp2"; + case STREAM_TYPE_AUDIO_AAC: + return "aac"; + case STREAM_TYPE_VIDEO_MPEG4: + return "mpeg4video"; + case STREAM_TYPE_VIDEO_H264: + return "h264"; + case STREAM_TYPE_VIDEO_VC1: + return "vc1"; + case STREAM_TYPE_AUDIO_LPCM: + return "lpcm"; + case STREAM_TYPE_AUDIO_AC3: + return "ac3"; + case STREAM_TYPE_AUDIO_EAC3: + return "eac3"; + case STREAM_TYPE_AUDIO_DTS: + return "dts"; + case STREAM_TYPE_DVB_TELETEXT: + return "teletext"; + case STREAM_TYPE_DVB_SUBTITLE: + return "dvbsub"; + default: + return "data"; + } +} + +const char* ElementaryStream::GetStreamCodecName() const +{ + return GetStreamCodecName(stream_type); +} + +bool ElementaryStream::GetStreamPacket(STREAM_PKT* pkt) +{ + ResetStreamPacket(pkt); + Parse(pkt); + if (pkt->data) + return true; + return false; +} + +void ElementaryStream::Parse(STREAM_PKT* pkt) +{ + // No parser: pass-through + if (es_consumed < es_len) + { + es_consumed = es_parsed = es_len; + pkt->pid = pid; + pkt->size = es_consumed; + pkt->data = es_buf; + pkt->dts = c_dts; + pkt->pts = c_pts; + if (c_dts == PTS_UNSET || p_dts == PTS_UNSET) + pkt->duration = 0; + else + pkt->duration = c_dts - p_dts; + pkt->streamChange = false; + } +} + +void ElementaryStream::ResetStreamPacket(STREAM_PKT* pkt) +{ + pkt->pid = 0xffff; + pkt->size = 0; + pkt->data = NULL; + pkt->dts = PTS_UNSET; + pkt->pts = PTS_UNSET; + pkt->duration = 0; + pkt->streamChange = false; +} + +uint64_t ElementaryStream::Rescale(uint64_t a, uint64_t b, uint64_t c) +{ + uint64_t r = c / 2; + + if (b <= INT_MAX && c <= INT_MAX) + { + if (a <= INT_MAX) + return (a * b + r) / c; + else + return a / c * b + (a % c * b + r) / c; + } + else + { + uint64_t a0 = a & 0xFFFFFFFF; + uint64_t a1 = a >> 32; + uint64_t b0 = b & 0xFFFFFFFF; + uint64_t b1 = b >> 32; + uint64_t t1 = a0 * b1 + a1 * b0; + uint64_t t1a = t1 << 32; + + a0 = a0 * b0 + t1a; + a1 = a1 * b1 + (t1 >> 32) + (a0 < t1a); + a0 += r; + a1 += a0 < r; + + for (int i = 63; i >= 0; i--) + { + a1 += a1 + ((a0 >> i) & 1); + t1 += t1; + if (c <= a1) + { + a1 -= c; + t1++; + } + } + return t1; + } +} + +bool ElementaryStream::SetVideoInformation(int FpsScale, int FpsRate, int Height, int Width, float Aspect) +{ + bool ret = false; + if ((stream_info.fps_scale != FpsScale) || + (stream_info.fps_rate != FpsRate) || + (stream_info.height != Height) || + (stream_info.width != Width) || + (stream_info.aspect != Aspect)) + ret = true; + + stream_info.fps_scale = FpsScale; + stream_info.fps_rate = FpsRate; + stream_info.height = Height; + stream_info.width = Width; + stream_info.aspect = Aspect; + + has_stream_info = true; + return ret; +} + +bool ElementaryStream::SetAudioInformation(int Channels, int SampleRate, int BitRate, int BitsPerSample, int BlockAlign) +{ + bool ret = false; + if ((stream_info.channels != Channels) || + (stream_info.sample_rate != SampleRate) || + (stream_info.block_align != BlockAlign) || + (stream_info.bit_rate != BitRate) || + (stream_info.bits_Per_sample != BitsPerSample)) + ret = true; + + stream_info.channels = Channels; + stream_info.sample_rate = SampleRate; + stream_info.block_align = BlockAlign; + stream_info.bit_rate = BitRate; + stream_info.bits_Per_sample = BitsPerSample; + + has_stream_info = true; + return ret; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/elementaryStream.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/elementaryStream.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/elementaryStream.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/elementaryStream.h 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2013 Jean-Luc Barriere + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#ifndef ELEMENTARYSTREAM_H +#define ELEMENTARYSTREAM_H + +#include "common.h" + +enum STREAM_TYPE +{ + STREAM_TYPE_UNKNOWN = 0, + STREAM_TYPE_VIDEO_MPEG1, + STREAM_TYPE_VIDEO_MPEG2, + STREAM_TYPE_AUDIO_MPEG1, + STREAM_TYPE_AUDIO_MPEG2, + STREAM_TYPE_PRIVATE_DATA, + STREAM_TYPE_AUDIO_AAC, + STREAM_TYPE_VIDEO_MPEG4, + STREAM_TYPE_VIDEO_H264, + STREAM_TYPE_VIDEO_VC1, + STREAM_TYPE_AUDIO_LPCM, + STREAM_TYPE_AUDIO_AC3, + STREAM_TYPE_AUDIO_EAC3, + STREAM_TYPE_AUDIO_DTS, + STREAM_TYPE_DVB_TELETEXT, + STREAM_TYPE_DVB_SUBTITLE +}; + +class ElementaryStream +{ +public: + ElementaryStream(uint16_t pes_pid); + virtual ~ElementaryStream(); + virtual void Reset(); + void ClearBuffer(); + int Append(const unsigned char* buf, size_t len, bool new_pts = false); + const char* GetStreamCodecName() const; + static const char* GetStreamCodecName(STREAM_TYPE stream_type); + + uint16_t pid; + STREAM_TYPE stream_type; + uint64_t c_dts; ///< current MPEG stream DTS (decode time for video) + uint64_t c_pts; ///< current MPEG stream PTS (presentation time for audio and video) + uint64_t p_dts; ///< previous MPEG stream DTS (decode time for video) + uint64_t p_pts; ///< previous MPEG stream PTS (presentation time for audio and video) + + bool has_stream_info; ///< true if stream info is completed else it requires parsing of iframe + + struct STREAM_INFO + { + char language[4]; + int composition_id; + int ancillary_id; + int fps_scale; + int fps_rate; + int height; + int width; + float aspect; + int channels; + int sample_rate; + int block_align; + int bit_rate; + int bits_Per_sample; + } stream_info; + + typedef struct + { + uint16_t pid; + size_t size; + const unsigned char* data; + uint64_t dts; + uint64_t pts; + uint64_t duration; + bool streamChange; + } STREAM_PKT; + + bool GetStreamPacket(STREAM_PKT* pkt); + virtual void Parse(STREAM_PKT* pkt); + +protected: + void ResetStreamPacket(STREAM_PKT* pkt); + uint64_t Rescale(uint64_t a, uint64_t b, uint64_t c); + bool SetVideoInformation(int FpsScale, int FpsRate, int Height, int Width, float Aspect); + bool SetAudioInformation(int Channels, int SampleRate, int BitRate, int BitsPerSample, int BlockAlign); + + size_t es_alloc_init; ///< Initial allocation of memory for buffer + unsigned char* es_buf; ///< The Pointer to buffer + size_t es_alloc; ///< Allocated size of memory for buffer + size_t es_len; ///< Size of data in buffer + size_t es_consumed; ///< Consumed payload. Will be erased on next append + size_t es_pts_pointer; ///< Position in buffer where current PTS becomes applicable + size_t es_parsed; ///< Parser: Last processed position in buffer + bool es_found_frame; ///< Parser: Found frame +}; + +#endif /* ELEMENTARYSTREAM_H */ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_AAC.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_AAC.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_AAC.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_AAC.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,253 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include + +#include "ES_AAC.h" +#include "bitstream.h" + +static int aac_sample_rates[16] = +{ + 96000, 88200, 64000, 48000, 44100, 32000, + 24000, 22050, 16000, 12000, 11025, 8000, 7350 +}; + + +ES_AAC::ES_AAC(uint16_t pes_pid) + : ElementaryStream(pes_pid) +{ + m_Configured = false; + m_FrameLengthType = 0; + m_PTS = 0; + m_DTS = 0; + m_FrameSize = 0; + m_SampleRate = 0; + m_Channels = 0; + m_BitRate = 0; + m_AudioMuxVersion_A = 0; + es_alloc_init = 1920*2; + Reset(); +} + +ES_AAC::~ES_AAC() +{ +} + +void ES_AAC::Parse(STREAM_PKT* pkt) +{ + int p = es_parsed; + int l; + while ((l = es_len - p) > 8) + { + if (FindHeaders(es_buf + p, l) < 0) + break; + p++; + } + es_parsed = p; + + if (es_found_frame && l >= m_FrameSize) + { + bool streamChange = SetAudioInformation(m_Channels, m_SampleRate, m_BitRate, 0, 0); + pkt->pid = pid; + pkt->data = &es_buf[p]; + pkt->size = m_FrameSize; + pkt->duration = 1024 * 90000 / m_SampleRate; + pkt->dts = m_DTS; + pkt->pts = m_PTS; + pkt->streamChange = streamChange; + + es_consumed = p + m_FrameSize; + es_parsed = es_consumed; + es_found_frame = false; + } +} + +int ES_AAC::FindHeaders(uint8_t *buf, int buf_size) +{ + if (es_found_frame) + return -1; + + uint8_t *buf_ptr = buf; + + // STREAM_TYPE_AUDIO_AACLATM + if ((buf_ptr[0] == 0x56 && (buf_ptr[1] & 0xE0) == 0xE0)) + { + // TODO + if (buf_size < 16) + return -1; + + cBitstream bs(buf_ptr, 16 * 8); + bs.skipBits(11); + m_FrameSize = bs.readBits(13) + 3; + if (!ParseLATMAudioMuxElement(&bs)) + return 0; + + es_found_frame = true; + m_DTS = c_pts; + m_PTS = c_pts; + c_pts += 90000 * 1024 / m_SampleRate; + return -1; + } + //STREAM_TYPE_AUDIO_AACADTS + else if(buf_ptr[0] == 0xFF && (buf_ptr[1] & 0xF0) == 0xF0) + { + // need at least 7 bytes for header + if (buf_size < 7) + return -1; + + cBitstream bs(buf_ptr, 9 * 8); + bs.skipBits(15); + + // check if CRC is present, means header is 9 byte long + int noCrc = bs.readBits(1); + if (!noCrc && (buf_size < 9)) + return -1; + + bs.skipBits(2); // profile + int SampleRateIndex = bs.readBits(4); + bs.skipBits(1); // private + m_Channels = bs.readBits(3); + bs.skipBits(4); + + m_FrameSize = bs.readBits(13); + m_SampleRate = aac_sample_rates[SampleRateIndex & 0x0E]; + + es_found_frame = true; + m_DTS = c_pts; + m_PTS = c_pts; + c_pts += 90000 * 1024 / m_SampleRate; + return -1; + } + return 0; +} + +bool ES_AAC::ParseLATMAudioMuxElement(cBitstream *bs) +{ + if (!bs->readBits1()) + ReadStreamMuxConfig(bs); + + if (!m_Configured) + return false; + + return true; +} + +void ES_AAC::ReadStreamMuxConfig(cBitstream *bs) +{ + int AudioMuxVersion = bs->readBits(1); + m_AudioMuxVersion_A = 0; + if (AudioMuxVersion) // audioMuxVersion + m_AudioMuxVersion_A = bs->readBits(1); + + if(m_AudioMuxVersion_A) + return; + + if (AudioMuxVersion) + LATMGetValue(bs); // taraFullness + + bs->skipBits(1); // allStreamSameTimeFraming = 1 + bs->skipBits(6); // numSubFrames = 0 + bs->skipBits(4); // numPrograms = 0 + + // for each program (which there is only on in DVB) + bs->skipBits(3); // numLayer = 0 + + // for each layer (which there is only on in DVB) + if (!AudioMuxVersion) + ReadAudioSpecificConfig(bs); + else + return; + + // these are not needed... perhaps + m_FrameLengthType = bs->readBits(3); + switch (m_FrameLengthType) + { + case 0: + bs->readBits(8); + break; + case 1: + bs->readBits(9); + break; + case 3: + case 4: + case 5: + bs->readBits(6); // celp_table_index + break; + case 6: + case 7: + bs->readBits(1); // hvxc_table_index + break; + } + + if (bs->readBits(1)) + { // other data? + int esc; + do + { + esc = bs->readBits(1); + bs->skipBits(8); + } while (esc); + } + + if (bs->readBits(1)) // crc present? + bs->skipBits(8); // config_crc + m_Configured = true; +} + +void ES_AAC::ReadAudioSpecificConfig(cBitstream *bs) +{ + int aot = bs->readBits(5); + if (aot == 31) + aot = 32 + bs->readBits(6); + + int SampleRateIndex = bs->readBits(4); + + if (SampleRateIndex == 0xf) + m_SampleRate = bs->readBits(24); + else + m_SampleRate = aac_sample_rates[SampleRateIndex & 0xf]; + + m_Channels = bs->readBits(4); + + if (aot == 5) { // AOT_SBR + if (bs->readBits(4) == 0xf) { // extensionSamplingFrequencyIndex + bs->skipBits(24); + } + aot = bs->readBits(5); // this is the main object type (i.e. non-extended) + if (aot == 31) + aot = 32 + bs->readBits(6); + } + + if(aot != 2) + return; + + bs->skipBits(1); //framelen_flag + if (bs->readBits1()) // depends_on_coder + bs->skipBits(14); + + if (bs->readBits(1)) // ext_flag + bs->skipBits(1); // ext3_flag +} + +void ES_AAC::Reset() +{ + ElementaryStream::Reset(); + m_Configured = false; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_AAC.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_AAC.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_AAC.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_AAC.h 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#ifndef ES_AAC_H +#define ES_AAC_H + +#include "elementaryStream.h" +#include "bitstream.h" + +class ES_AAC : public ElementaryStream +{ +private: + int m_SampleRate; + int m_Channels; + int m_BitRate; + int m_FrameSize; + + int64_t m_PTS; /* pts of the current frame */ + int64_t m_DTS; /* dts of the current frame */ + + bool m_Configured; + int m_AudioMuxVersion_A; + int m_FrameLengthType; + + int FindHeaders(uint8_t *buf, int buf_size); + bool ParseLATMAudioMuxElement(cBitstream *bs); + void ReadStreamMuxConfig(cBitstream *bs); + void ReadAudioSpecificConfig(cBitstream *bs); + uint32_t LATMGetValue(cBitstream *bs) { return bs->readBits(bs->readBits(2) * 8); } + +public: + ES_AAC(uint16_t pes_pid); + virtual ~ES_AAC(); + + virtual void Parse(STREAM_PKT* pkt); + virtual void Reset(); +}; + +#endif /* ES_AAC_H */ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_AC3.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_AC3.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_AC3.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_AC3.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,251 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include +#include + +#include "ES_AC3.h" +#include "bitstream.h" + +using namespace std; + +#define AC3_HEADER_SIZE 7 + +/** Channel mode (audio coding mode) */ +typedef enum +{ + AC3_CHMODE_DUALMONO = 0, + AC3_CHMODE_MONO, + AC3_CHMODE_STEREO, + AC3_CHMODE_3F, + AC3_CHMODE_2F1R, + AC3_CHMODE_3F1R, + AC3_CHMODE_2F2R, + AC3_CHMODE_3F2R +} AC3ChannelMode; + +/* possible frequencies */ +const uint16_t AC3SampleRateTable[3] = { 48000, 44100, 32000 }; + +/* possible bitrates */ +const uint16_t AC3BitrateTable[19] = { + 32, 40, 48, 56, 64, 80, 96, 112, 128, + 160, 192, 224, 256, 320, 384, 448, 512, 576, 640 +}; + +const uint8_t AC3ChannelsTable[8] = { + 2, 1, 2, 3, 3, 4, 4, 5 +}; + +const uint16_t AC3FrameSizeTable[38][3] = { + { 64, 69, 96 }, + { 64, 70, 96 }, + { 80, 87, 120 }, + { 80, 88, 120 }, + { 96, 104, 144 }, + { 96, 105, 144 }, + { 112, 121, 168 }, + { 112, 122, 168 }, + { 128, 139, 192 }, + { 128, 140, 192 }, + { 160, 174, 240 }, + { 160, 175, 240 }, + { 192, 208, 288 }, + { 192, 209, 288 }, + { 224, 243, 336 }, + { 224, 244, 336 }, + { 256, 278, 384 }, + { 256, 279, 384 }, + { 320, 348, 480 }, + { 320, 349, 480 }, + { 384, 417, 576 }, + { 384, 418, 576 }, + { 448, 487, 672 }, + { 448, 488, 672 }, + { 512, 557, 768 }, + { 512, 558, 768 }, + { 640, 696, 960 }, + { 640, 697, 960 }, + { 768, 835, 1152 }, + { 768, 836, 1152 }, + { 896, 975, 1344 }, + { 896, 976, 1344 }, + { 1024, 1114, 1536 }, + { 1024, 1115, 1536 }, + { 1152, 1253, 1728 }, + { 1152, 1254, 1728 }, + { 1280, 1393, 1920 }, + { 1280, 1394, 1920 }, +}; + +const uint8_t EAC3Blocks[4] = { + 1, 2, 3, 6 +}; + +typedef enum { + EAC3_FRAME_TYPE_INDEPENDENT = 0, + EAC3_FRAME_TYPE_DEPENDENT, + EAC3_FRAME_TYPE_AC3_CONVERT, + EAC3_FRAME_TYPE_RESERVED +} EAC3FrameType; + +ES_AC3::ES_AC3(uint16_t pid) + : ElementaryStream(pid) +{ + m_PTS = 0; + m_DTS = 0; + m_FrameSize = 0; + m_SampleRate = 0; + m_Channels = 0; + m_BitRate = 0; + es_alloc_init = 1920*2; +} + +ES_AC3::~ES_AC3() +{ +} + +void ES_AC3::Parse(STREAM_PKT* pkt) +{ + int p = es_parsed; + int l; + while ((l = es_len - p) > 8) + { + if (FindHeaders(es_buf + p, l) < 0) + break; + p++; + } + es_parsed = p; + + if (es_found_frame && l >= m_FrameSize) + { + bool streamChange = SetAudioInformation(m_Channels, m_SampleRate, m_BitRate, 0, 0); + pkt->pid = pid; + pkt->data = &es_buf[p]; + pkt->size = m_FrameSize; + pkt->duration = 90000 * 1536 / m_SampleRate; + pkt->dts = m_DTS; + pkt->pts = m_PTS; + pkt->streamChange = streamChange; + + es_consumed = p + m_FrameSize; + es_parsed = es_consumed; + es_found_frame = false; + } +} + +int ES_AC3::FindHeaders(uint8_t *buf, int buf_size) +{ + if (es_found_frame) + return -1; + + if (buf_size < 9) + return -1; + + uint8_t *buf_ptr = buf; + + if ((buf_ptr[0] == 0x0b && buf_ptr[1] == 0x77)) + { + cBitstream bs(buf_ptr + 2, AC3_HEADER_SIZE * 8); + + // read ahead to bsid to distinguish between AC-3 and E-AC-3 + int bsid = bs.showBits(29) & 0x1F; + if (bsid > 16) + return 0; + + if (bsid <= 10) + { + // Normal AC-3 + bs.skipBits(16); + int fscod = bs.readBits(2); + int frmsizecod = bs.readBits(6); + bs.skipBits(5); // skip bsid, already got it + bs.skipBits(3); // skip bitstream mode + int acmod = bs.readBits(3); + + if (fscod == 3 || frmsizecod > 37) + return 0; + + if (acmod == AC3_CHMODE_STEREO) + { + bs.skipBits(2); // skip dsurmod + } + else + { + if ((acmod & 1) && acmod != AC3_CHMODE_MONO) + bs.skipBits(2); + if (acmod & 4) + bs.skipBits(2); + } + int lfeon = bs.readBits(1); + + int srShift = max(bsid, 8) - 8; + m_SampleRate = AC3SampleRateTable[fscod] >> srShift; + m_BitRate = (AC3BitrateTable[frmsizecod>>1] * 1000) >> srShift; + m_Channels = AC3ChannelsTable[acmod] + lfeon; + m_FrameSize = AC3FrameSizeTable[frmsizecod][fscod] * 2; + } + else + { + // Enhanced AC-3 + int frametype = bs.readBits(2); + if (frametype == EAC3_FRAME_TYPE_RESERVED) + return 0; + + bs.readBits(3); // int substreamid + + m_FrameSize = (bs.readBits(11) + 1) << 1; + if (m_FrameSize < AC3_HEADER_SIZE) + return 0; + + int numBlocks = 6; + int sr_code = bs.readBits(2); + if (sr_code == 3) + { + int sr_code2 = bs.readBits(2); + if (sr_code2 == 3) + return 0; + m_SampleRate = AC3SampleRateTable[sr_code2] / 2; + } + else + { + numBlocks = EAC3Blocks[bs.readBits(2)]; + m_SampleRate = AC3SampleRateTable[sr_code]; + } + + int channelMode = bs.readBits(3); + int lfeon = bs.readBits(1); + + m_BitRate = (uint32_t)(8.0 * m_FrameSize * m_SampleRate / (numBlocks * 256.0)); + m_Channels = AC3ChannelsTable[channelMode] + lfeon; + } + es_found_frame = true; + m_DTS = c_pts; + m_PTS = c_pts; + c_pts += 90000 * 1536 / m_SampleRate; + return -1; + } + return 0; +} + +void ES_AC3::Reset() +{ + ElementaryStream::Reset(); +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_AC3.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_AC3.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_AC3.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_AC3.h 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#ifndef ES_AC3_H +#define ES_AC3_H + +#include "elementaryStream.h" + +class ES_AC3 : public ElementaryStream +{ +private: + int m_SampleRate; + int m_Channels; + int m_BitRate; + int m_FrameSize; + + int64_t m_PTS; /* pts of the current frame */ + int64_t m_DTS; /* dts of the current frame */ + + int FindHeaders(uint8_t *buf, int buf_size); + +public: + ES_AC3(uint16_t pid); + virtual ~ES_AC3(); + + virtual void Parse(STREAM_PKT* pkt); + virtual void Reset(); +}; + +#endif /* ES_AC3_H */ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_h264.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_h264.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_h264.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_h264.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,583 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include + +#include "ES_h264.h" +#include "bitstream.h" + +static const int h264_lev2cpbsize[][2] = +{ + {10, 175}, + {11, 500}, + {12, 1000}, + {13, 2000}, + {20, 2000}, + {21, 4000}, + {22, 4000}, + {30, 10000}, + {31, 14000}, + {32, 20000}, + {40, 25000}, + {41, 62500}, + {42, 62500}, + {50, 135000}, + {51, 240000}, + {-1, -1}, +}; + +ES_h264::ES_h264(uint16_t pes_pid) + : ElementaryStream(pes_pid) +{ + m_Height = 0; + m_Width = 0; + m_FPS = 25; + m_FpsScale = 0; + m_FrameDuration = 0; + m_vbvDelay = -1; + m_vbvSize = 0; + m_PixelAspect.den = 1; + m_PixelAspect.num = 0; + m_DTS = 0; + m_PTS = 0; + es_alloc_init = 240000; + Reset(); +} + +ES_h264::~ES_h264() +{ +} + +void ES_h264::Parse(STREAM_PKT* pkt) +{ + int frame_ptr = es_consumed; + int p = es_parsed; + uint32_t startcode = m_StartCode; + bool frameComplete = false; + int l; + while ((l = es_len - p) > 3) + { + if ((startcode & 0xffffff00) == 0x00000100) + { + if (Parse_H264(startcode, p, frameComplete) < 0) + { + break; + } + } + startcode = startcode << 8 | es_buf[p++]; + } + es_parsed = p; + m_StartCode = startcode; + + if (frameComplete) + { + if (!m_NeedSPS && !m_NeedIFrame) + { + double PAR = (double)m_PixelAspect.num/(double)m_PixelAspect.den; + double DAR = (PAR * m_Width) / m_Height; + demux_dbg(DEMUX_DBG_PARSE, "H.264 SPS: PAR %i:%i\n", m_PixelAspect.num, m_PixelAspect.den); + demux_dbg(DEMUX_DBG_PARSE, "H.264 SPS: DAR %.2f\n", DAR); + if (m_FpsScale == 0) + { + m_FpsScale = static_cast(Rescale(c_dts - p_dts, RESCALE_TIME_BASE, PTS_TIME_BASE)); + } + bool streamChange = SetVideoInformation(m_FpsScale, RESCALE_TIME_BASE, m_Height, m_Width, static_cast(DAR)); + pkt->pid = pid; + pkt->size = es_consumed - frame_ptr; + pkt->data = &es_buf[frame_ptr]; + pkt->dts = m_DTS; + pkt->pts = m_PTS; + pkt->duration = c_dts - p_dts; + pkt->streamChange = streamChange; + } + m_StartCode = 0xffffffff; + es_parsed = es_consumed; + es_found_frame = false; + } +} + +void ES_h264::Reset() +{ + ElementaryStream::Reset(); + m_StartCode = 0xffffffff; + m_NeedIFrame = true; + m_NeedSPS = true; + m_NeedPPS = true; + memset(&m_streamData, 0, sizeof(m_streamData)); +} + +int ES_h264::Parse_H264(uint32_t startcode, int buf_ptr, bool &complete) +{ + int len = es_len - buf_ptr; + uint8_t *buf = es_buf + buf_ptr; + + switch(startcode & 0x9f) + { + case 1: + case 2: + case 3: + case 4: + case 5: + { + if (m_NeedSPS || m_NeedPPS) + { + es_found_frame = true; + return 0; + } + // need at least 32 bytes for parsing nal + if (len < 32) + return -1; + h264_private::VCL_NAL vcl; + memset(&vcl, 0, sizeof(h264_private::VCL_NAL)); + vcl.nal_ref_idc = startcode & 0x60; + vcl.nal_unit_type = startcode & 0x1F; + if (!Parse_SLH(buf, len, vcl)) + return 0; + + // check for the beginning of a new access unit + if (es_found_frame && IsFirstVclNal(vcl)) + { + complete = true; + es_consumed = buf_ptr - 4; + return -1; + } + + if (!es_found_frame) + { + if (buf_ptr - 4 >= (int)es_pts_pointer) + { + m_DTS = c_dts; + m_PTS = c_pts; + } + else + { + m_DTS = p_dts; + m_PTS = p_pts; + } + } + + m_streamData.vcl_nal = vcl; + es_found_frame = true; + break; + } + + case NAL_SEI: + if (es_found_frame) + { + complete = true; + es_consumed = buf_ptr - 4; + return -1; + } + break; + + case NAL_SPS: + { + if (es_found_frame) + { + complete = true; + es_consumed = buf_ptr - 4; + return -1; + } + // TODO: how big is SPS? + if (len < 256) + return -1; + if (!Parse_SPS(buf, len)) + return 0; + + m_NeedSPS = false; + break; + } + + case NAL_PPS: + { + if (es_found_frame) + { + complete = true; + es_consumed = buf_ptr - 4; + return -1; + } + // TODO: how big is PPS + if (len < 64) + return -1; + if (!Parse_PPS(buf, len)) + return 0; + m_NeedPPS = false; + break; + } + + case NAL_AUD: + if (es_found_frame && (p_dts != PTS_UNSET)) + { + complete = true; + es_consumed = buf_ptr - 4; + return -1; + } + break; + + case NAL_END_SEQ: + if (es_found_frame) + { + complete = true; + es_consumed = buf_ptr; + return -1; + } + break; + + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + if (es_found_frame) + { + complete = true; + es_consumed = buf_ptr - 4; + return -1; + } + break; + + default: + break; + } + + return 0; +} + +bool ES_h264::Parse_PPS(uint8_t *buf, int len) +{ + cBitstream bs(buf, len*8); + + int pps_id = bs.readGolombUE(); + int sps_id = bs.readGolombUE(); + m_streamData.pps[pps_id].sps = sps_id; + bs.readBits1(); + m_streamData.pps[pps_id].pic_order_present_flag = bs.readBits1(); + return true; +} + +bool ES_h264::Parse_SLH(uint8_t *buf, int len, h264_private::VCL_NAL &vcl) +{ + cBitstream bs(buf, len*8); + + bs.readGolombUE(); /* first_mb_in_slice */ + int slice_type = bs.readGolombUE(); + + if (slice_type > 4) + slice_type -= 5; /* Fixed slice type per frame */ + + switch (slice_type) + { + case 0: + break; + case 1: + break; + case 2: + m_NeedIFrame = false; + break; + default: + return false; + } + + int pps_id = bs.readGolombUE(); + int sps_id = m_streamData.pps[pps_id].sps; + if (m_streamData.sps[sps_id].cbpsize == 0) + return false; + + m_vbvSize = m_streamData.sps[sps_id].cbpsize; + m_vbvDelay = -1; + + vcl.pic_parameter_set_id = pps_id; + vcl.frame_num = bs.readBits(m_streamData.sps[sps_id].log2_max_frame_num); + if (!m_streamData.sps[sps_id].frame_mbs_only_flag) + { + vcl.field_pic_flag = bs.readBits1(); + // interlaced +// if (vcl.field_pic_flag) +// m_FPS *= 2; + } + if (vcl.field_pic_flag) + vcl.bottom_field_flag = bs.readBits1(); + + if (vcl.nal_unit_type == 5) + vcl.idr_pic_id = bs.readGolombUE(); + if (m_streamData.sps[sps_id].pic_order_cnt_type == 0) + { + vcl.pic_order_cnt_lsb = bs.readBits(m_streamData.sps[sps_id].log2_max_pic_order_cnt_lsb); + if(m_streamData.pps[pps_id].pic_order_present_flag && !vcl.field_pic_flag) + vcl.delta_pic_order_cnt_bottom = bs.readGolombSE(); + } + if(m_streamData.sps[sps_id].pic_order_cnt_type == 1 && + !m_streamData.sps[sps_id].delta_pic_order_always_zero_flag ) + { + vcl.delta_pic_order_cnt_0 = bs.readGolombSE(); + if(m_streamData.pps[pps_id].pic_order_present_flag && !vcl.field_pic_flag ) + vcl.delta_pic_order_cnt_1 = bs.readGolombSE(); + } + + vcl.pic_order_cnt_type = m_streamData.sps[sps_id].pic_order_cnt_type; + + return true; +} + +bool ES_h264::Parse_SPS(uint8_t *buf, int len) +{ + cBitstream bs(buf, len*8); + unsigned int tmp, frame_mbs_only; + int cbpsize = -1; + + int profile_idc = bs.readBits(8); + /* constraint_set0_flag = bs.readBits1(); */ + /* constraint_set1_flag = bs.readBits1(); */ + /* constraint_set2_flag = bs.readBits1(); */ + /* constraint_set3_flag = bs.readBits1(); */ + /* reserved = bs.readBits(4); */ + bs.skipBits(8); + int level_idc = bs.readBits(8); + unsigned int seq_parameter_set_id = bs.readGolombUE(9); + + unsigned int i = 0; + while (h264_lev2cpbsize[i][0] != -1) + { + if (h264_lev2cpbsize[i][0] >= level_idc) + { + cbpsize = h264_lev2cpbsize[i][1]; + break; + } + i++; + } + if (cbpsize < 0) + return false; + + memset(&m_streamData.sps[seq_parameter_set_id], 0, sizeof(h264_private::SPS)); + m_streamData.sps[seq_parameter_set_id].cbpsize = cbpsize * 125; /* Convert from kbit to bytes */ + + if( profile_idc == 100 || profile_idc == 110 || + profile_idc == 122 || profile_idc == 244 || profile_idc == 44 || + profile_idc == 83 || profile_idc == 86 || profile_idc == 118 || + profile_idc == 128 ) + { + int chroma_format_idc = bs.readGolombUE(9); /* chroma_format_idc */ + if(chroma_format_idc == 3) + bs.skipBits(1); /* residual_colour_transform_flag */ + bs.readGolombUE(); /* bit_depth_luma - 8 */ + bs.readGolombUE(); /* bit_depth_chroma - 8 */ + bs.skipBits(1); /* transform_bypass */ + if (bs.readBits1()) /* seq_scaling_matrix_present */ + { + for (int i = 0; i < ((chroma_format_idc != 3) ? 8 : 12); i++) + { + if (bs.readBits1()) /* seq_scaling_list_present */ + { + int last = 8, next = 8, size = (i<6) ? 16 : 64; + for (int j = 0; j < size; j++) + { + if (next) + next = (last + bs.readGolombSE()) & 0xff; + last = !next ? last: next; + } + } + } + } + } + + int log2_max_frame_num_minus4 = bs.readGolombUE(); /* log2_max_frame_num - 4 */ + m_streamData.sps[seq_parameter_set_id].log2_max_frame_num = log2_max_frame_num_minus4 + 4; + int pic_order_cnt_type = bs.readGolombUE(9); + m_streamData.sps[seq_parameter_set_id].pic_order_cnt_type = pic_order_cnt_type; + if (pic_order_cnt_type == 0) + { + int log2_max_pic_order_cnt_lsb_minus4 = bs.readGolombUE(); /* log2_max_poc_lsb - 4 */ + m_streamData.sps[seq_parameter_set_id].log2_max_pic_order_cnt_lsb = log2_max_pic_order_cnt_lsb_minus4 + 4; + } + else if (pic_order_cnt_type == 1) + { + m_streamData.sps[seq_parameter_set_id].delta_pic_order_always_zero_flag = bs.readBits1(); + bs.readGolombSE(); /* offset_for_non_ref_pic */ + bs.readGolombSE(); /* offset_for_top_to_bottom_field */ + tmp = bs.readGolombUE(); /* num_ref_frames_in_pic_order_cnt_cycle */ + for (unsigned int i = 0; i < tmp; i++) + bs.readGolombSE(); /* offset_for_ref_frame[i] */ + } + else if(pic_order_cnt_type != 2) + { + /* Illegal poc */ + return false; + } + + bs.readGolombUE(9); /* ref_frames */ + bs.skipBits(1); /* gaps_in_frame_num_allowed */ + m_Width /* mbs */ = bs.readGolombUE() + 1; + m_Height /* mbs */ = bs.readGolombUE() + 1; + frame_mbs_only = bs.readBits1(); + m_streamData.sps[seq_parameter_set_id].frame_mbs_only_flag = frame_mbs_only; + demux_dbg(DEMUX_DBG_PARSE, "H.264 SPS: pic_width: %u mbs\n", (unsigned) m_Width); + demux_dbg(DEMUX_DBG_PARSE, "H.264 SPS: pic_height: %u mbs\n", (unsigned) m_Height); + demux_dbg(DEMUX_DBG_PARSE, "H.264 SPS: frame only flag: %d\n", frame_mbs_only); + + m_Width *= 16; + m_Height *= 16 * (2-frame_mbs_only); + + if (!frame_mbs_only) + { + if (bs.readBits1()) /* mb_adaptive_frame_field_flag */ + demux_dbg(DEMUX_DBG_PARSE, "H.264 SPS: MBAFF\n"); + } + bs.skipBits(1); /* direct_8x8_inference_flag */ + if (bs.readBits1()) /* frame_cropping_flag */ + { + uint32_t crop_left = bs.readGolombUE(); + uint32_t crop_right = bs.readGolombUE(); + uint32_t crop_top = bs.readGolombUE(); + uint32_t crop_bottom = bs.readGolombUE(); + demux_dbg(DEMUX_DBG_PARSE, "H.264 SPS: cropping %d %d %d %d\n", crop_left, crop_top, crop_right, crop_bottom); + + m_Width -= 2*(crop_left + crop_right); + if (frame_mbs_only) + m_Height -= 2*(crop_top + crop_bottom); + else + m_Height -= 4*(crop_top + crop_bottom); + } + + /* VUI parameters */ + m_PixelAspect.num = 0; + if (bs.readBits1()) /* vui_parameters_present flag */ + { + if (bs.readBits1()) /* aspect_ratio_info_present */ + { + uint32_t aspect_ratio_idc = bs.readBits(8); + demux_dbg(DEMUX_DBG_PARSE, "H.264 SPS: aspect_ratio_idc %d\n", aspect_ratio_idc); + + if (aspect_ratio_idc == 255 /* Extended_SAR */) + { + m_PixelAspect.num = bs.readBits(16); /* sar_width */ + m_PixelAspect.den = bs.readBits(16); /* sar_height */ + demux_dbg(DEMUX_DBG_PARSE, "H.264 SPS: -> sar %dx%d\n", m_PixelAspect.num, m_PixelAspect.den); + } + else + { + static const mpeg_rational_t aspect_ratios[] = + { /* page 213: */ + /* 0: unknown */ + {0, 1}, + /* 1...16: */ + { 1, 1}, {12, 11}, {10, 11}, {16, 11}, { 40, 33}, {24, 11}, {20, 11}, {32, 11}, + {80, 33}, {18, 11}, {15, 11}, {64, 33}, {160, 99}, { 4, 3}, { 3, 2}, { 2, 1} + }; + + if (aspect_ratio_idc < sizeof(aspect_ratios)/sizeof(aspect_ratios[0])) + { + memcpy(&m_PixelAspect, &aspect_ratios[aspect_ratio_idc], sizeof(mpeg_rational_t)); + demux_dbg(DEMUX_DBG_PARSE, "H.264 SPS: PAR %d / %d\n", m_PixelAspect.num, m_PixelAspect.den); + } + else + { + demux_dbg(DEMUX_DBG_PARSE, "H.264 SPS: aspect_ratio_idc out of range !\n"); + } + } + } + if (bs.readBits1()) // overscan + { + bs.readBits1(); // overscan_appropriate_flag + } + if (bs.readBits1()) // video_signal_type_present_flag + { + bs.readBits(3); // video_format + bs.readBits1(); // video_full_range_flag + if (bs.readBits1()) // colour_description_present_flag + { + bs.readBits(8); // colour_primaries + bs.readBits(8); // transfer_characteristics + bs.readBits(8); // matrix_coefficients + } + } + + if (bs.readBits1()) // chroma_loc_info_present_flag + { + bs.readGolombUE(); // chroma_sample_loc_type_top_field + bs.readGolombUE(); // chroma_sample_loc_type_bottom_field + } + + if (bs.readBits1()) // timing_info_present_flag + { +// uint32_t num_units_in_tick = bs.readBits(32); +// uint32_t time_scale = bs.readBits(32); +// int fixed_frame_rate = bs.readBits1(); +// if (num_units_in_tick > 0) +// m_FPS = time_scale / (num_units_in_tick * 2); + } + } + + demux_dbg(DEMUX_DBG_PARSE, "H.264 SPS: -> video size %dx%d, aspect %d:%d\n", m_Width, m_Height, m_PixelAspect.num, m_PixelAspect.den); + return true; +} + +bool ES_h264::IsFirstVclNal(h264_private::VCL_NAL &vcl) +{ + if (m_streamData.vcl_nal.frame_num != vcl.frame_num) + return true; + + if (m_streamData.vcl_nal.pic_parameter_set_id != vcl.pic_parameter_set_id) + return true; + + if (m_streamData.vcl_nal.field_pic_flag != vcl.field_pic_flag) + return true; + + if (m_streamData.vcl_nal.field_pic_flag && vcl.field_pic_flag) + { + if (m_streamData.vcl_nal.bottom_field_flag != vcl.bottom_field_flag) + return true; + } + + if (m_streamData.vcl_nal.nal_ref_idc == 0 || vcl.nal_ref_idc == 0) + { + if (m_streamData.vcl_nal.nal_ref_idc != vcl.nal_ref_idc) + return true; + } + + if (m_streamData.vcl_nal.pic_order_cnt_type == 0 && vcl.pic_order_cnt_type == 0) + { + if (m_streamData.vcl_nal.pic_order_cnt_lsb != vcl.pic_order_cnt_lsb) + return true; + if (m_streamData.vcl_nal.delta_pic_order_cnt_bottom != vcl.delta_pic_order_cnt_bottom) + return true; + } + + if (m_streamData.vcl_nal.pic_order_cnt_type == 1 && vcl.pic_order_cnt_type == 1) + { + if (m_streamData.vcl_nal.delta_pic_order_cnt_0 != vcl.delta_pic_order_cnt_0) + return true; + if (m_streamData.vcl_nal.delta_pic_order_cnt_1 != vcl.delta_pic_order_cnt_1) + return true; + } + + if (m_streamData.vcl_nal.nal_unit_type == 5 || vcl.nal_unit_type == 5) + { + if (m_streamData.vcl_nal.nal_unit_type != vcl.nal_unit_type) + return true; + } + + if (m_streamData.vcl_nal.nal_unit_type == 5 && vcl.nal_unit_type == 5) + { + if (m_streamData.vcl_nal.idr_pic_id != vcl.idr_pic_id) + return true; + } + return false; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_h264.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_h264.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_h264.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_h264.h 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#ifndef ES_H264_H +#define ES_H264_H + +#include "elementaryStream.h" + +class ES_h264 : public ElementaryStream +{ +private: + typedef struct h264_private + { + struct SPS + { + int frame_duration; + int cbpsize; + int pic_order_cnt_type; + int frame_mbs_only_flag; + int log2_max_frame_num; + int log2_max_pic_order_cnt_lsb; + int delta_pic_order_always_zero_flag; + } sps[256]; + + struct PPS + { + int sps; + int pic_order_present_flag; + } pps[256]; + + struct VCL_NAL + { + int frame_num; // slice + int pic_parameter_set_id; // slice + int field_pic_flag; // slice + int bottom_field_flag; // slice + int delta_pic_order_cnt_bottom; // slice + int delta_pic_order_cnt_0; // slice + int delta_pic_order_cnt_1; // slice + int pic_order_cnt_lsb; // slice + int idr_pic_id; // slice + int nal_unit_type; + int nal_ref_idc; // start code + int pic_order_cnt_type; // sps + } vcl_nal; + + } h264_private_t; + + typedef struct mpeg_rational_s { + int num; + int den; + } mpeg_rational_t; + + enum + { + NAL_SLH = 0x01, // Slice Header + NAL_SEI = 0x06, // Supplemental Enhancement Information + NAL_SPS = 0x07, // Sequence Parameter Set + NAL_PPS = 0x08, // Picture Parameter Set + NAL_AUD = 0x09, // Access Unit Delimiter + NAL_END_SEQ = 0x0A // End of Sequence + }; + + uint32_t m_StartCode; + bool m_NeedIFrame; + bool m_NeedSPS; + bool m_NeedPPS; + int m_Width; + int m_Height; + int m_FPS; + int m_FpsScale; + mpeg_rational_t m_PixelAspect; + int m_FrameDuration; + h264_private m_streamData; + int m_vbvDelay; /* -1 if CBR */ + int m_vbvSize; /* Video buffer size (in bytes) */ + int64_t m_DTS; + int64_t m_PTS; + + int Parse_H264(uint32_t startcode, int buf_ptr, bool &complete); + bool Parse_PPS(uint8_t *buf, int len); + bool Parse_SLH(uint8_t *buf, int len, h264_private::VCL_NAL &vcl); + bool Parse_SPS(uint8_t *buf, int len); + bool IsFirstVclNal(h264_private::VCL_NAL &vcl); + +public: + ES_h264(uint16_t pes_pid); + virtual ~ES_h264(); + + virtual void Parse(STREAM_PKT* pkt); + virtual void Reset(); +}; + +#endif /* ES_H264_H */ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_MPEGAudio.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_MPEGAudio.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_MPEGAudio.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_MPEGAudio.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include + +#include "ES_MPEGAudio.h" +#include "bitstream.h" + +const uint16_t FrequencyTable[3] = { 44100, 48000, 32000 }; +const uint16_t BitrateTable[2][3][15] = +{ + { + {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448 }, + {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384 }, + {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 } + }, + { + {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256}, + {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}, + {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160} + } +}; + +ES_MPEG2Audio::ES_MPEG2Audio(uint16_t pid) + : ElementaryStream(pid) +{ + m_PTS = 0; + m_DTS = 0; + m_FrameSize = 0; + m_SampleRate = 0; + m_Channels = 0; + m_BitRate = 0; + es_alloc_init = 2048; +} + +ES_MPEG2Audio::~ES_MPEG2Audio() +{ +} + +void ES_MPEG2Audio::Parse(STREAM_PKT* pkt) +{ + int p = es_parsed; + int l; + while ((l = es_len - p) > 3) + { + if (FindHeaders(es_buf + p, l) < 0) + break; + p++; + } + es_parsed = p; + + if (es_found_frame && l >= m_FrameSize) + { + bool streamChange = SetAudioInformation(m_Channels, m_SampleRate, m_BitRate, 0, 0); + pkt->pid = pid; + pkt->data = &es_buf[p]; + pkt->size = m_FrameSize; + pkt->duration = 90000 * 1152 / m_SampleRate; + pkt->dts = m_DTS; + pkt->pts = m_PTS; + pkt->streamChange = streamChange; + + es_consumed = p + m_FrameSize; + es_parsed = es_consumed; + es_found_frame = false; + } +} + +int ES_MPEG2Audio::FindHeaders(uint8_t *buf, int buf_size) +{ + if (es_found_frame) + return -1; + + if (buf_size < 4) + return -1; + + uint8_t *buf_ptr = buf; + + if ((buf_ptr[0] == 0xFF && (buf_ptr[1] & 0xE0) == 0xE0)) + { + cBitstream bs(buf_ptr, 4 * 8); + bs.skipBits(11); // syncword + + int audioVersion = bs.readBits(2); + if (audioVersion == 1) + return 0; + int mpeg2 = !(audioVersion & 1); + int mpeg25 = !(audioVersion & 3); + + int layer = bs.readBits(2); + if (layer == 0) + return 0; + layer = 4 - layer; + + bs.skipBits(1); // protetion bit + int bitrate_index = bs.readBits(4); + if (bitrate_index == 15 || bitrate_index == 0) + return 0; + m_BitRate = BitrateTable[mpeg2][layer - 1][bitrate_index] * 1000; + + int sample_rate_index = bs.readBits(2); + if (sample_rate_index == 3) + return 0; + m_SampleRate = FrequencyTable[sample_rate_index] >> (mpeg2 + mpeg25); + + int padding = bs.readBits1(); + bs.skipBits(1); // private bit + int channel_mode = bs.readBits(2); + + if (channel_mode == 11) + m_Channels = 1; + else + m_Channels = 2; + + if (layer == 1) + m_FrameSize = (12 * m_BitRate / m_SampleRate + padding) * 4; + else + m_FrameSize = 144 * m_BitRate / m_SampleRate + padding; + + es_found_frame = true; + m_DTS = c_pts; + m_PTS = c_pts; + c_pts += 90000 * 1152 / m_SampleRate; + return -1; + } + return 0; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_MPEGAudio.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_MPEGAudio.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_MPEGAudio.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_MPEGAudio.h 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#ifndef ES_MPEGAUDIO_H +#define ES_MPEGAUDIO_H + +#include "elementaryStream.h" + +class ES_MPEG2Audio : public ElementaryStream +{ +private: + int m_SampleRate; + int m_Channels; + int m_BitRate; + int m_FrameSize; + + int64_t m_PTS; + int64_t m_DTS; + + int FindHeaders(uint8_t *buf, int buf_size); + +public: + ES_MPEG2Audio(uint16_t pid); + virtual ~ES_MPEG2Audio(); + + virtual void Parse(STREAM_PKT* pkt); +}; + +#endif /* ES_MPEGAUDIO_H */ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_MPEGVideo.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_MPEGVideo.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_MPEGVideo.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_MPEGVideo.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,278 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include + +#include "ES_MPEGVideo.h" +#include "bitstream.h" + +using namespace std; + +#define MPEG_PICTURE_START 0x00000100 +#define MPEG_SEQUENCE_START 0x000001b3 +#define MPEG_SEQUENCE_EXTENSION 0x000001b5 +#define MPEG_SLICE_S 0x00000101 +#define MPEG_SLICE_E 0x000001af + +#define PKT_I_FRAME 1 +#define PKT_P_FRAME 2 +#define PKT_B_FRAME 3 +#define PKT_NTYPES 4 + +/** + * MPEG2VIDEO frame duration table (in 90kHz clock domain) + */ +const unsigned int mpeg2video_framedurations[16] = { + 0, + 3753, + 3750, + 3600, + 3003, + 3000, + 1800, + 1501, + 1500, +}; + +ES_MPEG2Video::ES_MPEG2Video(uint16_t pid) + : ElementaryStream(pid) +{ + m_FrameDuration = 0; + m_vbvDelay = -1; + m_vbvSize = 0; + m_Height = 0; + m_Width = 0; + m_Dar = 0.0f; + m_DTS = 0; + m_PTS = 0; + m_AuDTS = 0; + m_AuPTS = 0; + m_AuPrevDTS = 0; + m_TemporalReference = 0; + m_TrLastTime = 0; + m_PicNumber = 0; + es_alloc_init = 80000; + Reset(); +} + +ES_MPEG2Video::~ES_MPEG2Video() +{ +} + +void ES_MPEG2Video::Parse(STREAM_PKT *pkt) +{ + int frame_ptr = es_consumed; + int p = es_parsed; + uint32_t startcode = m_StartCode; + bool frameComplete = false; + int l; + while ((l = es_len - p) > 3) + { + if ((startcode & 0xffffff00) == 0x00000100) + { + if (Parse_MPEG2Video(startcode, p, frameComplete) < 0) + { + break; + } + } + startcode = startcode << 8 | es_buf[p++]; + } + es_parsed = p; + m_StartCode = startcode; + + if (frameComplete) + { + if (!m_NeedSPS && !m_NeedIFrame) + { + int fpsScale = static_cast(Rescale(m_FrameDuration, RESCALE_TIME_BASE, PTS_TIME_BASE)); + bool streamChange = SetVideoInformation(fpsScale, RESCALE_TIME_BASE, m_Height, m_Width, m_Dar); + pkt->pid = pid; + pkt->size = es_consumed - frame_ptr; + pkt->data = &es_buf[frame_ptr]; + pkt->dts = m_DTS; + pkt->pts = m_PTS; + pkt->duration = m_FrameDuration; + pkt->streamChange = streamChange; + } + m_StartCode = 0xffffffff; + es_parsed = es_consumed; + es_found_frame = false; + } +} + +void ES_MPEG2Video::Reset() +{ + ElementaryStream::Reset(); + m_StartCode = 0xffffffff; + m_NeedIFrame = true; + m_NeedSPS = true; +} + +int ES_MPEG2Video::Parse_MPEG2Video(uint32_t startcode, int buf_ptr, bool &complete) +{ + int len = es_len - buf_ptr; + uint8_t *buf = es_buf + buf_ptr; + + switch (startcode & 0xFF) + { + case 0: // picture start + { + if (m_NeedSPS) + { + es_found_frame = true; + return 0; + } + if (es_found_frame) + { + complete = true; + es_consumed = buf_ptr - 4; + return -1; + } + if (len < 4) + return -1; + if (!Parse_MPEG2Video_PicStart(buf)) + return 0; + + if (!es_found_frame) + { + m_AuPrevDTS = m_AuDTS; + if (buf_ptr - 4 >= (int)es_pts_pointer) + { + m_AuDTS = c_dts; + m_AuPTS = c_pts; + } + else + { + m_AuDTS = p_dts; + m_AuPTS = p_pts; + } + } + if (m_AuPrevDTS == m_AuDTS) + { + m_DTS = m_AuDTS + m_PicNumber*m_FrameDuration; + m_PTS = m_AuPTS + (m_TemporalReference-m_TrLastTime)*m_FrameDuration; + } + else + { + m_PTS = m_AuPTS; + m_DTS = m_AuDTS; + m_PicNumber = 0; + m_TrLastTime = m_TemporalReference; + } + + m_PicNumber++; + es_found_frame = true; + break; + } + + case 0xb3: // Sequence start code + { + if (es_found_frame) + { + complete = true; + es_consumed = buf_ptr - 4; + return -1; + } + if (len < 8) + return -1; + if (!Parse_MPEG2Video_SeqStart(buf)) + return 0; + + break; + } + + case 0xb7: // sequence end + { + if (es_found_frame) + { + complete = true; + es_consumed = buf_ptr; + return -1; + } + break; + } + + default: + break; + } + + return 0; +} + +bool ES_MPEG2Video::Parse_MPEG2Video_SeqStart(uint8_t *buf) +{ + cBitstream bs(buf, 8 * 8); + + m_Width = bs.readBits(12); + m_Height = bs.readBits(12); + + // figure out Display Aspect Ratio + uint8_t aspect = bs.readBits(4); + + switch(aspect) + { + case 1: + m_Dar = 1.0f; + break; + case 2: + m_Dar = 4.0f/3.0f; + break; + case 3: + m_Dar = 16.0f/9.0f; + break; + case 4: + m_Dar = 2.21f; + break; + default: + demux_dbg(DEMUX_DBG_ERROR, "invalid / forbidden DAR in sequence header !\n"); + return false; + } + + m_FrameDuration = mpeg2video_framedurations[bs.readBits(4)]; + bs.skipBits(18); + bs.skipBits(1); + + m_vbvSize = bs.readBits(10) * 16 * 1024 / 8; + m_NeedSPS = false; + + return true; +} + +bool ES_MPEG2Video::Parse_MPEG2Video_PicStart(uint8_t *buf) +{ + cBitstream bs(buf, 4 * 8); + + m_TemporalReference = bs.readBits(10); /* temporal reference */ + + int pct = bs.readBits(3); + if (pct < PKT_I_FRAME || pct > PKT_B_FRAME) + return true; /* Illegal picture_coding_type */ + + if (pct == PKT_I_FRAME) + m_NeedIFrame = false; + + int vbvDelay = bs.readBits(16); /* vbv_delay */ + if (vbvDelay == 0xffff) + m_vbvDelay = -1; + else + m_vbvDelay = vbvDelay; + + return true; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_MPEGVideo.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_MPEGVideo.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_MPEGVideo.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_MPEGVideo.h 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#ifndef ES_MPEGVIDEO_H +#define ES_MPEGVIDEO_H + +#include +#include "elementaryStream.h" + +class ES_MPEG2Video : public ElementaryStream +{ +private: + uint32_t m_StartCode; + bool m_NeedIFrame; + bool m_NeedSPS; + int m_FrameDuration; + int m_vbvDelay; /* -1 if CBR */ + int m_vbvSize; /* Video buffer size (in bytes) */ + int m_Width; + int m_Height; + float m_Dar; + int64_t m_DTS; + int64_t m_PTS; + int64_t m_AuDTS, m_AuPTS, m_AuPrevDTS; + int m_TemporalReference; + int m_TrLastTime; + int m_PicNumber; + + int Parse_MPEG2Video(uint32_t startcode, int buf_ptr, bool &complete); + bool Parse_MPEG2Video_SeqStart(uint8_t *buf); + bool Parse_MPEG2Video_PicStart(uint8_t *buf); + +public: + ES_MPEG2Video(uint16_t pid); + virtual ~ES_MPEG2Video(); + + virtual void Parse(STREAM_PKT* pkt); + virtual void Reset(); +}; + +#endif /* ES_MPEGVIDEO_H */ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_Subtitle.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_Subtitle.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_Subtitle.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_Subtitle.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include + +#include "ES_Subtitle.h" + +ES_Subtitle::ES_Subtitle(uint16_t pid) + : ElementaryStream(pid) +{ + es_alloc_init = 4000; + has_stream_info = true; // doesn't provide stream info +} + +ES_Subtitle::~ES_Subtitle() +{ + +} + +void ES_Subtitle::Parse(STREAM_PKT* pkt) +{ + int l = es_len - es_parsed; + + if (l > 0) + { + if (l < 2 || es_buf[0] != 0x20 || es_buf[1] != 0x00) + { + Reset(); + return; + } + + if(es_buf[l-1] == 0xff) + { + pkt->pid = pid; + pkt->data = es_buf+2; + pkt->size = l-3; + pkt->duration = 0; + pkt->dts = c_dts; + pkt->pts = c_pts; + pkt->streamChange = false; + } + + es_parsed = es_consumed = es_len; + } +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_Subtitle.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_Subtitle.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_Subtitle.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_Subtitle.h 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#ifndef ES_SUBTITLE_H +#define ES_SUBTITLE_H + +#include "elementaryStream.h" + +class ES_Subtitle : public ElementaryStream +{ +public: + ES_Subtitle(uint16_t pid); + virtual ~ES_Subtitle(); + + virtual void Parse(STREAM_PKT* pkt); +}; + +#endif /* ES_SUBTITLE_H */ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_Teletext.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_Teletext.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_Teletext.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_Teletext.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include + +#include "ES_Teletext.h" + +ES_Teletext::ES_Teletext(uint16_t pid) + : ElementaryStream(pid) +{ + es_alloc_init = 4000; + has_stream_info = true; // doesn't provide stream info +} + +ES_Teletext::~ES_Teletext() +{ +} + +void ES_Teletext::Parse(STREAM_PKT* pkt) +{ + int l = es_len - es_parsed; + if (l < 1) + return; + + if (es_buf[0] < 0x10 || es_buf[0] > 0x1F) + { + Reset(); + return; + } + + pkt->pid = pid; + pkt->data = es_buf; + pkt->size = l; + pkt->duration = 0; + pkt->dts = c_dts; + pkt->pts = c_pts; + pkt->streamChange = false; + + es_parsed = es_consumed = es_len; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_Teletext.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_Teletext.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/ES_Teletext.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/ES_Teletext.h 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#ifndef ES_TELETEXT_H +#define ES_TELETEXT_H + +#include "elementaryStream.h" + +class ES_Teletext : public ElementaryStream +{ +public: + ES_Teletext(uint16_t pid); + virtual ~ES_Teletext(); + + virtual void Parse(STREAM_PKT* pkt); +}; + +#endif /* ES_TELETEXT_H */ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/tsDemuxer.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/tsDemuxer.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/tsDemuxer.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/tsDemuxer.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,1012 @@ +/* + * Copyright (C) 2013 Jean-Luc Barriere + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#include "tsDemuxer.h" +#include "elementaryStream.h" +#include "ES_MPEGVideo.h" +#include "ES_MPEGAudio.h" +#include "ES_h264.h" +#include "ES_AAC.h" +#include "ES_AC3.h" +#include "ES_Subtitle.h" +#include "ES_Teletext.h" + +using namespace PLATFORM; + +AVContext::AVContext(TSDemuxer* const demux, uint64_t pos, uint16_t channel) + : av_pos(pos) + , av_data_len(FLUTS_NORMAL_TS_PACKETSIZE) + , av_pkt_size(0) + , is_configured(false) + , channel(channel) + , pid(0xffff) + , transport_error(false) + , has_payload(false) + , payload_unit_start(false) + , discontinuity(false) + , payload(NULL) + , payload_len(0) + , packet(NULL) +{ + m_demux = demux; + memset(av_buf, 0, sizeof(av_buf)); +}; + +void AVContext::Reset(void) +{ + CLockObject lock(mutex); + + pid = 0xffff; + transport_error = false; + has_payload = false; + payload_unit_start = false; + discontinuity = false; + payload = NULL; + payload_len = 0; + packet = NULL; +} + +uint16_t AVContext::GetPID() const +{ + return pid; +} + +PACKET_TYPE AVContext::GetPIDType() const +{ + CLockObject lock(mutex); + + if (packet) + return packet->packet_type; + return PACKET_TYPE_UNKNOWN; +} + +uint16_t AVContext::GetPIDChannel() const +{ + CLockObject lock(mutex); + + if (packet) + return packet->channel; + return 0xffff; +} + +bool AVContext::HasPIDStreamData() const +{ + CLockObject lock(mutex); + + // PES packets append frame buffer of elementary stream until next start of unit + // On new unit start, flag is held + if (packet && packet->has_stream_data) + return true; + return false; +} + +bool AVContext::HasPIDPayload() const +{ + return has_payload; +} + +ElementaryStream* AVContext::GetPIDStream() +{ + CLockObject lock(mutex); + + if (packet && packet->packet_type == PACKET_TYPE_PES) + return packet->stream; + return NULL; +} + +std::vector AVContext::GetStreams() +{ + CLockObject lock(mutex); + + std::vector v; + for (std::map::iterator it = packets.begin(); it != packets.end(); it++) + if (it->second.packet_type == PACKET_TYPE_PES && it->second.stream) + v.push_back(it->second.stream); + return v; +} + +void AVContext::StartStreaming(uint16_t pid) +{ + CLockObject lock(mutex); + + std::map::iterator it = packets.find(pid); + if (it != packets.end()) + it->second.streaming = true; +} + +void AVContext::StopStreaming(uint16_t pid) +{ + CLockObject lock(mutex); + + std::map::iterator it = packets.find(pid); + if (it != packets.end()) + it->second.streaming = false; +} + +ElementaryStream* AVContext::GetStream(uint16_t pid) const +{ + CLockObject lock(mutex); + + std::map::const_iterator it = packets.find(pid); + if (it != packets.end()) + return it->second.stream; + return NULL; +} + +uint16_t AVContext::GetChannel(uint16_t pid) const +{ + CLockObject lock(mutex); + + std::map::const_iterator it = packets.find(pid); + if (it != packets.end()) + return it->second.channel; + return 0xffff; +} + +void AVContext::ResetPackets() +{ + CLockObject lock(mutex); + + for (std::map::iterator it = packets.begin(); it != packets.end(); it++) + { + it->second.Reset(); + } +} + +//////////////////////////////////////////////////////////////////////////////// +///// +///// MPEG-TS parser for the context +///// + +uint8_t AVContext::av_rb8(const unsigned char* p) +{ + uint8_t val = *(uint8_t*)p; + return val; +} + +uint16_t AVContext::av_rb16(const unsigned char* p) +{ + uint16_t val = av_rb8(p) << 8; + val |= av_rb8(p + 1); + return val; +} + +uint32_t AVContext::av_rb32(const unsigned char* p) +{ + uint32_t val = av_rb16(p) << 16; + val |= av_rb16(p + 2); + return val; +} + +uint64_t AVContext::decode_pts(const unsigned char* p) +{ + uint64_t pts = (uint64_t)(av_rb8(p) & 0x0e) << 29 | (av_rb16(p + 1) >> 1) << 15 | av_rb16(p + 3) >> 1; + return pts; +} + +STREAM_TYPE AVContext::get_stream_type(uint8_t pes_type) +{ + switch (pes_type) + { + case 0x01: + return STREAM_TYPE_VIDEO_MPEG1; + case 0x02: + return STREAM_TYPE_VIDEO_MPEG2; + case 0x03: + return STREAM_TYPE_AUDIO_MPEG1; + case 0x04: + return STREAM_TYPE_AUDIO_MPEG2; + case 0x06: + return STREAM_TYPE_PRIVATE_DATA; + case 0x0f: + case 0x11: + return STREAM_TYPE_AUDIO_AAC; + case 0x10: + return STREAM_TYPE_VIDEO_MPEG4; + case 0x1b: + return STREAM_TYPE_VIDEO_H264; + case 0xea: + return STREAM_TYPE_VIDEO_VC1; + case 0x80: + return STREAM_TYPE_AUDIO_LPCM; + case 0x81: + case 0x83: + case 0x84: + case 0x87: + return STREAM_TYPE_AUDIO_AC3; + case 0x82: + case 0x85: + case 0x8a: + return STREAM_TYPE_AUDIO_DTS; + } + return STREAM_TYPE_UNKNOWN; +} + +int AVContext::configure_ts() +{ + const unsigned char* data; + size_t data_size = AV_CONTEXT_PACKETSIZE; + uint64_t pos = av_pos; + int fluts[][2] = { + {FLUTS_NORMAL_TS_PACKETSIZE, 0}, + {FLUTS_M2TS_TS_PACKETSIZE, 0}, + {FLUTS_DVB_ASI_TS_PACKETSIZE, 0}, + {FLUTS_ATSC_TS_PACKETSIZE, 0} + }; + int nb = sizeof (fluts) / (2 * sizeof (int)); + int score = TS_CHECK_MIN_SCORE; + + for (int i = 0; i < MAX_RESYNC_SIZE; i++) + { + if (!(data = m_demux->ReadAV(pos, data_size))) + return AVCONTEXT_IO_ERROR; + if (data[0] == 0x47) + { + int count, found; + for (int t = 0; t < nb; t++) // for all fluts + { + const unsigned char* ndata; + uint64_t npos = pos; + int do_retry = score; // Reach for score + do + { + --do_retry; + npos += fluts[t][0]; + if (!(ndata = m_demux->ReadAV(npos, data_size))) + return AVCONTEXT_IO_ERROR; + } + while (ndata[0] == 0x47 && (++fluts[t][1]) && do_retry); + } + // Is score reached ? + count = found = 0; + for (int t = 0; t < nb; t++) + { + if (fluts[t][1] == score) + { + found = t; + ++count; + } + // Reset score for next retry + fluts[t][1] = 0; + } + // One and only one is eligible + if (count == 1) + { + demux_dbg(DEMUX_DBG_DEBUG, "%s: packet size is %d\n", __FUNCTION__, fluts[found][0]); + av_pkt_size = fluts[found][0]; + av_pos = pos; + return AVCONTEXT_CONTINUE; + } + // More one: Retry for highest score + else if (count > 1 && ++score > TS_CHECK_MAX_SCORE) + // Packet size remains undetermined + break; + // None: Bad sync. Shift and retry + else + pos++; + } + else + pos++; + } + + demux_dbg(DEMUX_DBG_ERROR, "%s: invalid stream\n", __FUNCTION__); + return AVCONTEXT_TS_NOSYNC; +} + +int AVContext::TSResync() +{ + const unsigned char* data; + if (!is_configured) + { + int ret = configure_ts(); + if (ret != AVCONTEXT_CONTINUE) + return ret; + is_configured = true; + } + for (int i = 0; i < MAX_RESYNC_SIZE; i++) + { + data = m_demux->ReadAV(av_pos, av_pkt_size); + if (!data) + return AVCONTEXT_IO_ERROR; + if (data[0] == 0x47) + { + memcpy(av_buf, data, av_pkt_size); + Reset(); + return AVCONTEXT_CONTINUE; + } + av_pos++; + } + + return AVCONTEXT_TS_NOSYNC; +} + +uint64_t AVContext::GoNext() +{ + av_pos += av_pkt_size; + Reset(); + return av_pos; +} + +uint64_t AVContext::Shift() +{ + av_pos++; + Reset(); + return av_pos; +} + +void AVContext::GoPosition(uint64_t pos) +{ + av_pos = pos; + Reset(); +} + +uint64_t AVContext::GetPosition() const +{ + return av_pos; +} + +/* + * Process TS packet + * + * returns: + * + * AVCONTEXT_CONTINUE + * Parse completed. If has payload, process it else Continue to next packet. + * + * AVCONTEXT_STREAM_PID_DATA + * Parse completed. A new PES unit starts and data of elementary stream for + * the PID must be picked before processing this payload. + * + * AVCONTEXT_DISCONTINUITY + * Discontinuity. PID will wait until next unit start. So continue to next + * packet. + * + * AVCONTEXT_TS_NOSYNC + * Bad sync byte. Should run TSResync(). + * + * AVCONTEXT_TS_ERROR + * Parsing error ! + */ +int AVContext::ProcessTSPacket() +{ + CLockObject lock(mutex); + + int ret = AVCONTEXT_CONTINUE; + std::map::iterator it; + + if (av_rb8(this->av_buf) != 0x47) // ts sync byte + return AVCONTEXT_TS_NOSYNC; + + uint16_t header = av_rb16(this->av_buf + 1); + this->pid = header & 0x1fff; + this->transport_error = (header & 0x8000) != 0; + this->payload_unit_start = (header & 0x4000) != 0; + // Cleaning context + this->discontinuity = false; + this->has_payload = false; + this->payload = NULL; + this->payload_len = 0; + + if (this->transport_error) + return AVCONTEXT_CONTINUE; + // Null packet + if (this->pid == 0x1fff) + return AVCONTEXT_CONTINUE; + + uint8_t flags = av_rb8(this->av_buf + 3); + bool has_payload = (flags & 0x10) != 0; + bool is_discontinuity = false; + uint8_t continuity_counter = flags & 0x0f; + bool has_adaptation = (flags & 0x20) != 0; + size_t n = 0; + if (has_adaptation) + { + size_t len = (size_t)av_rb8(this->av_buf + 4); + if (len > (this->av_data_len - 5)) + return AVCONTEXT_TS_ERROR; + n = len + 1; + if (len > 0) + { + is_discontinuity = (av_rb8(this->av_buf + 5) & 0x80) != 0; + } + } + if (has_payload) + { + // Payload start after adaptation fields + this->payload = this->av_buf + n + 4; + this->payload_len = this->av_data_len - n - 4; + } + + it = this->packets.find(this->pid); + if (it == this->packets.end()) + { + // Not registred PID + // We are waiting for unit start of PID 0 else next packet is required + if (this->pid == 0 && this->payload_unit_start) + { + // Registering PID 0 + Packet pid0; + pid0.pid = this->pid; + pid0.packet_type = PACKET_TYPE_PSI; + pid0.continuity = continuity_counter; + it = this->packets.insert(it, std::make_pair(this->pid, pid0)); + } + else + return AVCONTEXT_CONTINUE; + } + else + { + // PID is registred + // Checking unit start is required + if (it->second.wait_unit_start && !this->payload_unit_start) + { + // Not unit start. Save packet flow continuity... + it->second.continuity = continuity_counter; + this->discontinuity = true; + return AVCONTEXT_DISCONTINUITY; + } + // Checking continuity where possible + if (it->second.continuity != 0xff) + { + uint8_t expected_cc = has_payload ? (it->second.continuity + 1) & 0x0f : it->second.continuity; + if (!is_discontinuity && expected_cc != continuity_counter) + { + this->discontinuity = true; + // If unit is not start then reset PID and wait the next unit start + if (!this->payload_unit_start) + { + it->second.Reset(); + demux_dbg(DEMUX_DBG_WARN, "PID %.4x discontinuity detected: found %u, expected %u\n", this->pid, continuity_counter, expected_cc); + return AVCONTEXT_DISCONTINUITY; + } + } + } + it->second.continuity = continuity_counter; + } + + this->discontinuity |= is_discontinuity; + this->has_payload = has_payload; + this->packet = &(it->second); + + // It is time to stream data for PES + if (this->payload_unit_start && + this->packet->streaming && + this->packet->packet_type == PACKET_TYPE_PES && + !this->packet->wait_unit_start) + { + this->packet->has_stream_data = true; + ret = AVCONTEXT_STREAM_PID_DATA; + } + return ret; +} + +/* + * Process payload of packet depending of its type + * + * PACKET_TYPE_PSI -> parse_ts_psi() + * PACKET_TYPE_PES -> parse_ts_pes() + */ +int AVContext::ProcessTSPayload() +{ + CLockObject lock(mutex); + + if (!this->packet) + return AVCONTEXT_CONTINUE; + + int ret = 0; + switch (this->packet->packet_type) + { + case PACKET_TYPE_PSI: + ret = parse_ts_psi(); + break; + case PACKET_TYPE_PES: + ret = parse_ts_pes(); + break; + case PACKET_TYPE_UNKNOWN: + break; + } + + return ret; +} + +void AVContext::clear_pmt() +{ + demux_dbg(DEMUX_DBG_DEBUG, "%s\n", __FUNCTION__); + std::vector pid_list; + for (std::map::iterator it = this->packets.begin(); it != this->packets.end(); it++) + { + if (it->second.packet_type == PACKET_TYPE_PSI && it->second.packet_table.table_id == 0x02) + { + pid_list.push_back(it->first); + clear_pes(it->second.channel); + } + } + for (std::vector::iterator it = pid_list.begin(); it != pid_list.end(); it ++) + this->packets.erase(*it); +} + +void AVContext::clear_pes(uint16_t channel) +{ + demux_dbg(DEMUX_DBG_DEBUG, "%s(%u)\n", __FUNCTION__, channel); + std::vector pid_list; + for (std::map::iterator it = this->packets.begin(); it != this->packets.end(); it++) + { + if (it->second.packet_type == PACKET_TYPE_PES && it->second.channel == channel) + pid_list.push_back(it->first); + } + for (std::vector::iterator it = pid_list.begin(); it != pid_list.end(); it ++) + this->packets.erase(*it); +} + +/* + * Parse PSI payload + * + * returns: + * + * AVCONTEXT_CONTINUE + * Parse completed. Continue to next packet + * + * AVCONTEXT_PROGRAM_CHANGE + * Parse completed. The program has changed. All streams are resetted and + * streaming flag is set to false. Client must inspect streams MAP and enable + * streaming for those recognized. + * + * AVCONTEXT_TS_ERROR + * Parsing error ! + */ +int AVContext::parse_ts_psi() +{ + size_t len; + + if (!this->has_payload || !this->payload || !this->payload_len || !this->packet) + return AVCONTEXT_CONTINUE; + + if (this->payload_unit_start) + { + // Reset wait for unit start + this->packet->wait_unit_start = false; + // pointer field present + len = (size_t)av_rb8(this->payload); + if (len > this->payload_len) + return AVCONTEXT_TS_ERROR; + + // table ID + uint8_t table_id = av_rb8(this->payload + 1); + + // table length + len = (size_t)av_rb16(this->payload + 2); + if ((len & 0x3000) != 0x3000) + return AVCONTEXT_TS_ERROR; + + len &= 0x0fff; + if (len > TABLE_BUFFER_SIZE) + return AVCONTEXT_TS_ERROR; + + this->packet->packet_table.Reset(); + + size_t n = this->payload_len - 4; + memcpy(this->packet->packet_table.buf, this->payload + 4, n); + this->packet->packet_table.table_id = table_id; + this->packet->packet_table.offset = n; + this->packet->packet_table.len = len; + // check for incomplete section + if (this->packet->packet_table.offset < this->packet->packet_table.len) + return AVCONTEXT_CONTINUE; + } + else + { + // next part of PSI + if (this->packet->packet_table.offset == 0) + return AVCONTEXT_TS_ERROR; + + if ((this->payload_len + this->packet->packet_table.offset) > TABLE_BUFFER_SIZE) + return AVCONTEXT_TS_ERROR; + + memcpy(this->packet->packet_table.buf + this->packet->packet_table.offset, this->payload, this->payload_len); + this->packet->packet_table.offset += this->payload_len; + // check for incomplete section + if (this->packet->packet_table.offset < this->packet->packet_table.len) + return AVCONTEXT_CONTINUE; + } + + // now entire table is filled + const unsigned char* psi = this->packet->packet_table.buf; + const unsigned char* end_psi = psi + this->packet->packet_table.len; + + switch (this->packet->packet_table.table_id) + { + case 0x00: // parse PAT table + { + // check if version number changed + uint16_t id = av_rb16(psi); + // check if applicable + if ((av_rb8(psi + 2) & 0x01) == 0) + return AVCONTEXT_CONTINUE; + // check if version number changed + uint8_t version = (av_rb8(psi + 2) & 0x3e) >> 1; + if (id == this->packet->packet_table.id && version == this->packet->packet_table.version) + return AVCONTEXT_CONTINUE; + demux_dbg(DEMUX_DBG_DEBUG, "%s: new PAT version %u\n", __FUNCTION__, version); + + // clear old associated pmt + clear_pmt(); + + // parse new version of PAT + psi += 5; + + end_psi -= 4; // CRC32 + + if (psi >= end_psi) + return AVCONTEXT_TS_ERROR; + + len = end_psi - psi; + + if (len % 4) + return AVCONTEXT_TS_ERROR; + + size_t n = len / 4; + + for (size_t i = 0; i < n; i++, psi += 4) + { + uint16_t channel = av_rb16(psi); + uint16_t pmt_pid = av_rb16(psi + 2); + + if ((pmt_pid & 0xe000) != 0xe000) + return AVCONTEXT_TS_ERROR; + + pmt_pid &= 0x1fff; + + demux_dbg(DEMUX_DBG_DEBUG, "%s: PAT version %u: new PMT %.4x channel %u\n", __FUNCTION__, version, pmt_pid, channel); + if (this->channel == 0 || this->channel == channel) + { + Packet& pmt = this->packets[pmt_pid]; + pmt.pid = pmt_pid; + pmt.packet_type = PACKET_TYPE_PSI; + pmt.channel = channel; + demux_dbg(DEMUX_DBG_DEBUG, "%s: PAT version %u: register PMT %.4x channel %u\n", __FUNCTION__, version, pmt_pid, channel); + } + } + // PAT is processed. New version is available + this->packet->packet_table.id = id; + this->packet->packet_table.version = version; + break; + } + case 0x02: // parse PMT table + { + uint16_t id = av_rb16(psi); + // check if applicable + if ((av_rb8(psi + 2) & 0x01) == 0) + return AVCONTEXT_CONTINUE; + // check if version number changed + uint8_t version = (av_rb8(psi + 2) & 0x3e) >> 1; + if (id == this->packet->packet_table.id && version == this->packet->packet_table.version) + return AVCONTEXT_CONTINUE; + demux_dbg(DEMUX_DBG_DEBUG, "%s: PMT(%.4x) version %u\n", __FUNCTION__, this->packet->pid, version); + + // clear old pes + clear_pes(this->packet->channel); + + // parse new version of PMT + psi += 7; + + end_psi -= 4; // CRC32 + + if (psi >= end_psi) + return AVCONTEXT_TS_ERROR; + + len = (size_t)(av_rb16(psi) & 0x0fff); + psi += 2 + len; + + while (psi < end_psi) + { + if (end_psi - psi < 5) + return AVCONTEXT_TS_ERROR; + + uint8_t pes_type = av_rb8(psi); + uint16_t pes_pid = av_rb16(psi + 1); + + if ((pes_pid & 0xe000) != 0xe000) + return AVCONTEXT_TS_ERROR; + + pes_pid &= 0x1fff; + + // len of descriptor section + len = (size_t)(av_rb16(psi + 3) & 0x0fff); + psi += 5; + + // ignore unknown streams + STREAM_TYPE stream_type = get_stream_type(pes_type); + demux_dbg(DEMUX_DBG_DEBUG, "%s: PMT(%.4x) version %u: new PES %.4x %s\n", __FUNCTION__, + this->packet->pid, version, pes_pid, ElementaryStream::GetStreamCodecName(stream_type)); + if (stream_type != STREAM_TYPE_UNKNOWN) + { + Packet& pes = this->packets[pes_pid]; + pes.pid = pes_pid; + pes.packet_type = PACKET_TYPE_PES; + pes.channel = this->packet->channel; + // Disable streaming by default + pes.streaming = false; + // Get basic stream infos from PMT table + ElementaryStream::STREAM_INFO stream_info; + stream_info = parse_pes_descriptor(psi, len, &stream_type); + + ElementaryStream* es; + if (stream_type == STREAM_TYPE_VIDEO_MPEG1) + es = new ES_MPEG2Video(pes_pid); + else if (stream_type == STREAM_TYPE_VIDEO_MPEG2) + es = new ES_MPEG2Video(pes_pid); + else if (stream_type == STREAM_TYPE_AUDIO_MPEG1) + es = new ES_MPEG2Audio(pes_pid); + else if (stream_type == STREAM_TYPE_AUDIO_MPEG2) + es = new ES_MPEG2Audio(pes_pid); + else if (stream_type == STREAM_TYPE_VIDEO_H264) + es = new ES_h264(pes_pid); + else if (stream_type == STREAM_TYPE_AUDIO_AAC) + es = new ES_AAC(pes_pid); + else if (stream_type == STREAM_TYPE_AUDIO_AC3) + es = new ES_AC3(pes_pid); + else if (stream_type == STREAM_TYPE_AUDIO_EAC3) + es = new ES_AC3(pes_pid); + else if (stream_type == STREAM_TYPE_DVB_SUBTITLE) + es = new ES_Subtitle(pes_pid); + else if (stream_type == STREAM_TYPE_DVB_TELETEXT) + es = new ES_Teletext(pes_pid); + else + { + // No parser: pass-through + es = new ElementaryStream(pes_pid); + es->has_stream_info = true; + } + + es->stream_type = stream_type; + es->stream_info = stream_info; + pes.stream = es; + demux_dbg(DEMUX_DBG_DEBUG, "%s: PMT(%.4x) version %u: register PES %.4x %s\n", __FUNCTION__, + this->packet->pid, version, pes_pid, es->GetStreamCodecName()); + } + psi += len; + } + + if (psi != end_psi) + return AVCONTEXT_TS_ERROR; + + // PMT is processed. New version is available + this->packet->packet_table.id = id; + this->packet->packet_table.version = version; + return AVCONTEXT_PROGRAM_CHANGE; + } + default: + // CAT, NIT table + break; + } + + return AVCONTEXT_CONTINUE; +} + +ElementaryStream::STREAM_INFO AVContext::parse_pes_descriptor(const unsigned char* p, size_t len, STREAM_TYPE* st) +{ + const unsigned char* desc_end = p + len; + ElementaryStream::STREAM_INFO si; + memset(&si, 0, sizeof(ElementaryStream::STREAM_INFO)); + + while (p < desc_end) + { + uint8_t desc_tag = av_rb8(p); + uint8_t desc_len = av_rb8(p + 1); + p += 2; + demux_dbg(DEMUX_DBG_DEBUG, "%s: tag %.2x len %d\n", __FUNCTION__, desc_tag, desc_len); + switch (desc_tag) + { + case 0x02: + case 0x03: + break; + case 0x0a: /* ISO 639 language descriptor */ + if (desc_len >= 4) + { + si.language[0] = av_rb8(p); + si.language[1] = av_rb8(p + 1); + si.language[2] = av_rb8(p + 2); + si.language[3] = 0; + } + break; + case 0x56: /* DVB teletext descriptor */ + *st = STREAM_TYPE_DVB_TELETEXT; + break; + case 0x6a: /* DVB AC3 */ + case 0x81: /* AC3 audio stream */ + *st = STREAM_TYPE_AUDIO_AC3; + break; + case 0x7a: /* DVB enhanced AC3 */ + *st = STREAM_TYPE_AUDIO_EAC3; + break; + case 0x7b: /* DVB DTS */ + *st = STREAM_TYPE_AUDIO_DTS; + break; + case 0x7c: /* DVB AAC */ + *st = STREAM_TYPE_AUDIO_AAC; + break; + case 0x59: /* subtitling descriptor */ + if (desc_len >= 8) + { + /* + * Byte 4 is the subtitling_type field + * av_rb8(p + 3) & 0x10 : normal + * av_rb8(p + 3) & 0x20 : for the hard of hearing + */ + *st = STREAM_TYPE_DVB_SUBTITLE; + si.language[0] = av_rb8(p); + si.language[1] = av_rb8(p + 1); + si.language[2] = av_rb8(p + 2); + si.language[3] = 0; + si.composition_id = (int)av_rb16(p + 4); + si.ancillary_id = (int)av_rb16(p + 6); + } + break; + case 0x05: /* registration descriptor */ + case 0x1E: /* SL descriptor */ + case 0x1F: /* FMC descriptor */ + case 0x52: /* stream identifier descriptor */ + default: + break; + } + p += desc_len; + } + + return si; +} + +/* + * Parse PES payload + * + * returns: + * + * AVCONTEXT_CONTINUE + * Parse completed. When streaming is enabled for PID, data is appended to + * the frame buffer of corresponding elementary stream. + * + * AVCONTEXT_TS_ERROR + * Parsing error ! + */ +int AVContext::parse_ts_pes() +{ + if (!this->has_payload || !this->payload || !this->payload_len || !this->packet) + return AVCONTEXT_CONTINUE; + + if (!this->packet->stream) + return AVCONTEXT_CONTINUE; + + if (this->payload_unit_start) + { + // Wait for unit start: Reset frame buffer to clear old data + if (this->packet->wait_unit_start) + { + packet->stream->Reset(); + packet->stream->p_dts = PTS_UNSET; + packet->stream->p_pts = PTS_UNSET; + } + this->packet->wait_unit_start = false; + this->packet->has_stream_data = false; + // Reset header table + this->packet->packet_table.Reset(); + // Header len is at least 6 bytes. So getting 6 bytes first + this->packet->packet_table.len = 6; + } + + // Position in the payload buffer. Start at 0 + size_t pos = 0; + + while (this->packet->packet_table.offset < this->packet->packet_table.len) + { + if (pos >= this->payload_len) + return AVCONTEXT_CONTINUE; + + size_t n = this->packet->packet_table.len - this->packet->packet_table.offset; + + if (n > (this->payload_len - pos)) + n = this->payload_len - pos; + + memcpy(this->packet->packet_table.buf + this->packet->packet_table.offset, this->payload + pos, n); + this->packet->packet_table.offset += n; + pos += n; + + if (this->packet->packet_table.offset == 6) + { + if (memcmp(this->packet->packet_table.buf, "\x00\x00\x01", 3)) + { + this->packet->packet_table.Reset(); + return AVCONTEXT_TS_ERROR; + } + uint8_t stream_id = av_rb8(this->packet->packet_table.buf + 3); + if (stream_id == 0xbd || (stream_id >= 0xc0 && stream_id <= 0xef)) + this->packet->packet_table.len = 9; + } + else if (this->packet->packet_table.offset == 9) + { + this->packet->packet_table.len += av_rb8(this->packet->packet_table.buf + 8); + } + } + + // parse header table + bool has_pts = false; + + if (this->packet->packet_table.len >= 9) + { + uint8_t flags = av_rb8(this->packet->packet_table.buf + 7); + + //this->packet->stream->frame_num++; + + switch (flags & 0xc0) + { + case 0x80: // PTS only + { + has_pts = true; + if (this->packet->packet_table.len >= 14) + { + uint64_t pts = decode_pts(this->packet->packet_table.buf + 9); + this->packet->stream->p_dts = this->packet->stream->c_dts; + this->packet->stream->p_pts = this->packet->stream->c_pts; + this->packet->stream->c_dts = this->packet->stream->c_pts = pts; + } + else + { + this->packet->stream->c_dts = this->packet->stream->c_pts = PTS_UNSET; + } + } + break; + case 0xc0: // PTS,DTS + { + has_pts = true; + if (this->packet->packet_table.len >= 19 ) + { + uint64_t pts = decode_pts(this->packet->packet_table.buf + 9); + uint64_t dts = decode_pts(this->packet->packet_table.buf + 14); + int64_t d = (pts - dts) & PTS_MASK; + // more than two seconds of PTS/DTS delta, probably corrupt + if(d > 180000) + { + this->packet->stream->c_dts = this->packet->stream->c_pts = PTS_UNSET; + } + else + { + this->packet->stream->p_dts = this->packet->stream->c_dts; + this->packet->stream->p_pts = this->packet->stream->c_pts; + this->packet->stream->c_dts = dts; + this->packet->stream->c_pts = pts; + } + } + else + { + this->packet->stream->c_dts = this->packet->stream->c_pts = PTS_UNSET; + } + } + break; + } + this->packet->packet_table.Reset(); + } + + if (this->packet->streaming) + { + const unsigned char* data = this->payload + pos; + size_t len = this->payload_len - pos; + this->packet->stream->Append(data, len, has_pts); + } + + return AVCONTEXT_CONTINUE; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/tsDemuxer.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/tsDemuxer.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/tsDemuxer.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/tsDemuxer.h 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2013 Jean-Luc Barriere + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#ifndef TSDEMUXER_H +#define TSDEMUXER_H + +#include "common.h" +#include "tsPacket.h" +#include "elementaryStream.h" +#include "platform/threads/mutex.h" + +#include +#include + +#define FLUTS_NORMAL_TS_PACKETSIZE 188 +#define FLUTS_M2TS_TS_PACKETSIZE 192 +#define FLUTS_DVB_ASI_TS_PACKETSIZE 204 +#define FLUTS_ATSC_TS_PACKETSIZE 208 + +#define AV_CONTEXT_PACKETSIZE 208 +#define TS_CHECK_MIN_SCORE 2 +#define TS_CHECK_MAX_SCORE 10 + +class TSDemuxer +{ +public: + virtual const unsigned char* ReadAV(uint64_t pos, size_t len) = 0; +}; + +enum { + AVCONTEXT_TS_ERROR = -3, + AVCONTEXT_IO_ERROR = -2, + AVCONTEXT_TS_NOSYNC = -1, + AVCONTEXT_CONTINUE = 0, + AVCONTEXT_PROGRAM_CHANGE = 1, + AVCONTEXT_STREAM_PID_DATA = 2, + AVCONTEXT_DISCONTINUITY = 3 +}; + +class AVContext +{ +public: + AVContext(TSDemuxer* const demux, uint64_t pos, uint16_t channel); + void Reset(void); + + uint16_t GetPID() const; + PACKET_TYPE GetPIDType() const; + uint16_t GetPIDChannel() const; + bool HasPIDStreamData() const; + bool HasPIDPayload() const; + ElementaryStream* GetPIDStream(); + std::vector GetStreams(); + void StartStreaming(uint16_t pid); + void StopStreaming(uint16_t pid); + + ElementaryStream* GetStream(uint16_t pid) const; + uint16_t GetChannel(uint16_t pid) const; + void ResetPackets(); + + // TS parser + int TSResync(); + uint64_t GoNext(); + uint64_t Shift(); + void GoPosition(uint64_t pos); + uint64_t GetPosition() const; + int ProcessTSPacket(); + int ProcessTSPayload(); + +private: + AVContext(const AVContext&); + AVContext& operator=(const AVContext&); + + int configure_ts(); + static STREAM_TYPE get_stream_type(uint8_t pes_type); + static uint8_t av_rb8(const unsigned char* p); + static uint16_t av_rb16(const unsigned char* p); + static uint32_t av_rb32(const unsigned char* p); + static uint64_t decode_pts(const unsigned char* p); + void clear_pmt(); + void clear_pes(uint16_t channel); + int parse_ts_psi(); + static ElementaryStream::STREAM_INFO parse_pes_descriptor(const unsigned char* p, size_t len, STREAM_TYPE* st); + int parse_ts_pes(); + + // Critical section + mutable PLATFORM::CMutex mutex; + + // AV stream owner + TSDemuxer* m_demux; + + // Raw packet buffer + uint64_t av_pos; + size_t av_data_len; + size_t av_pkt_size; + unsigned char av_buf[AV_CONTEXT_PACKETSIZE]; + + // TS Streams context + bool is_configured; + uint16_t channel; + std::map packets; + + // Packet context + uint16_t pid; + bool transport_error; + bool has_payload; + bool payload_unit_start; + bool discontinuity; + const unsigned char* payload; + size_t payload_len; + Packet* packet; +}; + +#endif /* TSDEMUXER_H */ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/tsPacket.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/tsPacket.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/tsPacket.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/tsPacket.h 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2013 Jean-Luc Barriere + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#ifndef TSPACKET_H +#define TSPACKET_H + +#include "common.h" +#include "tsTable.h" +#include "elementaryStream.h" + +enum PACKET_TYPE +{ + PACKET_TYPE_UNKNOWN = 0, + PACKET_TYPE_PSI, + PACKET_TYPE_PES +}; + +class Packet +{ +public: + Packet(void) + : pid(0xffff) + , continuity(0xff) + , packet_type(PACKET_TYPE_UNKNOWN) + , packet_table() + , channel(0) + , wait_unit_start(true) + , has_stream_data(false) + , streaming(false) + , stream(NULL) + { + } + + ~Packet(void) + { + if (stream) + delete stream; + } + + void Reset(void) + { + continuity = 0xff; + wait_unit_start = true; + packet_table.Reset(); + if (stream) + stream->Reset(); + } + + uint16_t pid; + uint8_t continuity; + PACKET_TYPE packet_type; + TSTable packet_table; + uint16_t channel; + bool wait_unit_start; + bool has_stream_data; + bool streaming; + ElementaryStream* stream; +}; + +#endif /* TSPACKET_H */ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/tsTable.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/tsTable.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demuxer/tsTable.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demuxer/tsTable.h 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2013 Jean-Luc Barriere + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#ifndef TSTABLE_H +#define TSTABLE_H + +#include "common.h" + +#define TABLE_BUFFER_SIZE 1024 + +class TSTable +{ +public: + unsigned char buf[TABLE_BUFFER_SIZE]; + uint8_t table_id; + uint8_t version; + uint16_t id; + uint16_t len; + uint16_t offset; + + TSTable(void) + : table_id(0xff) + , version(0xff) + , id(0xffff) + , len(0) + , offset(0) + { + memset(buf, 0, sizeof(buf)); + } + + void Reset(void) + { + len = 0; + offset = 0; + } +}; + +#endif /* TSTABLE_H */ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demux.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demux.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/demux.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/demux.h 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,95 @@ +#pragma once +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "cppmyth/MythRecorder.h" +#include "demuxer/tsDemuxer.h" +#include "client.h" + +#include +#include +#include +#include + +#include +#include + +#define AV_BUFFER_SIZE 131072 + +class Demux : public TSDemuxer, PLATFORM::CThread +{ +public: + Demux(MythRecorder &recorder); + ~Demux(); + + const unsigned char* ReadAV(uint64_t pos, size_t n); + + void* Process(); + + bool GetStreamProperties(PVR_STREAM_PROPERTIES* props); + void Flush(); + void Abort(); + DemuxPacket* Read(); + bool SeekTime(int time, bool backwards, double* startpts); + + int GetPlayingTime(); + +private: + MythRecorder m_recorder; + uint16_t m_channel; + PLATFORM::SyncedBuffer m_demuxPacketBuffer; + PLATFORM::CMutex m_mutex; + ADDON::XbmcStreamProperties m_streams; + + bool get_stream_data(ElementaryStream::STREAM_PKT* pkt); + void reset_posmap(); + + // PVR interfaces + void populate_pvr_streams(); + bool update_pvr_stream(uint16_t pid); + void push_stream_change(); + DemuxPacket* stream_pvr_data(ElementaryStream::STREAM_PKT* pkt); + void push_stream_data(DemuxPacket* dxp); + + // AV raw buffer + size_t m_av_buf_size; ///< size of av buffer + uint64_t m_av_pos; ///< absolute position in av + unsigned char* m_av_buf; ///< buffer + unsigned char* m_av_rbs; ///< raw data start in buffer + unsigned char* m_av_rbe; ///< raw data end in buffer + + // Playback context + AVContext* m_AVContext; + uint16_t m_mainStreamPID; ///< PID of main stream + uint64_t m_DTS; ///< absolute decode time of main stream + uint64_t m_PTS; ///< absolute presentation time of main stream + int64_t m_pinTime; ///< pinned relative position (90Khz) + int64_t m_curTime; ///< current relative position (90Khz) + int64_t m_endTime; ///< last relative marked position (90Khz)) + typedef struct + { + uint64_t av_pts; + uint64_t av_pos; + } AV_POSMAP_ITEM; + std::map m_posmap; + + bool m_isChangePlaced; + std::set m_nosetup; +}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/fileOps.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/fileOps.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/fileOps.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/fileOps.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -29,11 +29,12 @@ #include using namespace ADDON; +using namespace PLATFORM; FileOps::FileOps(MythConnection &mythConnection) : CThread() - , CMutex() , m_con(mythConnection) + , m_backendHostname() , m_localBasePath(g_szUserPath.c_str()) , m_queueContent() , m_jobQueue() @@ -46,6 +47,8 @@ XBMC->Log(LOG_ERROR,"%s - Failed to create cache directory %s", __FUNCTION__, m_localBasePath.c_str()); } + m_backendHostname = m_con.GetBackendHostname(); + CreateThread(); } @@ -77,18 +80,17 @@ if (!XBMC->FileExists(localFilename, true)) { - Lock(); - FileOps::JobItem job(localFilename, remoteFilename, ""); + CLockObject lock(m_lock); + FileOps::JobItem job(localFilename, remoteFilename, GetFolderNameByFileType(FileTypeChannelIcon)); m_jobQueue.push_back(job); m_queueContent.Signal(); - Unlock(); } m_icons[remoteFilename] = localFilename; return localFilename; } -CStdString FileOps::GetPreviewIconPath(const CStdString &remoteFilename, const CStdString &recordingGroup) +CStdString FileOps::GetPreviewIconPath(const CStdString &remoteFilename, const CStdString &storageGroup) { if (g_bExtraDebug) XBMC->Log(LOG_DEBUG, "%s: preview icon: %s", __FUNCTION__, remoteFilename.c_str()); @@ -99,7 +101,7 @@ return it->second; // Check file exists in storage group - MythStorageGroupFile sgfile = m_con.GetStorageGroupFile(recordingGroup, remoteFilename); + MythStorageGroupFile sgfile = m_con.GetStorageGroupFile(m_backendHostname, storageGroup, remoteFilename); // Determine local filename CStdString localFilename; @@ -111,11 +113,10 @@ if (!XBMC->FileExists(localFilename, true)) { - Lock(); + CLockObject lock(m_lock); FileOps::JobItem job(localFilename, remoteFilename, "Default"); m_jobQueue.push_back(job); m_queueContent.Signal(); - Unlock(); } m_preview[remoteFilename] = localFilename; @@ -135,7 +136,7 @@ return iter->second; // Check file exists in storage group - MythStorageGroupFile sgfile = m_con.GetStorageGroupFile(GetFolderNameByFileType(fileType), remoteFilename); + MythStorageGroupFile sgfile = m_con.GetStorageGroupFile(m_backendHostname, GetFolderNameByFileType(fileType), remoteFilename); // Determine local filename CStdString localFilename; @@ -145,11 +146,10 @@ if (!XBMC->FileExists(localFilename, true)) { - Lock(); - FileOps::JobItem job(localFilename, remoteFilename, GetFolderNameByFileType(fileType)); - m_jobQueue.push_back(job); - m_queueContent.Signal(); - Unlock(); + CLockObject lock(m_lock); + FileOps::JobItem job(localFilename, remoteFilename, GetFolderNameByFileType(fileType)); + m_jobQueue.push_back(job); + m_queueContent.Signal(); } m_artworks[key] = localFilename; } @@ -175,7 +175,7 @@ if (IsStopped()) { XBMC->Log(LOG_DEBUG, "%s Resuming Thread", __FUNCTION__); - Clear(); + m_lock.Clear(); CreateThread(); } } @@ -194,19 +194,24 @@ while (!m_jobQueue.empty() && !IsStopped()) { - Lock(); + CLockObject lock(m_lock); FileOps::JobItem job = m_jobQueue.front(); m_jobQueue.pop_front(); - Unlock(); + lock.Unlock(); if (g_bExtraDebug) XBMC->Log(LOG_DEBUG,"%s Job fetched: local: %s, remote: %s, storagegroup: %s", __FUNCTION__, job.m_localFilename.c_str(), job.m_remoteFilename.c_str(), job.m_storageGroup.c_str()); + // Try to open the destination file + void *localFile = OpenFile(job.m_localFilename.c_str()); + if (!localFile) + continue; + // Connect to the file and cache it to the local addon cache - MythFile file = m_con.ConnectPath(job.m_remoteFilename, job.m_storageGroup); - if (!file.IsNull() && file.Length() > 0) + MythFile remoteFile = m_con.ConnectPath(job.m_remoteFilename, job.m_storageGroup); + if (!remoteFile.IsNull() && remoteFile.Length() > 0) { - if (CacheFile(job.m_localFilename.c_str(), file)) + if (CacheFile(localFile, remoteFile)) { if (g_bExtraDebug) XBMC->Log(LOG_DEBUG, "%s File Cached: local: %s, remote: %s, type: %s", __FUNCTION__, job.m_localFilename.c_str(), job.m_remoteFilename.c_str(), job.m_storageGroup.c_str()); @@ -224,7 +229,7 @@ { // Failed to open file for reading. Unfortunately it cannot be determined if this is a permanent or a temporary problem (new recording's preview hasn't been generated yet). // Increase the error count and retry to cache the file a few times - if (file.IsNull()) + if (remoteFile.IsNull()) { XBMC->Log(LOG_ERROR, "%s Failed to read file: local: %s, remote: %s, type: %s", __FUNCTION__, job.m_localFilename.c_str(), job.m_remoteFilename.c_str(), job.m_storageGroup.c_str()); job.m_errorCount += 1; @@ -232,7 +237,7 @@ // File was empty (this happens usually for new recordings where the preview image hasn't been generated yet) // This is not an error, always try to recache the file - else if (file.Length() == 0) + else if (remoteFile.Length() == 0) { XBMC->Log(LOG_DEBUG, "%s File is empty: local: %s, remote: %s, type: %s", __FUNCTION__, job.m_localFilename.c_str(), job.m_remoteFilename.c_str(), job.m_storageGroup.c_str()); } @@ -247,30 +252,17 @@ } // Try to recache the currently empty files - Lock(); + CLockObject lock(m_lock); m_jobQueue.insert(m_jobQueue.end(), jobQueueDelayed.begin(), jobQueueDelayed.end()); jobQueueDelayed.clear(); - Unlock(); } XBMC->Log(LOG_DEBUG, "%s FileOps Thread Stopped", __FUNCTION__); return NULL; } -bool FileOps::CacheFile(const CStdString &localFilename, MythFile &source) +void *FileOps::OpenFile(const CStdString &localFilename) { - if (source.IsNull()) - { - XBMC->Log(LOG_ERROR,"%s: NULL file provided", __FUNCTION__); - return false; - } - - if (source.Length() == 0) - { - XBMC->Log(LOG_ERROR,"%s: Empty file provided", __FUNCTION__); - return false; - } - // Try to open the file. If it fails, check if we need to create the directory first. // This way we avoid checking if the directory exists every time. void *file; @@ -285,16 +277,20 @@ if (!(file = XBMC->OpenFileForWrite(localFilename.c_str(), true))) { XBMC->Log(LOG_ERROR, "%s: Failed to create cache file: %s", __FUNCTION__, localFilename.c_str()); - return false; + return NULL; } } else { XBMC->Log(LOG_ERROR, "%s: Failed to create cache directory: %s", __FUNCTION__, cacheDirectory.c_str()); - return false; + return NULL; } } + return file; +} +bool FileOps::CacheFile(void* destination, MythFile &source) +{ unsigned long long totalLength = source.Length(); unsigned long long totalRead = 0; @@ -312,7 +308,7 @@ char *p = buffer; while (bytes_read > 0) { - int bytes_written = XBMC->WriteFile(file, p, bytes_read); + int bytes_written = XBMC->WriteFile(destination, p, bytes_read); if (bytes_written <= 0) break; @@ -321,13 +317,11 @@ } } - XBMC->CloseFile(file); + XBMC->CloseFile(destination); delete[] buffer; if (totalRead < totalLength) - { - XBMC->Log(LOG_DEBUG, "%s: Failed to read all data: %s (%d/%d)", __FUNCTION__, localFilename.c_str(), totalRead, totalLength); - } + XBMC->Log(LOG_DEBUG, "%s: Failed to read all data: (%d/%d)", __FUNCTION__, totalRead, totalLength); return true; } @@ -339,7 +333,7 @@ XBMC->Log(LOG_DEBUG, "%s Cleaning cache %s", __FUNCTION__, m_localBasePath.c_str()); - Lock(); + CLockObject lock(m_lock); // Remove cache sub directories std::vector::const_iterator it; @@ -365,8 +359,6 @@ m_icons.clear(); m_preview.clear(); - Unlock(); - XBMC->Log(LOG_DEBUG, "%s Cleaned cache %s", __FUNCTION__, m_localBasePath.c_str()); } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/fileOps.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/fileOps.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/fileOps.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/fileOps.h 2014-01-04 10:28:12.000000000 +0000 @@ -31,7 +31,7 @@ class MythConnection; -class FileOps : public PLATFORM::CThread, public PLATFORM::CMutex +class FileOps : public PLATFORM::CThread { public: enum FileType @@ -89,7 +89,7 @@ CStdString GetArtworkPath(const CStdString &remoteFilename, FileType fileType); CStdString GetChannelIconPath(const CStdString &remoteFilename); - CStdString GetPreviewIconPath(const CStdString &remoteFilename, const CStdString &recordingGroup); + CStdString GetPreviewIconPath(const CStdString &remoteFilename, const CStdString &storageGroup); void Suspend(); void Resume(); @@ -97,7 +97,8 @@ protected: void* Process(); - bool CacheFile(const CStdString &destination, MythFile &source); + void *OpenFile(const CStdString &localFilename); + bool CacheFile(void *destination, MythFile &source); void CleanCache(); static CStdString GetFileName(const CStdString &path, char separator = PATH_SEPARATOR_CHAR); @@ -108,6 +109,7 @@ std::map, CStdString> m_artworks; MythConnection m_con; + CStdString m_backendHostname; CStdString m_localBasePath; @@ -126,6 +128,7 @@ int m_errorCount; }; + PLATFORM::CMutex m_lock; PLATFORM::CEvent m_queueContent; std::list m_jobQueue; }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/pvrclient-mythtv.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/pvrclient-mythtv.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/pvrclient-mythtv.cpp 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/pvrclient-mythtv.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -24,108 +24,23 @@ #include "tools.h" #include +#include #include using namespace ADDON; using namespace PLATFORM; -RecordingRule::RecordingRule(const MythRecordingRule &rule) - : MythRecordingRule(rule) - , m_parent(0) -{ -} - -RecordingRule &RecordingRule::operator=(const MythRecordingRule &rule) -{ - MythRecordingRule::operator=(rule); - clear(); - return *this; -} - -bool RecordingRule::operator==(const unsigned int &id) -{ - return id==RecordID(); -} - -RecordingRule *RecordingRule::GetParent() const -{ - return m_parent; -} - -void RecordingRule::SetParent(RecordingRule &parent) -{ - m_parent = &parent; -} - -bool RecordingRule::HasOverrideRules() const -{ - return !m_overrideRules.empty(); -} - -std::vector RecordingRule::GetOverrideRules() const -{ - return m_overrideRules; -} - -void RecordingRule::AddOverrideRule(RecordingRule &overrideRule) -{ - m_overrideRules.push_back(&overrideRule); -} - -bool RecordingRule::SameTimeslot(RecordingRule &rule) const -{ - time_t starttime = StartTime(); - time_t rStarttime = rule.StartTime(); - - switch (rule.Type()) - { - case MythRecordingRule::TemplateRecord: - case MythRecordingRule::NotRecording: - case MythRecordingRule::SingleRecord: - case MythRecordingRule::OverrideRecord: - case MythRecordingRule::DontRecord: - return rStarttime == starttime && rule.EndTime() == EndTime() && rule.ChannelID() == ChannelID(); - case MythRecordingRule::FindDailyRecord: - case MythRecordingRule::FindWeeklyRecord: - case MythRecordingRule::FindOneRecord: - return rule.Title() == Title(); - case MythRecordingRule::TimeslotRecord: - return rule.Title() == Title() && daytime(&starttime) == daytime(&rStarttime) && rule.ChannelID() == ChannelID(); - case MythRecordingRule::ChannelRecord: - return rule.Title() == Title() && rule.ChannelID() == ChannelID(); //TODO: dup - case MythRecordingRule::AllRecord: - return rule.Title() == Title(); //TODO: dup - case MythRecordingRule::WeekslotRecord: - return rule.Title() == Title() && daytime(&starttime) == daytime(&rStarttime) && weekday(&starttime) == weekday(&rStarttime) && rule.ChannelID() == ChannelID(); - } - return false; -} - -void RecordingRule::push_back(std::pair &_val) -{ - SaveTimerString(_val.first); - std::vector >::push_back(_val); -} - -void RecordingRule::SaveTimerString(PVR_TIMER &timer) -{ - m_stringStore.push_back(boost::shared_ptr(new CStdString(timer.strTitle))); - PVR_STRCPY(timer.strTitle,m_stringStore.back()->c_str()); - m_stringStore.push_back(boost::shared_ptr(new CStdString(timer.strDirectory))); - PVR_STRCPY(timer.strDirectory,m_stringStore.back()->c_str()); - m_stringStore.push_back(boost::shared_ptr(new CStdString(timer.strSummary))); - PVR_STRCPY(timer.strSummary,m_stringStore.back()->c_str()); -} - PVRClientMythTV::PVRClientMythTV() : m_con() , m_pEventHandler(NULL) , m_db() , m_fileOps(NULL) + , m_scheduleManager(NULL) , m_backendVersion("") , m_connectionString("") , m_categories() , m_channelGroups() + , m_demux(NULL) { } @@ -142,6 +57,18 @@ delete m_pEventHandler; m_pEventHandler = NULL; } + + if (m_scheduleManager) + { + delete m_scheduleManager; + m_scheduleManager = NULL; + } + + if (m_demux) + { + delete m_demux; + m_demux = NULL; + } } void Log(int level, char *msg) @@ -182,7 +109,7 @@ cmyth_set_dbg_msgcallback(Log); // Create MythTV connection - m_con = MythConnection(g_szMythHostname, g_iMythPort); + m_con = MythConnection(g_szMythHostname, g_iMythPort, false); if (!m_con.IsConnected()) { XBMC->Log(LOG_ERROR,"Failed to connect to MythTV backend on %s:%d", g_szMythHostname.c_str(), g_iMythPort); @@ -220,6 +147,9 @@ // Create file operation helper (image caching) m_fileOps = new FileOps(m_con); + // Create schedule manager + m_scheduleManager = new MythScheduleManager(m_con, m_db); + return true; } @@ -251,6 +181,22 @@ return m_con.GetDriveSpace(*iTotal, *iUsed); } +void PVRClientMythTV::OnSleep() +{ + if (m_pEventHandler) + m_pEventHandler->Suspend(); + if (m_fileOps) + m_fileOps->Suspend(); +} + +void PVRClientMythTV::OnWake() +{ + if (m_pEventHandler) + m_pEventHandler->Resume(true); + if (m_fileOps) + m_fileOps->Resume(); +} + PVR_ERROR PVRClientMythTV::GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart, time_t iEnd) { if (g_bExtraDebug) @@ -258,30 +204,37 @@ if (!channel.bIsHidden) { - ProgramList EPG = m_db.GetGuide(channel.iUniqueId, iStart, iEnd); - + EPGInfoMap EPG = m_db.GetGuide(channel.iUniqueId, iStart, iEnd); // Transfer EPG for the given channel - for (ProgramList::iterator it = EPG.begin(); it != EPG.end(); ++it) + for (EPGInfoMap::reverse_iterator it = EPG.rbegin(); it != EPG.rend(); ++it) { EPG_TAG tag; memset(&tag, 0, sizeof(EPG_TAG)); + tag.startTime = it->first; + tag.endTime = it->second.EndTime(); + // Reject bad entry + if (tag.endTime <= tag.startTime) + continue; - tag.iUniqueBroadcastId = (it->starttime << 16) + (it->channum & 0xFFFF); - tag.iChannelNumber = it->channum; - tag.startTime = it->starttime; - tag.endTime = it->endtime; - - CStdString title = it->title; - CStdString subtitle = it->subtitle; - if (!subtitle.IsEmpty()) - title += SUBTITLE_SEPARATOR + subtitle; + // EPG_TAG expects strings as char* and not as copies (like the other PVR types). + // Therefore we have to make sure that we don't pass invalid (freed) memory to TransferEpgEntry. + // In particular we have to use local variables and must not pass returned CStdString values directly. + CStdString title; + CStdString description; + CStdString category; + + tag.iUniqueBroadcastId = MakeBroadcastID(it->second.ChannelID(), it->second.StartTime()); + tag.iChannelNumber = it->second.ChannelNumberInt(); + title = this->MakeProgramTitle(it->second.Title(), it->second.Subtitle()); tag.strTitle = title; - tag.strPlot = it->description; + description = it->second.Description(); + tag.strPlot = description; - int genre = m_categories.Category(it->category); + int genre = m_categories.Category(it->second.Category()); tag.iGenreSubType = genre & 0x0F; tag.iGenreType = genre & 0xF0; - tag.strGenreDescription = it->category; + category = it->second.Category(); + tag.strGenreDescription = category; // Unimplemented tag.strEpisodeName = ""; @@ -321,9 +274,10 @@ XBMC->Log(LOG_DEBUG, "%s - radio: %s", __FUNCTION__, (bRadio ? "true" : "false")); LoadChannelsAndChannelGroups(); + m_PVRChannelUidById.clear(); - // Create a set to merge channels with same channum and callsign - std::set > channelIdentifiers; + // Create a map<(channum, callsign), chanid> to merge channels with same channum and callsign + std::map, unsigned int> channelIdentifiers; // Transfer channels of the requested type (radio / tv) for (ChannelIdMap::iterator it = m_channelsById.begin(); it != m_channelsById.end(); ++it) @@ -331,13 +285,18 @@ if (it->second.IsRadio() == bRadio && !it->second.IsNull()) { // Skip channels with same channum and callsign - std::pair channelIdentifier = make_pair(it->second.Number(), it->second.Callsign()); - if (channelIdentifiers.find(channelIdentifier) != channelIdentifiers.end()) + std::pair channelIdentifier = std::make_pair(it->second.Number(), it->second.Callsign()); + std::map, unsigned int>::iterator itm = channelIdentifiers.find(channelIdentifier); + if (itm != channelIdentifiers.end()) { XBMC->Log(LOG_DEBUG, "%s - skipping channel: %d", __FUNCTION__, it->second.ID()); + // Map channel with merged channel + m_PVRChannelUidById.insert(std::make_pair(it->first, itm->second)); continue; } - channelIdentifiers.insert(channelIdentifier); + channelIdentifiers.insert(std::make_pair(channelIdentifier, it->first)); + // Map channel to itself + m_PVRChannelUidById.insert(std::make_pair(it->first, it->first)); PVR_CHANNEL tag; memset(&tag, 0, sizeof(PVR_CHANNEL)); @@ -348,7 +307,7 @@ tag.bIsHidden = !it->second.Visible(); tag.bIsRadio = it->second.IsRadio(); - CStdString icon = GetArtWork(FileOps::FileTypeChannelIcon, it->second.Icon()); + CStdString icon = m_fileOps->GetChannelIconPath(it->second.Icon()); PVR_STRCPY(tag.strIconPath, icon); // Unimplemented @@ -435,7 +394,7 @@ memset(&tag, 0, sizeof(PVR_CHANNEL_GROUP_MEMBER)); tag.iChannelNumber = channelNumber++; - tag.iChannelUniqueId = channelIt->second.ID(); + tag.iChannelUniqueId = FindPVRChannelUid(channelIt->second.ID()); PVR_STRCPY(tag.strGroupName, group.strGroupName); PVR->TransferChannelGroupMember(handle, &tag); } @@ -460,13 +419,27 @@ m_channelGroups = m_db.GetChannelGroups(); } +int PVRClientMythTV::FindPVRChannelUid(int channelId) const +{ + PVRChannelMap::const_iterator it = m_PVRChannelUidById.find(channelId); + if (it != m_PVRChannelUidById.end()) + return it->second; + return -1; // PVR dummy channel UID +} + +void PVRClientMythTV::UpdateRecordings() +{ + PVR->TriggerRecordingUpdate(); +} + int PVRClientMythTV::GetRecordingsAmount(void) { int res = 0; if (g_bExtraDebug) XBMC->Log(LOG_DEBUG, "%s", __FUNCTION__); - m_recordingsLock.Lock(); + CLockObject lock(m_recordingsLock); + if (m_recordings.empty()) // Load recorings list res = FillRecordings(); @@ -478,7 +451,6 @@ res++; } } - m_recordingsLock.Unlock(); if (res == 0) XBMC->Log(LOG_INFO, "%s: No recording", __FUNCTION__); return res; @@ -489,7 +461,8 @@ if (g_bExtraDebug) XBMC->Log(LOG_DEBUG, "%s", __FUNCTION__); - m_recordingsLock.Lock(); + CLockObject lock(m_recordingsLock); + if (m_recordings.empty()) // Load recorings list FillRecordings(); @@ -504,15 +477,13 @@ PVR_RECORDING tag; memset(&tag, 0, sizeof(PVR_RECORDING)); - tag.recordingTime = it->second.StartTime(); + tag.recordingTime = it->second.RecordingStartTime(); tag.iDuration = it->second.Duration(); tag.iPlayCount = it->second.IsWatched() ? 1 : 0; + tag.iLastPlayedPosition = GetRecordingLastPlayedPosition(it->second); CStdString id = it->second.UID(); - CStdString title = it->second.Title(); - CStdString subtitle = it->second.Subtitle(); - if (!subtitle.IsEmpty()) - title += SUBTITLE_SEPARATOR + subtitle; + CStdString title = this->MakeProgramTitle(it->second.Title(), it->second.Subtitle()); PVR_STRCPY(tag.strRecordingId, id); PVR_STRCPY(tag.strTitle, title); @@ -531,13 +502,19 @@ // Images CStdString strIconPath; if (!it->second.Coverart().IsEmpty()) - strIconPath = GetArtWork(FileOps::FileTypeCoverart, it->second.Coverart()); + strIconPath = m_fileOps->GetArtworkPath(it->second.Coverart(), FileOps::FileTypeCoverart); + else if (it->second.IsLiveTV()) + { + MythChannel channel = FindRecordingChannel(it->second); + if (!channel.IsNull()) + strIconPath = m_fileOps->GetChannelIconPath(channel.Icon()); + } else - strIconPath = m_fileOps->GetPreviewIconPath(it->second.IconPath(), it->second.RecordingGroup()); + strIconPath = m_fileOps->GetPreviewIconPath(it->second.IconPath(), it->second.StorageGroup()); CStdString strFanartPath; if (!it->second.Fanart().IsEmpty()) - strFanartPath = GetArtWork(FileOps::FileTypeFanart, it->second.Fanart()); + strFanartPath = m_fileOps->GetArtworkPath(it->second.Fanart(), FileOps::FileTypeFanart); PVR_STRCPY(tag.strIconPath, strIconPath.c_str()); PVR_STRCPY(tag.strThumbnailPath, strIconPath.c_str()); @@ -552,7 +529,6 @@ PVR->TransferRecordingEntry(handle, &tag); } } - m_recordingsLock.Unlock(); if (g_bExtraDebug) XBMC->Log(LOG_DEBUG, "%s - Done", __FUNCTION__); @@ -696,9 +672,11 @@ // Fill artworks for (ProgramInfoMap::iterator it = m_recordings.begin(); it != m_recordings.end(); ++it) { - if (!it->second.IsNull() && it->second.IsVisible()) + if (!it->second.IsNull() && it->second.IsVisible() && !it->second.IsLiveTV()) + { m_db.FillRecordingArtwork(it->second); res++; + } } return res; } @@ -712,6 +690,17 @@ ProgramInfoMap::iterator it = m_recordings.find(recording.strRecordingId); if (it != m_recordings.end()) { + // Deleting Live recording is prohibited. Otherwise continue + if (this->IsMyLiveTVRecording(it->second)) + { + if (it->second.IsLiveTV()) + return PVR_ERROR_RECORDING_RUNNING; + // it is kept then ignore it now. + if (KeepLiveTVRecording(it->second, false) && m_rec.SetLiveRecording(false)) + return PVR_ERROR_NO_ERROR; + else + return PVR_ERROR_FAILED; + } bool ret = m_con.DeleteRecording(it->second); if (ret) { @@ -730,6 +719,44 @@ return PVR_ERROR_FAILED; } +PVR_ERROR PVRClientMythTV::DeleteAndForgetRecording(const PVR_RECORDING &recording) +{ + XBMC->Log(LOG_DEBUG, "%s", __FUNCTION__); + + CLockObject lock(m_recordingsLock); + + ProgramInfoMap::iterator it = m_recordings.find(recording.strRecordingId); + if (it != m_recordings.end()) + { + // Deleting Live recording is prohibited. Otherwise continue + if (this->IsMyLiveTVRecording(it->second)) + { + if (it->second.IsLiveTV()) + return PVR_ERROR_RECORDING_RUNNING; + // it is kept then ignore it now. + if (KeepLiveTVRecording(it->second, false) && m_rec.SetLiveRecording(false)) + return PVR_ERROR_NO_ERROR; + else + return PVR_ERROR_FAILED; + } + bool ret = m_con.DeleteAndForgetRecording(it->second); + if (ret) + { + XBMC->Log(LOG_DEBUG, "%s - Deleted and forget recording %s", __FUNCTION__, recording.strRecordingId); + return PVR_ERROR_NO_ERROR; + } + else + { + XBMC->Log(LOG_ERROR, "%s - Failed to delete recording %s", __FUNCTION__, recording.strRecordingId); + } + } + else + { + XBMC->Log(LOG_ERROR, "%s - Recording %s does not exist", __FUNCTION__, recording.strRecordingId); + } + return PVR_ERROR_FAILED; +} + PVR_ERROR PVRClientMythTV::SetRecordingPlayCount(const PVR_RECORDING &recording, int count) { XBMC->Log(LOG_DEBUG, "%s", __FUNCTION__); @@ -807,22 +834,15 @@ return PVR_ERROR_FAILED; } -int PVRClientMythTV::GetRecordingLastPlayedPosition(const PVR_RECORDING &recording) +int PVRClientMythTV::GetRecordingLastPlayedPosition(MythProgramInfo &programInfo) { // MythTV provides it's bookmarks as frame offsets whereas XBMC expects a time offset. // The bookmark in seconds is calculated by: bookmark = frameOffset / frameRate. int bookmark = 0; - if (g_bExtraDebug) - { - XBMC->Log(LOG_DEBUG, "%s - Reading Bookmark for: %s", __FUNCTION__, recording.strTitle); - } - - CLockObject lock(m_recordingsLock); - ProgramInfoMap::iterator it = m_recordings.find(recording.strRecordingId); - if (it != m_recordings.end() && it->second.HasBookmark()) + if (programInfo.HasBookmark()) { - long long frameOffset = m_con.GetBookmark(it->second); // returns 0 if no bookmark was found + long long frameOffset = m_con.GetBookmark(programInfo); // returns 0 if no bookmark was found if (frameOffset > 0) { if (g_bExtraDebug) @@ -830,9 +850,9 @@ XBMC->Log(LOG_DEBUG, "%s - FrameOffset: %lld)", __FUNCTION__, frameOffset); } // Pin framerate value - if (it->second.FrameRate() <0) - it->second.SetFrameRate(m_db.GetRecordingFrameRate(it->second)); - float frameRate = (float)it->second.FrameRate() / 1000.0f; + if (programInfo.FrameRate() < 0) + programInfo.SetFrameRate(m_db.GetRecordingFrameRate(programInfo)); + float frameRate = (float)programInfo.FrameRate() / 1000.0f; if (frameRate > 0) { bookmark = (int)((float)frameOffset / frameRate); @@ -845,103 +865,275 @@ } else { - if (it == m_recordings.end()) - { - XBMC->Log(LOG_ERROR, "%s - Recording %s does not exist", __FUNCTION__, recording.strRecordingId); - } - else if (!it->second.HasBookmark() && g_bExtraDebug) + if (g_bExtraDebug) { - XBMC->Log(LOG_DEBUG, "%s - Recording %s has no bookmark", __FUNCTION__, recording.strRecordingId); + XBMC->Log(LOG_DEBUG, "%s - Recording %s has no bookmark", __FUNCTION__, programInfo.Title().c_str()); } - return bookmark; } if (bookmark < 0) bookmark = 0; return bookmark; } -int PVRClientMythTV::GetTimersAmount(void) +PVR_ERROR PVRClientMythTV::GetRecordingEdl(const PVR_RECORDING &recording, PVR_EDL_ENTRY entries[], int *size) { if (g_bExtraDebug) - XBMC->Log(LOG_DEBUG, "%s", __FUNCTION__); + { + XBMC->Log(LOG_DEBUG, "%s - Reading edl for: %s", __FUNCTION__, recording.strTitle); + } + + CLockObject lock(m_recordingsLock); + ProgramInfoMap::iterator it = m_recordings.find(recording.strRecordingId); + if (it == m_recordings.end()) + { + XBMC->Log(LOG_DEBUG, "%s - Recording %s does not exist", __FUNCTION__, recording.strRecordingId); + *size = 0; + return PVR_ERROR_FAILED; + } + + bool useFrameRate = true; + float frameRate = 0.0f; + int64_t psoffset, nsoffset; + + if (m_db.GetSchemaVersion() >= 1309) + { + if (m_db.GetRecordingSeekOffset(it->second, MARK_DURATION_MS, 0, &psoffset, &nsoffset) > 0) + { + // mark 33 found for recording. no need convertion using framerate. + useFrameRate = false; + } + else + { + XBMC->Log(LOG_DEBUG, "%s - Missing recordedseek map, try running 'mythcommflag --rebuild' for recording %s", __FUNCTION__, recording.strRecordingId); + XBMC->Log(LOG_DEBUG, "%s - Fallback using framerate ...", __FUNCTION__); + } + } + if (useFrameRate) + { + frameRate = m_db.GetRecordingFrameRate(it->second) / 1000.0f; + if (frameRate <= 0) + { + XBMC->Log(LOG_DEBUG, "%s - Failed to read framerate for %s", __FUNCTION__, recording.strRecordingId); + *size = 0; + return PVR_ERROR_FAILED; + } + } + + Edl commbreakList = m_con.GetCommbreakList(it->second); + int commbreakCount = commbreakList.size(); + XBMC->Log(LOG_DEBUG, "%s - Found %d commercial breaks for: %s", __FUNCTION__, commbreakCount, recording.strTitle); + + Edl cutList = m_con.GetCutList(it->second); + XBMC->Log(LOG_DEBUG, "%s - Found %d cut list entries for: %s", __FUNCTION__, cutList.size(), recording.strTitle); + + commbreakList.insert(commbreakList.end(), cutList.begin(), cutList.end()); + + int index = 0; + Edl::const_iterator edlIt; + for (edlIt = commbreakList.begin(); edlIt != commbreakList.end(); ++edlIt) + { + if (index < *size) + { + int64_t start, end; + start = end = 0; + + // Pull the closest match in the DB if it exists + if (useFrameRate) + { + start = (int64_t)(edlIt->start_mark / frameRate * 1000); + end = (int64_t)(edlIt->end_mark / frameRate * 1000); + XBMC->Log(LOG_DEBUG, "%s - start_mark: %lld, end_mark: %lld, start: %lld, end: %lld", __FUNCTION__, edlIt->start_mark, edlIt->end_mark, start, end); + } + else + { + // mask == 1 ==> Found before the mark (use psoffset, nsoffset is zero) + // mask == 2 ==> Found after the mark (use nsoffset, psoffset is zero) + // mask == 3 ==> Found around the mark (use nsoffset [next offset / later] for start, psoffset [prev. offset / before] for end) + int mask = m_db.GetRecordingSeekOffset(it->second, MARK_DURATION_MS, edlIt->start_mark, &psoffset, &nsoffset); + XBMC->Log(LOG_DEBUG, "%s - start_mark offset mask: %d, psoffset: %"PRId64", nsoffset: %"PRId64, __FUNCTION__, mask, psoffset, nsoffset); + if (mask > 0) + { + if (mask == 1) + start = psoffset; + else if (edlIt->start_mark == 0) + start = 0; + else + start = nsoffset; + + mask = m_db.GetRecordingSeekOffset(it->second, MARK_DURATION_MS, edlIt->end_mark, &psoffset, &nsoffset); + XBMC->Log(LOG_DEBUG, "%s - end_mark offset mask: %d, psoffset: %"PRId64", nsoffset: %"PRId64, __FUNCTION__, mask, psoffset, nsoffset); + if (mask == 2) + end = nsoffset; + else if (mask == 1 || mask == 3) + end = psoffset; + else + // By forcing the end to be zero, it will never be > start, which makes the values invalid + // This is only for failed lookups for the end position + end = 0; + } + if (mask <= 0) + XBMC->Log(LOG_DEBUG, "%s - Failed to retrieve recordedseek offset values", __FUNCTION__); + } + + if (start < end) + { + // We have both a valid start and end value now + XBMC->Log(LOG_DEBUG, "%s - start_mark: %"PRId64", end_mark: %"PRId64", start: %"PRId64", end: %"PRId64, __FUNCTION__, edlIt->start_mark, edlIt->end_mark, start, end); + PVR_EDL_ENTRY entry; + entry.start = start; + entry.end = end; + entry.type = index < commbreakCount ? PVR_EDL_TYPE_COMBREAK : PVR_EDL_TYPE_CUT; + entries[index] = entry; + index++; + } + else + XBMC->Log(LOG_DEBUG, "%s - invalid offset: start_mark: %"PRId64", end_mark: %"PRId64", start: %"PRId64", end: %"PRId64, __FUNCTION__, edlIt->start_mark, edlIt->end_mark, start, end); + } + else + { + XBMC->Log(LOG_ERROR, "%s - Maximum number of edl entries reached for %s", __FUNCTION__, recording.strTitle); + break; + } + } - RecordingRuleMap timers = m_db.GetRecordingRules(); - return timers.size(); + *size = index; + return PVR_ERROR_NO_ERROR; } -PVR_ERROR PVRClientMythTV::GetTimers(ADDON_HANDLE handle) +int PVRClientMythTV::GetRecordingLastPlayedPosition(const PVR_RECORDING &recording) { + // MythTV provides it's bookmarks as frame offsets whereas XBMC expects a time offset. + // The bookmark in seconds is calculated by: bookmark = frameOffset / frameRate. + int bookmark = 0; + if (g_bExtraDebug) - XBMC->Log(LOG_DEBUG, "%s", __FUNCTION__); + { + XBMC->Log(LOG_DEBUG, "%s - Reading Bookmark for: %s", __FUNCTION__, recording.strTitle); + } - RecordingRuleMap rules = m_db.GetRecordingRules(); - m_recordingRules.clear(); + CLockObject lock(m_recordingsLock); + ProgramInfoMap::iterator it = m_recordings.find(recording.strRecordingId); + if (it != m_recordings.end()) + bookmark = GetRecordingLastPlayedPosition(it->second); + else + XBMC->Log(LOG_ERROR, "%s - Recording %s does not exist", __FUNCTION__, recording.strRecordingId); - for (RecordingRuleMap::iterator it = rules.begin(); it != rules.end(); ++it) - m_recordingRules.push_back(it->second); + return bookmark; +} - //Search for modifiers and add links to them - for (RecordingRuleList::iterator it = m_recordingRules.begin(); it != m_recordingRules.end(); ++it) - if (it->Type() == MythRecordingRule::DontRecord || it->Type() == MythRecordingRule::OverrideRecord) - for (RecordingRuleList::iterator it2 = m_recordingRules.begin(); it2 != m_recordingRules.end(); ++it2) - if (it2->Type() != MythRecordingRule::DontRecord && it2->Type() != MythRecordingRule::OverrideRecord) - if (it->SameTimeslot(*it2) && !it->GetParent()) - { - it2->AddOverrideRule(*it); - it->SetParent(*it2); - } +MythChannel PVRClientMythTV::FindRecordingChannel(MythProgramInfo &programInfo) +{ + ChannelIdMap::iterator channelByIdIt = m_channelsById.find(programInfo.ChannelID()); + if (channelByIdIt != m_channelsById.end()) + { + return channelByIdIt->second; + } + return MythChannel(); +} - ProgramInfoMap upcomingRecordings = m_con.GetPendingPrograms(); - for (ProgramInfoMap::iterator it = upcomingRecordings.begin(); it != upcomingRecordings.end(); ++it) +bool PVRClientMythTV::IsMyLiveTVRecording(MythProgramInfo& programInfo) +{ + if (!programInfo.IsNull()) { - // When deleting a timer from mythweb, it might happen that it's removed from database - // but it's still present over mythprotocol. Skip those timers, because timers.at would crash. - if (rules.count(it->second.RecordID()) == 0) + if (!m_rec.IsNull() && m_rec.IsRecording()) { - XBMC->Log(LOG_DEBUG, "%s - Skipping timer that is no more in database", __FUNCTION__); - continue; + MythProgramInfo currentProgram = m_rec.GetCurrentProgram(); + if (currentProgram == programInfo) + return true; } + } + return false; +} + +bool PVRClientMythTV::KeepLiveTVRecording(MythProgramInfo &programInfo, bool keep) +{ + bool retval = m_db.KeepLiveTVRecording(programInfo, keep); + if (retval) + { + // Force an update to get new status of the recording + CLockObject lock(m_recordingsLock); + ProgramInfoMap::iterator it = m_recordings.find(programInfo.UID()); + if (it != m_recordings.end()) + { + ForceUpdateRecording(it); + // On keep query to generate the preview. + if (keep) + { + m_con.GenerateRecordingPreview(it->second); + } + } + return true; + } + + XBMC->Log(LOG_ERROR, "%s - Failed to keep live recording '%s'", __FUNCTION__, (keep ? "true" : "false")); + return false; +} + +void PVRClientMythTV::UpdateSchedules() +{ + m_scheduleManager->Update(); + PVR->TriggerTimerUpdate(); +} + +int PVRClientMythTV::GetTimersAmount(void) +{ + if (g_bExtraDebug) + XBMC->Log(LOG_DEBUG, "%s", __FUNCTION__); + + ScheduleList upcomingRecordings = m_scheduleManager->GetUpcomingRecordings(); + return upcomingRecordings.size(); +} + +PVR_ERROR PVRClientMythTV::GetTimers(ADDON_HANDLE handle) +{ + if (g_bExtraDebug) + XBMC->Log(LOG_DEBUG, "%s", __FUNCTION__); + m_PVRtimerMemorandum.clear(); + + ScheduleList upcomingRecordings = m_scheduleManager->GetUpcomingRecordings(); + for (ScheduleList::iterator it = upcomingRecordings.begin(); it != upcomingRecordings.end(); ++it) + { PVR_TIMER tag; memset(&tag, 0, sizeof(PVR_TIMER)); - tag.startTime= it->second.RecordingStartTime(); - tag.endTime = it->second.RecordingEndTime(); - tag.iClientChannelUid = it->second.ChannelID(); - tag.iClientIndex = it->second.RecordID(); - tag.iMarginEnd = rules.at(it->second.RecordID()).EndOffset(); - tag.iMarginStart = rules.at(it->second.RecordID()).StartOffset(); - tag.iPriority = it->second.Priority(); - tag.bIsRepeating = false; - tag.firstDay = 0; - tag.iWeekdays = 0; - - int genre = m_categories.Category(it->second.Category()); + CStdString rulemarker = ""; + tag.startTime = it->second->StartTime(); + tag.endTime = it->second->EndTime(); + tag.iClientChannelUid = FindPVRChannelUid(it->second->ChannelID()); + tag.iPriority = it->second->Priority(); + int genre = m_categories.Category(it->second->Category()); tag.iGenreSubType = genre & 0x0F; tag.iGenreType = genre & 0xF0; - // Title - CStdString title = it->second.Title(); - CStdString subtitle = it->second.Subtitle(); - if (!subtitle.IsEmpty()) - title += SUBTITLE_SEPARATOR + subtitle; - - if (title.IsEmpty()) - { - MythProgram epgProgram; - bool hasEpgProgram = m_db.FindProgram(tag.startTime, tag.iClientChannelUid, "%", &epgProgram); - if (hasEpgProgram) - title = epgProgram.title; + // Fill info from recording rule if possible + boost::shared_ptr node = m_scheduleManager->FindRuleById(it->second->RecordID()); + if (node) + { + MythRecordingRule rule = node->GetRule(); + RuleMetadata meta = m_scheduleManager->GetMetadata(rule); + tag.iMarginEnd = rule.EndOffset(); + tag.iMarginStart = rule.StartOffset(); + tag.firstDay = it->second->RecordingStartTime(); + tag.bIsRepeating = meta.isRepeating; + tag.iWeekdays = meta.weekDays; + if (*(meta.marker)) + rulemarker.append("(").append(meta.marker).append(")"); + } + else + { + // Default rule info + tag.iMarginEnd = 0; + tag.iMarginStart = 0; + tag.firstDay = 0; + tag.bIsRepeating = false; + tag.iWeekdays = 0; } - PVR_STRCPY(tag.strTitle, title); - - // Summary - PVR_STRCPY(tag.strSummary, it->second.Description()); - // Status + // Status: Match recording status with PVR_TIMER status if (g_bExtraDebug) - XBMC->Log(LOG_DEBUG,"%s ## - State: %d - ##", __FUNCTION__, it->second.Status()); - switch (it->second.Status()) + XBMC->Log(LOG_DEBUG,"%s ## - State: %d - ##", __FUNCTION__, it->second->Status()); + switch (it->second->Status()) { case RS_RECORDING: tag.state = PVR_TIMER_STATE_RECORDING; @@ -955,6 +1147,7 @@ case RS_RECORDED: tag.state = PVR_TIMER_STATE_COMPLETED; break; + case RS_EARLIER_RECORDING: case RS_WILL_RECORD: tag.state = PVR_TIMER_STATE_SCHEDULED; break; @@ -967,24 +1160,41 @@ case RS_LOW_DISKSPACE: tag.state = PVR_TIMER_STATE_ERROR; break; + case RS_UNKNOWN: + rulemarker.append("(").append(XBMC->GetLocalizedString(30309)).append(")"); // Not recording + // If there is a rule then check its state + if (node && node->IsInactiveRule()) + tag.state = PVR_TIMER_STATE_CANCELLED; + else + // Nothing really scheduled. Waiting for upcoming... + tag.state = PVR_TIMER_STATE_NEW; + break; default: tag.state = PVR_TIMER_STATE_CANCELLED; break; } + // Title + // Must contain the original title at the begining. + // String will be compare with EPG title to check if it is custom or not. + CStdString title = it->second->Title(); + if (!rulemarker.empty()) + title.append(" ").append(rulemarker); + PVR_STRCPY(tag.strTitle, this->MakeProgramTitle(title, it->second->Subtitle())); + + // Summary + PVR_STRCPY(tag.strSummary, it->second->Description()); + // Unimplemented - tag.iEpgUid=0; - tag.iLifetime=0; + tag.iEpgUid = 0; + tag.iLifetime = 0; PVR_STRCPY(tag.strDirectory, ""); - // Recording rules - RecordingRuleList::iterator recRule = std::find(m_recordingRules.begin(), m_recordingRules.end() , it->second.RecordID()); - tag.iClientIndex = ((recRule - m_recordingRules.begin()) << 16) + recRule->size(); - //recRule->SaveTimerString(tag); - std::pair rrtmp(tag, it->second); - recRule->push_back(rrtmp); - - PVR->TransferTimerEntry(handle,&tag); + tag.iClientIndex = it->first; + PVR->TransferTimerEntry(handle, &tag); + // Add it to memorandom: cf UpdateTimer() + boost::shared_ptr pTag = boost::shared_ptr(new PVR_TIMER(tag)); + m_PVRtimerMemorandum.insert(std::make_pair(tag.iClientIndex, pTag)); } if (g_bExtraDebug) @@ -996,17 +1206,36 @@ PVR_ERROR PVRClientMythTV::AddTimer(const PVR_TIMER &timer) { XBMC->Log(LOG_DEBUG, "%s - title: %s, start: %ld, end: %ld, chanID: %u", __FUNCTION__, timer.strTitle, timer.startTime, timer.endTime, timer.iClientChannelUid); + CLockObject lock(m_lock); + // Check if our timer is a quick recording of live tv + // Assumptions: Timer start time = 0, and our live recorder is locked on the same channel. + // If true then keep recording, setup recorder and let the backend handle the rule. + if (timer.startTime == 0 && !m_rec.IsNull() && m_rec.IsRecording()) + { + MythProgramInfo currentProgram = m_rec.GetCurrentProgram(); + if ((unsigned int)timer.iClientChannelUid == currentProgram.ChannelID()) + { + XBMC->Log(LOG_DEBUG, "%s - Timer is a quick recording. Toggling Record on", __FUNCTION__); + if (m_rec.IsLiveRecording()) + XBMC->Log(LOG_NOTICE, "%s - Record already on! Retrying...", __FUNCTION__); + if (KeepLiveTVRecording(currentProgram, true) && m_rec.SetLiveRecording(true)) + return PVR_ERROR_NO_ERROR; + else + // Supress error notification! XBMC locks if we return an error here. + return PVR_ERROR_NO_ERROR; + } + } - MythRecordingRule rule; - - // Fill rule with timer data - PVRtoMythRecordingRule(timer, rule); - - if (!m_db.AddRecordingRule(rule)) - return PVR_ERROR_FAILED; + // Otherwise create the rule to schedule record + XBMC->Log(LOG_DEBUG, "%s - Creating new recording rule", __FUNCTION__); + MythScheduleManager::MSM_ERROR ret; - if (!m_con.UpdateSchedules(rule.RecordID())) + MythRecordingRule rule = PVRtoMythRecordingRule(timer); + ret = m_scheduleManager->ScheduleRecording(rule); + if (ret == MythScheduleManager::MSM_ERROR_FAILED) return PVR_ERROR_FAILED; + if (ret == MythScheduleManager::MSM_ERROR_NOT_IMPLEMENTED) + return PVR_ERROR_REJECTED; XBMC->Log(LOG_DEBUG, "%s - Done - %d", __FUNCTION__, rule.RecordID()); @@ -1019,224 +1248,214 @@ PVR_ERROR PVRClientMythTV::DeleteTimer(const PVR_TIMER &timer, bool bForceDelete) { (void)bForceDelete; - - XBMC->Log(LOG_DEBUG, "%s - title: %s, start: %ld, end: %ld, chanID: %u", __FUNCTION__, timer.strTitle, timer.startTime, timer.endTime, timer.iClientChannelUid); - - RecordingRule rule = m_recordingRules[(timer.iClientIndex)>>16]; - if (rule.GetParent()) - rule = *rule.GetParent(); - - // Delete related override rules - std::vector overrideRules = rule.GetOverrideRules(); - for (std::vector::iterator it = overrideRules.begin(); it != overrideRules.end(); ++it) + // Check if our timer is related to rule for live recording: + // Assumptions: Recorder handle same recording. + // If true then expire recording, setup recorder and let backend handle the rule. { - // Stop recording scheduled by the override rule before delete - for (std::vector >::iterator ip = (*it)->begin(); ip != (*it)->end(); ++ip) + CLockObject lock(m_lock); + if (!m_rec.IsNull() && m_rec.IsLiveRecording()) { - XBMC->Log(LOG_DEBUG, "%s - recording %s, status = %d", __FUNCTION__, (ip->second).UID().c_str(), (ip->second).Status()); - if ((ip->second).Status() == RS_RECORDING || (ip->second).Status() == RS_TUNING) + boost::shared_ptr recording = m_scheduleManager->FindUpComingByIndex(timer.iClientIndex); + if (recording && this->IsMyLiveTVRecording(*recording)) { - XBMC->Log(LOG_DEBUG, "%s - Stop recording %s", __FUNCTION__, (ip->second).UID().c_str()); - m_con.StopRecording(ip->second); + XBMC->Log(LOG_DEBUG, "%s - Timer %i is a quick recording. Toggling Record off", __FUNCTION__, timer.iClientIndex); + if (KeepLiveTVRecording(*recording, false) && m_rec.SetLiveRecording(false)) + return PVR_ERROR_NO_ERROR; + else + return PVR_ERROR_FAILED; } } - XBMC->Log(LOG_DEBUG, "%s - Delete recording rule %u (modifier of rule %u)", __FUNCTION__, (*it)->RecordID(), rule.RecordID()); - if (!m_db.DeleteRecordingRule((*it)->RecordID())) - return PVR_ERROR_FAILED; - } - - // Delete parent rule - for (std::vector >::iterator ip = rule.begin(); ip != rule.end(); ++ip) - { - // Stop recording scheduled by the parent rule - XBMC->Log(LOG_DEBUG, "%s - recording %s, status = %d", __FUNCTION__, (ip->second).UID().c_str(), (ip->second).Status()); - if ((ip->second).Status() == RS_RECORDING || (ip->second).Status() == RS_TUNING) - { - XBMC->Log(LOG_DEBUG, "%s - Stop recording %s", __FUNCTION__, (ip->second).UID().c_str()); - m_con.StopRecording(ip->second); - } } - XBMC->Log(LOG_DEBUG, "%s - Delete recording rule %u", __FUNCTION__, rule.RecordID()); - if (!m_db.DeleteRecordingRule(rule.RecordID())) - return PVR_ERROR_FAILED; - - m_con.UpdateSchedules(-1); - XBMC->Log(LOG_DEBUG, "%s - Done", __FUNCTION__); + // Otherwise delete scheduled rule + XBMC->Log(LOG_DEBUG, "%s - Deleting timer %i", __FUNCTION__, timer.iClientIndex); + MythScheduleManager::MSM_ERROR ret; - PVR->TriggerTimerUpdate(); + ret = m_scheduleManager->DeleteRecording(timer.iClientIndex); + if (ret == MythScheduleManager::MSM_ERROR_FAILED) + return PVR_ERROR_FAILED; + if (ret == MythScheduleManager::MSM_ERROR_NOT_IMPLEMENTED) + return PVR_ERROR_NOT_IMPLEMENTED; return PVR_ERROR_NO_ERROR; } -void PVRClientMythTV::PVRtoMythRecordingRule(const PVR_TIMER timer, MythRecordingRule &rule) +MythRecordingRule PVRClientMythTV::PVRtoMythRecordingRule(const PVR_TIMER &timer) { - MythProgram program; - bool programFound = m_db.FindProgram(timer.startTime, timer.iClientChannelUid, "%", &program); + MythRecordingRule rule; + MythEPGInfo epgInfo; + bool epgFound = false; + time_t st = timer.startTime; + time_t et = timer.endTime; + time_t now = time(NULL); + CStdString title = timer.strTitle; + CStdString cs; - // Load rule template from selected provider - switch (g_iRecTemplateType) - { - case 1: // Template provider is 'MythTV', then load the template from backend. - if (programFound) - rule = m_db.LoadRecordingRuleTemplate(program.category, program.category_type); - else - rule = m_db.LoadRecordingRuleTemplate("", ""); - break; - case 0: // Template provider is 'Internal', then set rule with settings - rule.SetAutoCommFlag(g_bRecAutoCommFlag); - rule.SetAutoMetadata(g_bRecAutoMetadata); - rule.SetAutoTranscode(g_bRecAutoTranscode); - rule.SetUserJob(1, g_bRecAutoRunJob1); - rule.SetUserJob(2, g_bRecAutoRunJob2); - rule.SetUserJob(3, g_bRecAutoRunJob3); - rule.SetUserJob(4, g_bRecAutoRunJob4); - rule.SetAutoExpire(g_bRecAutoExpire); - rule.SetTranscoder(g_iRecTranscoder); - } + ChannelIdMap::iterator channelIt = m_channelsById.find(timer.iClientChannelUid); + if (channelIt != m_channelsById.end()) + cs = channelIt->second.Callsign(); - // Override template with PVR settings - rule.SetStartOffset(timer.iMarginStart); - rule.SetEndOffset(timer.iMarginEnd); - rule.SetPriority(timer.iPriority); + // Fix timeslot as needed + if (st == 0) + st = now; + if (et < st) + { + struct tm oldtm; + struct tm newtm; + localtime_r(&et, &oldtm); + localtime_r(&st, &newtm); + newtm.tm_hour = oldtm.tm_hour; + newtm.tm_min = oldtm.tm_min; + newtm.tm_sec = oldtm.tm_sec; + newtm.tm_mday++; + et = mktime(&newtm); + } - // Category override - if (programFound) + // Depending of timer type, create the best rule + if (timer.bIsRepeating) { - CStdString overTimeCategory = m_db.GetSetting("OverTimeCategory"); - if (!overTimeCategory.IsEmpty() && (overTimeCategory.Equals(program.category) || overTimeCategory.Equals(program.category_type))) + if (timer.iWeekdays < 0x7F && timer.iWeekdays > 0) + { + // Move time to next day of week and find program info + // Then create a WEEKLY record rule + for (int bDay = 0; bDay < 7; bDay++) + { + if ((timer.iWeekdays & (1 << bDay)) != 0) + { + int n = (((bDay + 1) % 7) - weekday(&st) + 7) % 7; + struct tm stm; + struct tm etm; + localtime_r(&st, &stm); + localtime_r(&et, &etm); + stm.tm_mday += n; + etm.tm_mday += n; + st = mktime(&stm); + et = mktime(&etm); + break; + } + } + if (m_db.FindProgram(st, timer.iClientChannelUid, "%", epgInfo) && title.compare(0, epgInfo.Title().length(), epgInfo.Title()) == 0) + epgFound = true; + else + epgInfo = MythEPGInfo(); + rule = m_scheduleManager->NewWeeklyRecord(epgInfo); + } + else if (timer.iWeekdays == 0x7F) { - CStdString categoryOverTime = m_db.GetSetting("CategoryOverTime"); - XBMC->Log(LOG_DEBUG, "Overriding end offset for category %s: +%s", overTimeCategory.c_str(), categoryOverTime.c_str()); - rule.SetEndOffset(rule.EndOffset() + atoi(categoryOverTime)); + // Create a DAILY record rule + if (m_db.FindProgram(st, timer.iClientChannelUid, "%", epgInfo) && title.compare(0, epgInfo.Title().length(), epgInfo.Title()) == 0) + epgFound = true; + else + epgInfo = MythEPGInfo(); + rule = m_scheduleManager->NewDailyRecord(epgInfo); } } - - // If we have an entry in the EPG for the timer, we use it to set title and subtitle from it - // PVR_TIMER has no subtitle thus might send it encoded within the title. - if (programFound) - { - rule.SetSearchType(MythRecordingRule::NoSearch); - rule.SetTitle(program.title); - rule.SetSubtitle(program.subtitle); - rule.SetCategory(program.category); - } else { - // kManualSearch = http://www.gossamer-threads.com/lists/mythtv/dev/155150?search_string=kManualSearch;#155150 - rule.SetSearchType(MythRecordingRule::ManualSearch); - rule.SetTitle(timer.strTitle); - rule.SetCategory(m_categories.Category(timer.iGenreType)); + // Find the program info at the given start time with the same title + // When no entry was found with the same title, then the record rule type is manual + if (m_db.FindProgram(st, timer.iClientChannelUid, "%", epgInfo) && title.compare(0, epgInfo.Title().length(), epgInfo.Title()) == 0) + epgFound = true; + else + epgInfo = MythEPGInfo(); + // Create a SIGNLE record rule + rule = m_scheduleManager->NewSingleRecord(epgInfo); } - rule.SetDescription(timer.strSummary); - rule.SetChannelID(timer.iClientChannelUid); - rule.SetStartTime((timer.startTime == 0 ? time(NULL) : timer.startTime)); - rule.SetEndTime(timer.endTime); - rule.SetInactive(timer.state == PVR_TIMER_STATE_ABORTED || timer.state == PVR_TIMER_STATE_CANCELLED); - - ChannelIdMap::iterator channelIt = m_channelsById.find(timer.iClientChannelUid); - if (channelIt != m_channelsById.end()) - rule.SetCallsign(channelIt->second.Callsign()); - if (timer.bIsRepeating) + if (!epgFound) { - if (timer.iWeekdays == 0x7F) - rule.SetType(MythRecordingRule::TimeslotRecord); - else - rule.SetType(MythRecordingRule::WeekslotRecord); + rule.SetStartTime(st); + rule.SetEndTime(et); + rule.SetTitle(timer.strTitle); + rule.SetCategory(m_categories.Category(timer.iGenreType)); + rule.SetChannelID(timer.iClientChannelUid); + rule.SetCallsign(cs); } else { - rule.SetType(MythRecordingRule::SingleRecord); + XBMC->Log(LOG_DEBUG,"%s - Found program: %u %lu %s", __FUNCTION__, epgInfo.ChannelID(), epgInfo.StartTime(), epgInfo.Title().c_str()); } + // Override template with PVR settings + rule.SetStartOffset(rule.StartOffset() + timer.iMarginStart); + rule.SetEndOffset(rule.EndOffset() + timer.iMarginEnd); + rule.SetPriority(timer.iPriority); + rule.SetInactive(timer.state == PVR_TIMER_STATE_ABORTED || timer.state == PVR_TIMER_STATE_CANCELLED); + return rule; } PVR_ERROR PVRClientMythTV::UpdateTimer(const PVR_TIMER &timer) { XBMC->Log(LOG_DEBUG, "%s - title: %s, start: %ld, end: %ld, chanID: %u", __FUNCTION__, timer.strTitle, timer.startTime, timer.endTime, timer.iClientChannelUid); - RecordingRule oldRule = m_recordingRules[(timer.iClientIndex) >> 16]; - PVR_TIMER oldTimer = oldRule[(timer.iClientIndex) & 0xffff].first; - { - bool createNewRule = false; - bool createNewOverrideRule = false; - MythRecordingRule rule; - PVRtoMythRecordingRule(timer, rule); - rule.SetDescription(oldTimer.strSummary); // Fix broken description - rule.SetInactive(false); - rule.SetRecordID(oldRule.RecordID()); - - // These should trigger a manual search or a new rule - if (oldTimer.iClientChannelUid != timer.iClientChannelUid || - oldTimer.endTime != timer.endTime || - oldTimer.startTime != timer.startTime || - strcmp(oldTimer.strTitle, timer.strTitle) || - timer.bIsRepeating - ) - createNewRule = true; + MythScheduleManager::MSM_ERROR ret = MythScheduleManager::MSM_ERROR_NOT_IMPLEMENTED; + unsigned char diffmask = 0; - // Change type - if (oldTimer.state != timer.state) - { - if (rule.Type() != MythRecordingRule::SingleRecord && !createNewRule) - { - if (timer.state == PVR_TIMER_STATE_ABORTED || timer.state == PVR_TIMER_STATE_CANCELLED) - rule.SetType(MythRecordingRule::DontRecord); - else - rule.SetType(MythRecordingRule::OverrideRecord); - createNewOverrideRule = true; - } - else - rule.SetInactive(timer.state == PVR_TIMER_STATE_ABORTED || timer.state == PVR_TIMER_STATE_CANCELLED); - } - - // These can be updated without triggering a new rule - if (oldTimer.iMarginEnd != timer.iMarginEnd || - oldTimer.iPriority != timer.iPriority || - oldTimer.iMarginStart != timer.iMarginStart) - createNewOverrideRule = true; - - CStdString title = timer.strTitle; - if (createNewRule) - rule.SetSearchType(m_db.FindProgram(timer.startTime, timer.iClientChannelUid, title, NULL) ? MythRecordingRule::NoSearch : MythRecordingRule::ManualSearch); - if (createNewOverrideRule && oldRule.SearchType() == MythRecordingRule::ManualSearch) - rule.SetSearchType(MythRecordingRule::ManualSearch); - - if (oldRule.Type() == MythRecordingRule::DontRecord || oldRule.Type() == MythRecordingRule::OverrideRecord) - createNewOverrideRule = false; - - if (createNewRule && oldRule.Type() != MythRecordingRule::SingleRecord) - { - if (!m_db.AddRecordingRule(rule)) - return PVR_ERROR_FAILED; - - MythRecordingRule mtold; - PVRtoMythRecordingRule(oldTimer, mtold); - mtold.SetType(MythRecordingRule::DontRecord); - mtold.SetInactive(false); - mtold.SetRecordID(oldRule.RecordID()); - int id = oldRule.RecordID(); - if (oldRule.Type() == MythRecordingRule::DontRecord || oldRule.Type() == MythRecordingRule::OverrideRecord) - m_db.UpdateRecordingRule(mtold); - else - id = m_db.AddRecordingRule(mtold); // Blocks old record rule - m_con.UpdateSchedules(id); - } - else if (createNewOverrideRule && oldRule.Type() != MythRecordingRule::SingleRecord ) + enum + { + CTState = 0x01, // State has changed + CTEnabled = 0x02, // The new state + CTTimer = 0x04 // Timer has changed + }; + + // Get the extent of changes for original timer + std::map >::const_iterator old = m_PVRtimerMemorandum.find(timer.iClientIndex); + if (old == m_PVRtimerMemorandum.end()) + return PVR_ERROR_INVALID_PARAMETERS; + else + { + if (old->second->iClientChannelUid != timer.iClientChannelUid) + diffmask |= CTTimer; + if (old->second->bIsRepeating != timer.bIsRepeating || old->second->iWeekdays != timer.iWeekdays) + diffmask |= CTTimer; + if (old->second->startTime != timer.startTime || old->second->endTime != timer.endTime) + diffmask |= CTTimer; + if (old->second->iPriority != timer.iPriority) + diffmask |= CTTimer; + if (strcmp(old->second->strTitle, timer.strTitle) != 0) + diffmask |= CTTimer; + if ((old->second->state == PVR_TIMER_STATE_ABORTED || old->second->state == PVR_TIMER_STATE_CANCELLED) + && timer.state != PVR_TIMER_STATE_ABORTED && timer.state != PVR_TIMER_STATE_CANCELLED) + diffmask |= CTState | CTEnabled; + if (old->second->state != PVR_TIMER_STATE_ABORTED && old->second->state != PVR_TIMER_STATE_CANCELLED + && (timer.state == PVR_TIMER_STATE_ABORTED || timer.state == PVR_TIMER_STATE_CANCELLED)) + diffmask |= CTState; + } + + if (diffmask == 0) + return PVR_ERROR_NO_ERROR; + + if ((diffmask & CTState) && (diffmask & CTEnabled)) + { + // Timer was disabled and will be enabled. Update timer rule before enabling. + // Update would failed if rule is an override. So continue anyway and enable. + if ((diffmask & CTTimer)) { - if (rule.Type() != MythRecordingRule::DontRecord && rule.Type() != MythRecordingRule::OverrideRecord) - rule.SetType(MythRecordingRule::OverrideRecord); - if (!m_db.AddRecordingRule(rule)) - return PVR_ERROR_FAILED; + MythRecordingRule rule = PVRtoMythRecordingRule(timer); + ret = m_scheduleManager->UpdateRecording(timer.iClientIndex, rule); } else - { - if (!m_db.UpdateRecordingRule(rule)) - return PVR_ERROR_FAILED; - } - m_con.UpdateSchedules(rule.RecordID()); + ret = MythScheduleManager::MSM_ERROR_SUCCESS; + if (ret != MythScheduleManager::MSM_ERROR_FAILED) + ret = m_scheduleManager->EnableRecording(timer.iClientIndex); + } + else if ((diffmask & CTState) && !(diffmask & CTEnabled)) + { + // Timer was enabled and will be disabled. Disabling could be overriden rule. + // So don't check timer update, disable only. + ret = m_scheduleManager->DisableRecording(timer.iClientIndex); + } + else if (!(diffmask & CTState) && (diffmask & CTTimer)) + { + // State doesn't change. + MythRecordingRule rule = PVRtoMythRecordingRule(timer); + ret = m_scheduleManager->UpdateRecording(timer.iClientIndex, rule); } + if (ret == MythScheduleManager::MSM_ERROR_FAILED) + return PVR_ERROR_FAILED; + if (ret == MythScheduleManager::MSM_ERROR_NOT_IMPLEMENTED) + return PVR_ERROR_NOT_IMPLEMENTED; + XBMC->Log(LOG_DEBUG,"%s - Done", __FUNCTION__); return PVR_ERROR_NO_ERROR; } @@ -1306,6 +1525,8 @@ if (m_rec.SpawnLiveTV((*channelByNumberIt).second)) { + if(g_bDemuxing) + m_demux = new Demux(m_rec); XBMC->Log(LOG_DEBUG, "%s - Done", __FUNCTION__); return true; } @@ -1346,11 +1567,16 @@ if (!m_rec.Stop()) XBMC->Log(LOG_NOTICE, "%s - Stop live stream failed", __FUNCTION__); m_rec = MythRecorder(); - + m_pEventHandler->SetRecordingListener("", m_file); m_pEventHandler->SetRecorder(m_rec); m_pEventHandler->DisablePlayback(); m_pEventHandler->AllowLiveChainUpdate(); + if (m_demux) + { + delete m_demux; + m_demux = NULL; + } // Resume fileOps m_fileOps->Resume(); @@ -1365,8 +1591,6 @@ if (g_bExtraDebug) XBMC->Log(LOG_DEBUG, "%s - size: %u", __FUNCTION__, iBufferSize); - CLockObject lock(m_lock); - if (m_rec.IsNull()) return -1; @@ -1383,8 +1607,6 @@ if (g_bExtraDebug) XBMC->Log(LOG_DEBUG, "%s", __FUNCTION__); - CLockObject lock(m_lock); - if (m_rec.IsNull()) return -1; @@ -1394,33 +1616,34 @@ bool PVRClientMythTV::SwitchChannel(const PVR_CHANNEL &channelinfo) { + bool retval; + if (g_bExtraDebug) XBMC->Log(LOG_DEBUG, "%s - chanID: %u", __FUNCTION__, channelinfo.iUniqueId); - bool retval; + if (m_rec.IsNull()) + { + XBMC->Log(LOG_ERROR, "%s: No recorder", __FUNCTION__); + return false; + } - //Close current live stream for reopening - //Keep playback mode enabled + // Keep playback mode enabled m_pEventHandler->PreventLiveChainUpdate(); - retval = m_rec.Stop(); - m_rec = MythRecorder(); + m_pEventHandler->SetRecordingListener("", m_file); m_pEventHandler->SetRecorder(m_rec); m_pEventHandler->AllowLiveChainUpdate(); - - //Try to reopen live stream + if (m_demux) + { + delete m_demux; + m_demux = NULL; + } + // Try to reopen live stream if (retval) retval = OpenLiveStream(channelinfo); - if (!retval) - { XBMC->Log(LOG_ERROR, "%s - Failed to reopening Livestream", __FUNCTION__); - m_fileOps->Resume(); - } - - if (g_bExtraDebug) - XBMC->Log(LOG_DEBUG, "%s - Done", __FUNCTION__); return retval; } @@ -1430,8 +1653,6 @@ if (g_bExtraDebug) XBMC->Log(LOG_DEBUG, "%s - pos: %lld, whence: %d", __FUNCTION__, iPosition, iWhence); - CLockObject lock(m_lock); - if (m_rec.IsNull()) return -1; @@ -1456,8 +1677,6 @@ if (g_bExtraDebug) XBMC->Log(LOG_DEBUG, "%s", __FUNCTION__); - CLockObject lock(m_lock); - if (m_rec.IsNull()) return -1; @@ -1493,8 +1712,8 @@ ID.Format("Myth Recorder %u", signal.ID()); CStdString strAdapterStatus = signal.AdapterStatus(); - strcpy(signalStatus.strAdapterName, ID.Buffer()); - strcpy(signalStatus.strAdapterStatus, strAdapterStatus.Buffer()); + PVR_STRCPY(signalStatus.strAdapterName, ID); + PVR_STRCPY(signalStatus.strAdapterStatus, strAdapterStatus); if (g_bExtraDebug) XBMC->Log(LOG_DEBUG, "%s - Done", __FUNCTION__); @@ -1502,6 +1721,67 @@ return PVR_ERROR_NO_ERROR; } +PVR_ERROR PVRClientMythTV::GetStreamProperties(PVR_STREAM_PROPERTIES* pProperties) +{ + return m_demux && m_demux->GetStreamProperties(pProperties) ? PVR_ERROR_NO_ERROR : PVR_ERROR_SERVER_ERROR; +} + +void PVRClientMythTV::DemuxAbort(void) +{ + if (m_demux) + m_demux->Abort(); +} + +void PVRClientMythTV::DemuxFlush(void) +{ + if (m_demux) + m_demux->Flush(); +} + +DemuxPacket* PVRClientMythTV::DemuxRead(void) +{ + return m_demux ? m_demux->Read() : NULL; +} + +bool PVRClientMythTV::SeekTime(int time, bool backwards, double* startpts) +{ + return m_demux ? m_demux->SeekTime(time, backwards, startpts) : false; +} + +time_t PVRClientMythTV::GetPlayingTime() +{ + CLockObject lock(m_lock); + if (m_rec.IsNull() || !m_demux) + return 0; + int sec = m_demux->GetPlayingTime() / 1000; + time_t st = GetBufferTimeStart(); + struct tm playtm; + localtime_r(&st, &playtm); + playtm.tm_sec += sec; + time_t pt = mktime(&playtm); + return pt; +} + +time_t PVRClientMythTV::GetBufferTimeStart() +{ + CLockObject lock(m_lock); + if (m_rec.IsNull() || m_rec.GetLiveTVChainLast() < 0) + return 0; + MythProgramInfo prog = m_rec.GetLiveTVChainProgram(0); + return prog.RecordingStartTime(); +} + +time_t PVRClientMythTV::GetBufferTimeEnd() +{ + CLockObject lock(m_lock); + int last; + if (m_rec.IsNull() || (last = m_rec.GetLiveTVChainLast()) < 0) + return 0; + time_t now = time(NULL); + MythProgramInfo prog = m_rec.GetLiveTVChainProgram(last); + return (now > prog.RecordingEndTime() ? prog.RecordingEndTime() : now); +} + bool PVRClientMythTV::OpenRecordedStream(const PVR_RECORDING &recording) { if (g_bExtraDebug) @@ -1528,7 +1808,7 @@ // Future implementations could request the stream from slaves if not available on the master. // Create dedicated control connection for file playback; smart pointer deletes it when file gets deleted. - MythConnection fileControlConnection(g_szMythHostname, g_iMythPort); + MythConnection fileControlConnection(g_szMythHostname, g_iMythPort, true); if (!fileControlConnection.IsNull()) m_file = fileControlConnection.ConnectFile(it->second); @@ -1614,9 +1894,104 @@ return retval; } -PVR_ERROR PVRClientMythTV::CallMenuHook(const PVR_MENUHOOK &menuhook) +PVR_ERROR PVRClientMythTV::CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_MENUHOOK_DATA &item) { - (void)menuhook; + if (menuhook.iHookId == MENUHOOK_REC_DELETE_AND_RERECORD && item.cat == PVR_MENUHOOK_RECORDING) { + return DeleteAndForgetRecording(item.data.recording); + } + + if (menuhook.iHookId == MENUHOOK_KEEP_LIVETV_RECORDING && item.cat == PVR_MENUHOOK_RECORDING) + { + CLockObject lock(m_recordingsLock); + ProgramInfoMap::iterator it = m_recordings.find(item.data.recording.strRecordingId); + if (it == m_recordings.end()) + { + XBMC->Log(LOG_ERROR,"%s - Recording not found", __FUNCTION__); + return PVR_ERROR_INVALID_PARAMETERS; + } + + if (!it->second.IsLiveTV()) + return PVR_ERROR_NO_ERROR; + + // If recording is current live show then keep it and set live recorder + if (IsMyLiveTVRecording(it->second)) + { + if (KeepLiveTVRecording(it->second, true) && m_rec.SetLiveRecording(true)) + return PVR_ERROR_NO_ERROR; + return PVR_ERROR_FAILED; + } + // Else keep old live recording + else + { + if (KeepLiveTVRecording(it->second, true)) + { + CStdString info = XBMC->GetLocalizedString(menuhook.iLocalizedStringId); + info.append(": ").append(it->second.Title()); + XBMC->QueueNotification(QUEUE_INFO, info.c_str()); + return PVR_ERROR_NO_ERROR; + } + } + return PVR_ERROR_FAILED; + } + + if (menuhook.category == PVR_MENUHOOK_SETTING) + { + if (menuhook.iHookId == MENUHOOK_SHOW_HIDE_NOT_RECORDING && m_scheduleManager) + { + bool flag = m_scheduleManager->ToggleShowNotRecording(); + UpdateSchedules(); + CStdString info = (flag ? XBMC->GetLocalizedString(30310) : XBMC->GetLocalizedString(30311)); + XBMC->QueueNotification(QUEUE_INFO, info.c_str()); + return PVR_ERROR_NO_ERROR; + } + } + + if (menuhook.category == PVR_MENUHOOK_EPG && item.cat == PVR_MENUHOOK_EPG) + { + time_t attime; + unsigned int chanid; + BreakBroadcastID(item.data.iEpgUid, &chanid, &attime); + MythEPGInfo epgInfo; + if (m_db.FindCurrentProgram(attime, chanid, epgInfo)) + { + // Scheduling actions + if (m_scheduleManager) + { + MythRecordingRule rule; + switch(menuhook.iHookId) + { + case MENUHOOK_EPG_REC_CHAN_ALL_SHOWINGS: + rule = m_scheduleManager->NewChannelRecord(epgInfo); + break; + case MENUHOOK_EPG_REC_CHAN_WEEKLY: + rule = m_scheduleManager->NewWeeklyRecord(epgInfo); + break; + case MENUHOOK_EPG_REC_CHAN_DAILY: + rule = m_scheduleManager->NewDailyRecord(epgInfo); + break; + case MENUHOOK_EPG_REC_ONE_SHOWING: + rule = m_scheduleManager->NewOneRecord(epgInfo); + break; + case MENUHOOK_EPG_REC_NEW_EPISODES: + rule = m_scheduleManager->NewChannelRecord(epgInfo); + rule.SetFilter(rule.Filter() | MythRecordingRule::FM_FirstShowing); + break; + default: + return PVR_ERROR_NOT_IMPLEMENTED; + } + if (m_scheduleManager->ScheduleRecording(rule) == MythScheduleManager::MSM_ERROR_SUCCESS) + return PVR_ERROR_NO_ERROR; + } + } + else + { + XBMC->QueueNotification(QUEUE_WARNING, XBMC->GetLocalizedString(30312)); + XBMC->Log(LOG_DEBUG, "%s - broadcast: %d chanid: %u attime: %lu", __FUNCTION__, item.data.iEpgUid, chanid, attime); + return PVR_ERROR_INVALID_PARAMETERS; + } + return PVR_ERROR_FAILED; + } + return PVR_ERROR_NOT_IMPLEMENTED; } @@ -1642,19 +2017,48 @@ } } -CStdString PVRClientMythTV::GetArtWork(FileOps::FileType storageGroup, const CStdString &shwTitle) +CStdString PVRClientMythTV::MakeProgramTitle(const CStdString &title, const CStdString &subtitle) const { - if (storageGroup == FileOps::FileTypeCoverart || storageGroup == FileOps::FileTypeFanart) - { - return m_fileOps->GetArtworkPath(shwTitle, storageGroup); - } - else if (storageGroup == FileOps::FileTypeChannelIcon) - { - return m_fileOps->GetChannelIconPath(shwTitle); - } + CStdString epgtitle; + if (subtitle.IsEmpty()) + epgtitle = title; else - { - XBMC->Log(LOG_DEBUG, "%s - ## Not a valid storageGroup ##", __FUNCTION__); - return ""; - } + epgtitle = title + SUBTITLE_SEPARATOR + subtitle; + return epgtitle; +} + +// Broacast ID is 32 bits integer and allows to identify a EPG item. +// MythTV backend doesn't provide one. So we make it encoding time and channel +// as below: +// 31. . . . . . . . . . . . . . . 15. . . . . . . . . . . . . . 0 +// [ timecode (self-relative) ][ channel Id ] +// Timecode is the count of minutes since epoch modulo 0xFFFF. Now therefore it +// is usable for a period of +/- 32767 minutes (+/-22 days) around itself. + +int PVRClientMythTV::MakeBroadcastID(unsigned int chanid, time_t starttime) const +{ + int timecode = (int)(difftime(starttime, 0) / 60) & 0xFFFF; + return (int)((timecode << 16) | (chanid & 0xFFFF)); +} + +void PVRClientMythTV::BreakBroadcastID(int broadcastid, unsigned int* chanid, time_t* attime) const +{ + time_t now; + int ntc, ptc, distance; + struct tm epgtm; + + now = time(NULL); + ntc = (int)(difftime(now, 0) / 60) & 0xFFFF; + ptc = (broadcastid >> 16) & 0xFFFF; // removes arithmetic bits + if (ptc > ntc) + distance = (ptc - ntc) < 0x8000 ? ptc - ntc : ptc - ntc - 0xFFFF; + else + distance = (ntc - ptc) < 0x8000 ? ptc - ntc : ptc - ntc + 0xFFFF; + localtime_r(&now, &epgtm); + epgtm.tm_min += distance; + // Time precision is minute, so we are looking for program started before next minute. + epgtm.tm_sec = 59; + + *attime = mktime(&epgtm); + *chanid = (unsigned int)broadcastid & 0xFFFF; } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/pvrclient-mythtv.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/pvrclient-mythtv.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/pvrclient-mythtv.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/pvrclient-mythtv.h 2014-01-28 20:43:50.000000000 +0000 @@ -21,38 +21,11 @@ #include "cppmyth.h" #include "fileOps.h" #include "categories.h" +#include "demux.h" #include #include -class RecordingRule : public MythRecordingRule, public std::vector > -{ -public: - RecordingRule(const MythRecordingRule &rule); - RecordingRule& operator=(const MythRecordingRule &rule); - bool operator==(const unsigned int &id); - - RecordingRule* GetParent() const; - void SetParent(RecordingRule &parent); - - bool HasOverrideRules() const; - std::vector GetOverrideRules() const; - void AddOverrideRule(RecordingRule &overrideRule); - - bool SameTimeslot(RecordingRule &rule) const; - - void push_back(std::pair &_val); - -private: - void SaveTimerString(PVR_TIMER &timer); - - RecordingRule* m_parent; - std::vector m_overrideRules; - std::vector > m_stringStore; -}; - -typedef std::vector RecordingRuleList; - class PVRClientMythTV : public MythEventObserver { public: @@ -65,6 +38,8 @@ const char *GetBackendVersion(); const char *GetConnectionString(); bool GetDriveSpace(long long *iTotal, long long *iUsed); + void OnSleep(); + void OnWake(); // EPG PVR_ERROR GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart, time_t iEnd); @@ -79,14 +54,18 @@ PVR_ERROR GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group); // Recordings + void UpdateRecordings(); int GetRecordingsAmount(void); PVR_ERROR GetRecordings(ADDON_HANDLE handle); PVR_ERROR DeleteRecording(const PVR_RECORDING &recording); + PVR_ERROR DeleteAndForgetRecording(const PVR_RECORDING &recording); PVR_ERROR SetRecordingPlayCount(const PVR_RECORDING &recording, int count); PVR_ERROR SetRecordingLastPlayedPosition(const PVR_RECORDING &recording, int lastplayedposition); int GetRecordingLastPlayedPosition(const PVR_RECORDING &recording); + PVR_ERROR GetRecordingEdl(const PVR_RECORDING &recording, PVR_EDL_ENTRY entries[], int *size); // Timers + void UpdateSchedules(); int GetTimersAmount(); PVR_ERROR GetTimers(ADDON_HANDLE handle); PVR_ERROR AddTimer(const PVR_TIMER &timer); @@ -103,6 +82,16 @@ long long LengthLiveStream(); PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS &signalStatus); + PVR_ERROR GetStreamProperties(PVR_STREAM_PROPERTIES* pProperties); + void DemuxAbort(void); + void DemuxFlush(void); + DemuxPacket* DemuxRead(void); + bool SeekTime(int time, bool backwards, double *startpts); + + time_t GetPlayingTime(); + time_t GetBufferTimeStart(); + time_t GetBufferTimeEnd(); + // Recording playback bool OpenRecordedStream(const PVR_RECORDING &recinfo); void CloseRecordedStream(); @@ -111,7 +100,7 @@ long long LengthRecordedStream(); // Menu hook - PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook); + PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_MENUHOOK_DATA &item); // Backend settings bool GetLiveTVPriority(); @@ -126,6 +115,7 @@ FileOps *m_fileOps; PLATFORM::CMutex m_lock; MythFile m_file; + MythScheduleManager *m_scheduleManager; CStdString m_backendName; CStdString m_backendVersion; @@ -138,7 +128,13 @@ ChannelIdMap m_channelsById; ChannelNumberMap m_channelsByNumber; ChannelGroupMap m_channelGroups; + typedef std::map PVRChannelMap; + PVRChannelMap m_PVRChannelUidById; void LoadChannelsAndChannelGroups(); + int FindPVRChannelUid(int channelId) const; + + // Demuxer TS + Demux *m_demux; // Recordings ProgramInfoMap m_recordings; @@ -146,10 +142,27 @@ void EventUpdateRecordings(); void ForceUpdateRecording(ProgramInfoMap::iterator it); int FillRecordings(); + int GetRecordingLastPlayedPosition(MythProgramInfo &programInfo); + MythChannel FindRecordingChannel(MythProgramInfo &programInfo); + bool IsMyLiveTVRecording(MythProgramInfo &programInfo); + bool KeepLiveTVRecording(MythProgramInfo &programInfo, bool keep); // Timers - RecordingRuleList m_recordingRules; - void PVRtoMythRecordingRule(const PVR_TIMER timer, MythRecordingRule &rule); + MythRecordingRule PVRtoMythRecordingRule(const PVR_TIMER &timer); + std::map > m_PVRtimerMemorandum; - CStdString GetArtWork(FileOps::FileType storageGroup, const CStdString &shwTitle); + /** + * \brief Returns full title of MythTV program + * + * Make formatted title based on original title and subtitle of program. + * \see class MythProgramInfo , class MythEPGInfo + */ + CStdString MakeProgramTitle(const CStdString &title, const CStdString &subtitle) const; + + /** + * + * \brief Handle broadcast UID for MythTV program + */ + int MakeBroadcastID(unsigned int chanid, time_t starttime) const; + void BreakBroadcastID(int broadcastid, unsigned int *chanid, time_t *starttime) const; }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/tools.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/tools.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.mythtv.cmyth/src/tools.h 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mythtv.cmyth/src/tools.h 2014-01-04 10:28:12.000000000 +0000 @@ -24,14 +24,14 @@ #include #endif -int inline daytime(time_t *time) +inline int daytime(time_t *time) { struct tm* ptm = localtime(time); - int retval = ptm->tm_sec * 60 + ptm->tm_min * 60 + ptm->tm_hour; + int retval = ptm->tm_sec + ptm->tm_min * 60 + ptm->tm_hour * 3600; return retval; } -int inline weekday(time_t *time) +inline int weekday(time_t *time) { struct tm* ptm = localtime(time); int retval = ptm->tm_wday; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/addon.xml.in xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/addon.xml.in --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/addon.xml.in 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/addon.xml.in 2014-05-04 06:40:43.000000000 +0000 @@ -1,43 +1,55 @@ - + XBMC voorprogram vir die NextPVR XBMC frontend for the NextPVR - Frontal XBMC pel NextPVR + XBMC клиент за NextPVR + Interfície de l'XBMC pel NextPVR Rozhraní XBMC pro NextPVR + Blaen XBMC ar gyfer NextPVR XBMC frontend til NextPVR - XBMC-Frontend für NextPVR + XBMC Oberfläche für NextPVR Frontend του XBMC για το NextPVR XBMC frontend for the NextPVR + XBMC frontend for the NextPVR Front-end de XBMC para NextPVR Front-end de XBMC para NextPVR XBMC esi NextPVR'ile Applicatif XBMC pour l'enregistreur NextPVR + Frontal XBMC pour NextPVR Interface de XBMC para NextPVR ממשק קדמי XBMC עבור NextPVR + XBMC sučelje za NextPVR XBMC NextPVR előtér-kiszolgáló + Frontend XBMC untuk NextPVR Frontend XBMC per NextPVR NextPVR 用 XBMC フロントエンド + XBMC-ის სამომხმარებლო მხარე NextPVR-თვის NextPVR을 위한 XBMC 프론트엔드 XBMC sąsaja dėl/su NextPVR + XBMC galasistēma NextPVR XBMC интерфејс за NextPVR + Bahagian hadapan XBMC untuk NextPVR + XBMC ၏ frontend အတွက် NextPVR XBMC frontend voor de NextPVR - Interfejs XBMC dla NextPVR + XBMC sitt frontend for NextPVR + Klient XBMC dla NextPVR Frontend XBMC para NextPVR XBMC Frontend para o NextPVR Interfața XBMC pentru NextPVR @@ -45,29 +57,44 @@ XBMC rozhranie pre NextPVR XBMC-jev vmesnik za NextPVR XBMC-frontend för NextPVR - XBMC的NextPVR前端 + NextPVR காண XBMC முன்நிலை + Накладка XBMC для NextPVR + Giao tiếp XBMC cho NextPVR + XBMC 的 NextPVR 前端 + NextPVR的XBMC前端 NextPVR voorprogram. Ondersteun stroom van Lewendige TV & Opnames, luister na Radio kanale en EPG. NextPVR frontend. Supports streaming of Live TV & Recordings, listening to Radio channels and EPG. - Frontal NextPVR. Suporta fluxes de TV en directe i enregistraments, escoltes de ràdiio i EPG. + NextPVR клиент. Поддържа стрийминг и записване на телевизия, слушане на радио канали и електронен програмен справочник. + Interfície per el NextPVR. Suporta fluxes de TV en directe i enregistraments, escolta de canals de ràdio i EPG. Rozhraní NextPVR. Podporuje proudové vysílání živého vysílání a nahrávek, poslech kanálů rádia a EPG. + Blaen NextPVR. Mae'n cynnal ffrydio Teledu Byw a Recordiadau, gwrando ar sianeli Radio ac Amserlen Rhaglenni. NextPVR frontend; understøtter streaming af TV og Optagelser, Radiokanaler og EPG. - Erlaubt die Wiedergabe von Live TV und Aufnahmen mittels NextPVR auf XBMC. Desweiteren werden Radio-Kanäle und EPG unterstützt. + NextPVR Oberfläche. Unterstützt Live TV & Aufnahmen, Radioknaäle und EPG. Frontend για το NextPVR. Υποστηρίζει ροές Live TV & Εγγραφές, ακρόαση Ραδιοφώνου και EPG. NextPVR frontend. Supports streaming of Live TV & Recordings, listening to Radio channels and EPG. + NextPVR frontend. Supports streaming of Live TV & Recordings, listening to Radio channels and EPG. Front-end de NextPVR. Soporta transmisiones de TV en Vivo y Grabaciones, escuchar canales de Radio y Guía Electrónica de Programas (EPG). Front-end de NextPVR. Soporta transmisiones de TV en Vivo y Grabaciones, escuchar canales de Radio y Guía Electrónica de Programas (EPG). NextPVR esi. Toetab telekanalite striimimist ja salvestamist, raadio kuulamist ja elektroonilist saatekava. Applicatif XBMC pour NextPVR. Supporte la lecture en continu de direct TV et l'enregistrement, l'écoute de radios et les guides de programmes. - Interface de NextPVR. Compatíbel coa transmisión de TV ao vivo, gravacións e escoita de canles de radio e EPG. + Frontal de numériscope pour NextPVR, prenant en charge les télés en direct & les enregistrements, l'écoute de chaînes radio, et le GÉP. + Interface de NextPVR. Compatíbel coa transmisión de TV ao vivo, gravacións e escoita de canles de radio e Guía. ממשק קדמי NextPVR.תומך בשידורים חיים והקלטות של טלוויזיה ורדיו ולוחות שידורים + NextPVR sučelje. Podržava stremanje i snimanje TV programa, slušanje radio programa i elektronski programski vodič (EPG). NextPVR előtér-kiszolgáló. Élő adások, felvételek és rádió csatornák sugárzásának támogatása EPG-vel + Frontend NextPVR. Mendukung pengaliran Siaran TV langsung dan perekaman, mendengarkan radio dan EPG. Frontend NextPVR. Supporta lo streaming di Live TV, le registrazioni, l'ascolto dei canali radio e l'EPG. NextPVR フロントエンドです。Live TV や録画番組のストリーミング、ラジオチャンネルの視聴、EPG をサポートしています。 + NextPVR სამომხმარებლო მხარე მხარს უჭერს Live TV-ის და ჩანაწერებს, რადიოს და EPG. NextPVR 프론트엔드. 라이브 TV 스트리밍과 녹화, 라디오 청취, EPG를 지원합니다. NextPVR sąsaja remia transliacijos Live TV & Įrašus, klausytis radijo kanalus per EPG + NextPVR galasistēma. Atbalsta tiešraides TV un ierakstu straumēšanu, radio kanālu klausīšanos un EPG. NextPVR интерфејс. Подржува стриминг на Live TV и снимања, слушање радио канали и ЕПГ + Bahagian hadapan NextPVR; menyokong penstirman TV Langsung & Rakaman, mendengar saluran Radio dan EPG. + NextPVR frontend. Live TV နှင့် Recordings ၊ ရေဒီယိုလှိုင်းများကို နားဆင်ခြင်း ၊ EPG စသည်တို့ကို ထောက်ပံ့ပေးသည်။ NextPVR frontend. Ondersteunt streaming van Live TV & Recordings, het luisteren naar Radio kanalen en EPG. - Warstwa prezentacji NextPVR. Wspiera strumieniowanie TV na żywo i nagrywanie, słuchanie radia oraz EPG. + NextPVR frontend. Støtter visning av direkte TV og opptak, lytting til radiokanaler og EPG. + Klient NextPVR. Wspiera strumieniowanie telewizji i nagrywanie, słuchanie radia oraz funkcje Przewodnika TV. Frontend NextPVR. Suporta transmissão de Live TV e Gravações, ouvir estações de Rádio e EPG. NextPVR Frontend. Suporta streaming de TV ao Vivo e Gravações, ouvir canais de rádio e EPG. Interfața NextPVR. Suporta streaming Live TV, inregistrari, radio și gid electronic de programe @@ -75,30 +102,44 @@ NextPVR rozhranie. Podporuje streamovanie živého televízneho vysielania a nahrávok, počúvanie rozhlasových kanálov a EPG. Vmesnik za NextPVR; podpira pretakanje televizije v živo & posnetkov, poslušanje radia in EPG. NextPVR-frontend. Stödjer strömning av direktsänd TV & inspelningar, lyssna på radiokanaler och EPG. - Tvheadend前端,支持直播电视播放和录制、收听电台和电子节目单 + NextPVR முன்நிலை. லைவ் டிவி & பதிவுகளின் ஸ்ட்ரீமிங் செய்யவும், ரேடியோ சேனல்கள் கேட்கவும் மற்றும் EPG, துணைபுரிகிறது. + Накладка для NextPVR. Підтримує потокове Live TV & запис, прослуховування радіо каналів і телегід. + Giao tiếp NextPVR. Hỗ trợ truyền phát và thu chương trình Live TV, nghe Radio và hiển thị lịch trình chiếu (EPG). + NextPVR 前端。支持直播电视和录像流媒体、收听电台和电子节目单。 + NextPVR前端。支援的串流媒體包括有:直播電視和錄影,收聽廣播頻道和電子節目表。 Hierdie is werk in vordering. Gebruik op jou eie risiko. This is a work in progress. Use at your own risk. - Això és un treball en curs. Utilitzau baix la vostra responsabilitat. + Разработката на програмата не е завършена. Използвайте на свой собствен риск. + Això és un treball en curs. Utilitzeu-lo sota la vostra responsabilitat. Práce na tomto rozhraní stále probíhají. Používejte na vlastní nebezpečí. + Mae hwn i gyd ar waith. Ar eich menter eich hun. Dette er igangværende arbejde. Brug på eget ansvar. - Befindet sich noch in Entwicklung. Benutzung auf eigene Gefahr! + Dieses Addon befindet sich noch in der Entwicklung. Benutzung auf eigene Gefahr! Έργο υπό ανάπτυξη. Χρησιμοποιήστε το υπ' ευθύνη σας. This is a work in progress. Use at your own risk. + This is a work in progress. Use at your own risk. Este es un trabajo en desarrollo. Úsalo bajo tu responsabilidad. Este es un trabajo en desarrollo. Usarlo bajo propio riesgo. Este es un trabajo en curso. Úsalo bajo tu propio riesgo. See on pooleliolev töö. Kasutada omal vastutusel. Logiciel en cours d'élaboration. À utiliser à vos risques et périls. + Ceci est un travail en cours. Utiliser à vos propres risques. Aínda se está no desenvolvemento. Usar baixo o seu propio risco. פרויקט זה הנו בתהליך מתמשך.השתמש על אחריותך בלבד. + NextPVR PVR klijent je je još uvijek pod razvojem. Koristite ga na vlastitu odgovornost. Fejlesztés alatt! A saját felelősségére használja! + Ini adalah proyek yang masih berjalan. Resiko ditanggung sendiri. Questo è un lavoro in corso d'opera. Utilizzalo a tuo rischio e pericolo. これは現在開発中のプログラムです。利用は自己責任でお願いします。 + ჩადგმა დამუშავების პროცესშია, გამოიყენეთ საკუთარი რისკის ფასად 아직 개발 진행중입니다. 부족한 부분이 있을 수 있습니다. Tai yra nestabili programinė įranga! Autorius jokiu būdu neatsakingas už nepavykusius įrašus, neteisingus laikmačius, iššvaistytas valandas, ar nutikus kitiems nepageidaujamiems poveikiams ...[COLOR=red](xbmc.lt siūlo/rekomenduoja testuojant šį priedą persijungti į Anglų [orinali] kalbą)[/COLOR] Ова е работа која се извршува. Користи на сопствен ризик. + Ia masih dalam pembangunan. Guna atas risiko sendiri. + အသုံးပြုရန် လုပ်ဆောင်နေခြင်းဖြစ်သည်။ ကိုယ့်တာဝန်ကိုယ်ယူပြီး အသုံးပြုပါ။ Hier wordt aan gewerkt, Gebruik op eigen risico. - Ten projekt jest w trakcie realizacji. Używasz na własne ryzyko. + Dette er fortsatt under utvikling. Bruk på eget ansvar. + Ten projekt jest w trakcie realizacji. Używasz go na własne ryzyko. Isto é um projecto em curso. Use-o por sua conta e risco. Este é um trabalho em progresso. Use a seu próprio risco Această este un proiect în lucru. Utilizați pe propriul risc. @@ -106,7 +147,11 @@ Práca na tomto rozhraní stále prebieha. Používajte ho preto na vlastné riziko. Dodatek je še v izdelavi. Uporaba na lastno odgovornost. Detta är ett pågående arbete. Använd på egen risk. + இன்னும் வேலை நடந்துகொண்டு இருக்கிறது. உங்கள் சொந்த ஆபத்தில் பயன்படுத்தவும். + Роботи все ще тривають. Використовуйте на власний розсуд. + Đây là bản thử nghiệm. Bạn phải tự chịu trách nhiệm với nó 此插件仍在开发中,请自行把握试用风险。 + 這是開發中的工作。使用上您須自行考慮到可能有的風險。 @OS@ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/changelog.txt xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/changelog.txt --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/changelog.txt 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/changelog.txt 2014-05-04 06:40:43.000000000 +0000 @@ -1,9 +1,28 @@ -v1.6.5 -- reducing logging during live tv and playback of recordings -- now explicitly telling backend when live tv viewing ends, rather than relying on detection of the socket closing. This solves a problem some users were having with live tv buffer files left on the disk. -- fixed broken genre +v1.9.7 +- updated language files from Transifex + +v1.9.6 +- updated language files from Transifex + +v1.9.6 +- added dialog to set recurring recordings, including recurrence type, padding, number of recordings to keep, and recording directory +- added support for EDL +- added support for retrieving and storing last playback position +- now requires NextPVR 3.1.1 or higher +- fixed a bug that could cause an EPG event with no description to have a copy of last show's description, or cause a crash if the user was unlucky. +- more flexible approach to genre + +v1.9.5 +- add timeshift buffer functions + +v1.8.4 +- sync with PVR API v1.8.0 + +v1.7.4 +- Bump after PVR API version bump v1.6.4 + - small change to improve the performance of radio channels v1.6.3 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Afrikaans/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Afrikaans/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Afrikaans/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Afrikaans/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Afrikaans (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/af/)\n" +"Language-Team: Afrikaans (http://www.transifex.com/projects/p/xbmc-main/language/af/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,7 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "Instemmer nie meer beskikbaar" + +msgctxt "#30135" +msgid "Default" +msgstr "Verstek" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Albanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Albanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Albanian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Albanian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Albanian (http://www.transifex.com/projects/p/xbmc-main/language/sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30041" +msgid "Advanced" +msgstr "Të shtuar" + +msgctxt "#30135" +msgid "Default" +msgstr "Prëzgjedhur" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Amharic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Amharic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Amharic/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Amharic/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Amharic (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/am/)\n" +"Language-Team: Amharic (http://www.transifex.com/projects/p/xbmc-main/language/am/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -32,3 +31,7 @@ msgctxt "#30052" msgid "Connection failed. Incorrect PIN?" msgstr "ግንኙነቱ አልተሳካም የተሳሳተ PIN?" + +msgctxt "#30135" +msgid "Default" +msgstr "ነባር " diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Arabic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Arabic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Arabic/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Arabic/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Arabic (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ar/)\n" +"Language-Team: Arabic (http://www.transifex.com/projects/p/xbmc-main/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -20,3 +19,7 @@ msgctxt "#30041" msgid "Advanced" msgstr "منقدم" + +msgctxt "#30135" +msgid "Default" +msgstr "الافتراضية" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Basque/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Basque/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Basque/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Basque/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Basque (http://www.transifex.com/projects/p/xbmc-main/language/eu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30135" +msgid "Default" +msgstr "Lehenetsia" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Belarusian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Belarusian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Belarusian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Belarusian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Belarusian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/be/)\n" +"Language-Team: Belarusian (http://www.transifex.com/projects/p/xbmc-main/language/be/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,11 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "Tuner no longer available" + +msgctxt "#30130" +msgid "Keep" +msgstr "Keep" + +msgctxt "#30135" +msgid "Default" +msgstr "Стандартны" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Bosnian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Bosnian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Bosnian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Bosnian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Bosnian (http://www.transifex.com/projects/p/xbmc-main/language/bs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bs\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30135" +msgid "Default" +msgstr "Podrazumjevano" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Bulgarian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Bulgarian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Bulgarian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Bulgarian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,121 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Bulgarian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/bg/)\n" +"Language-Team: Bulgarian (http://www.transifex.com/projects/p/xbmc-main/language/bg/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bg\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "NextPVR Hostname" +msgstr "NextPVR хост" + +msgctxt "#30001" +msgid "NextPVR Port (usually 8866 or 7799)" +msgstr "NextPVR порт (често е 8866 или 7799)" + +msgctxt "#30002" +msgid "NextPVR PinCode" +msgstr "NextPVR пин код" + +msgctxt "#30003" +msgid "Enable TimeShift with Live TV" +msgstr "Включи таймшифт с Live TV" + +msgctxt "#30040" +msgid "Connection" +msgstr "Връзка" + msgctxt "#30041" msgid "Advanced" msgstr "Допълнителни" + +msgctxt "#30050" +msgid "NextPVR server is too old." +msgstr "NextPVR сървъра е твърде стар." + +msgctxt "#30051" +msgid "Upgrade to '%s' or higher!" +msgstr "Обновете до '%s' или по-нов!" + +msgctxt "#30052" +msgid "Connection failed. Incorrect PIN?" +msgstr "Неуспешно свързване. Неправилен код?" + +msgctxt "#30053" +msgid "Tuner no longer available" +msgstr "Тунера вече е недостъпен" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "[ПОВТОРЕНИЕ]" + +msgctxt "#30100" +msgid "Add Timer" +msgstr "Добави брояч" + +msgctxt "#30120" +msgid "Recording Type" +msgstr "Вид на записване" + +msgctxt "#30121" +msgid "Record Once" +msgstr "Запис само веднъж" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "Запис на сезон (Новите епизоди от този канал)" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "Запис на сезон (Всички епизоди от този канал)" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "Запис на сезон (Ежедневно в този момент)" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "Запис на сезон (Седмично в този момент)" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "Запис на сезон (Понеделник-Петък в този момент)" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "Запис на сезон (Уикендите в този момент)" + +msgctxt "#30130" +msgid "Keep" +msgstr "Запази" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "Всички записи" + +msgctxt "#30132" +msgid "Pre-Padding (minutes)" +msgstr "Предварително запълване (минути)" + +msgctxt "#30133" +msgid "Pre-Padding (minutes)" +msgstr "Предварително запълване (минути)" + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "Папка за записи" + +msgctxt "#30135" +msgid "Default" +msgstr "Стандартна" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Burmese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Burmese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Burmese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Burmese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,61 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Burmese (http://www.transifex.com/projects/p/xbmc-main/language/my/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "NextPVR Hostname" +msgstr "NextPVR Hostname" + +msgctxt "#30001" +msgid "NextPVR Port (usually 8866 or 7799)" +msgstr "NextPVR Port (ပုံမှန်အားဖြင့် 8866 သို့မဟုတ် 7799)" + +msgctxt "#30002" +msgid "NextPVR PinCode" +msgstr "NextPVR PinCode" + +msgctxt "#30003" +msgid "Enable TimeShift with Live TV" +msgstr "Live TV နှင့် အတူ TimeShift ကို အသုံးပြုပါ" + +msgctxt "#30040" +msgid "Connection" +msgstr "ကွန်နက်ရှင်" + +msgctxt "#30041" +msgid "Advanced" +msgstr "အဆင့်မြင့်သော" + +msgctxt "#30050" +msgid "NextPVR server is too old." +msgstr "NextPVR server သည် ဟောင်းနေပြီ။" + +msgctxt "#30051" +msgid "Upgrade to '%s' or higher!" +msgstr "%s ထိ သို့မဟုတ် ဒီထက်ပိုပြီး ဒီထက်ပိုပြီး မြှင့်ပါ" + +msgctxt "#30052" +msgid "Connection failed. Incorrect PIN?" +msgstr "ချိတ်ဆက်မှု မအောင်မြင်ပါ။ PIN မှားနေလား ?" + +msgctxt "#30053" +msgid "Tuner no longer available" +msgstr "Tuner မရရှိနိုင်တော့ပါ" + +msgctxt "#30135" +msgid "Default" +msgstr "မူလအတိုင်း" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Catalan/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Catalan/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Catalan/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Catalan/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Catalan (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ca/)\n" +"Language-Team: Catalan (http://www.transifex.com/projects/p/xbmc-main/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,7 +18,7 @@ msgctxt "#30000" msgid "NextPVR Hostname" -msgstr "Nom de màquine del NextPVR" +msgstr "Nom de màquina del NextPVR" msgctxt "#30001" msgid "NextPVR Port (usually 8866 or 7799)" @@ -29,14 +28,38 @@ msgid "NextPVR PinCode" msgstr "Codi PIN del NextPVR" +msgctxt "#30003" +msgid "Enable TimeShift with Live TV" +msgstr "Habilita els salts en el temps amb la televisió en directe" + msgctxt "#30040" msgid "Connection" msgstr "Connexió" +msgctxt "#30041" +msgid "Advanced" +msgstr "Avançat" + msgctxt "#30050" msgid "NextPVR server is too old." -msgstr "El servidor NextPVR és massa antic" +msgstr "El servidor NextPVR és massa antic." + +msgctxt "#30051" +msgid "Upgrade to '%s' or higher!" +msgstr "Actualitzeu a '%s' o superior!" msgctxt "#30052" msgid "Connection failed. Incorrect PIN?" msgstr "Ha fallat la connexió. PIN incorrecte?" + +msgctxt "#30053" +msgid "Tuner no longer available" +msgstr "El sintonitzador ja no està disponible" + +msgctxt "#30130" +msgid "Keep" +msgstr "Mantenir" + +msgctxt "#30135" +msgid "Default" +msgstr "Per defecte" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Chinese (Simple)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Chinese (Simple)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Chinese (Simple)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Chinese (Simple)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Chinese (Simple) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/zh/)\n" +"Language-Team: Chinese (Simple) (http://www.transifex.com/projects/p/xbmc-main/language/zh/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,15 +18,15 @@ msgctxt "#30000" msgid "NextPVR Hostname" -msgstr "NextPVR主机名" +msgstr "NextPVR 主机名" msgctxt "#30001" msgid "NextPVR Port (usually 8866 or 7799)" -msgstr "NextPVR端口(通常为8866或7799)" +msgstr "NextPVR 端口(通常为8866或7799)" msgctxt "#30002" msgid "NextPVR PinCode" -msgstr "NextPVR PIN码" +msgstr "NextPVR PIN 码" msgctxt "#30003" msgid "Enable TimeShift with Live TV" @@ -43,7 +42,7 @@ msgctxt "#30050" msgid "NextPVR server is too old." -msgstr "NextPVR服务器版本太旧" +msgstr "NextPVR 服务器版本太旧。" msgctxt "#30051" msgid "Upgrade to '%s' or higher!" @@ -51,8 +50,72 @@ msgctxt "#30052" msgid "Connection failed. Incorrect PIN?" -msgstr "连接失败,错误PIN码?" +msgstr "连接失败,错误 PIN 码?" msgctxt "#30053" msgid "Tuner no longer available" msgstr "电视接收设备不可用" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "[重现]" + +msgctxt "#30100" +msgid "Add Timer" +msgstr "添加定时器" + +msgctxt "#30120" +msgid "Recording Type" +msgstr "录像类型" + +msgctxt "#30121" +msgid "Record Once" +msgstr "单次录像" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "季录像(此频道新分集)" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "季录像(此频道所有分集)" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "季录像(每日,此时间档)" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "季录像(每周,此时间档)" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "季录像(周一至五,此时间档)" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "季录像(周末,此时间档)" + +msgctxt "#30130" +msgid "Keep" +msgstr "保持" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "所有录像" + +msgctxt "#30132" +msgid "Pre-Padding (minutes)" +msgstr "提前量(分)" + +msgctxt "#30133" +msgid "Pre-Padding (minutes)" +msgstr "提前量(分)" + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "录像目录" + +msgctxt "#30135" +msgid "Default" +msgstr "默认" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Chinese (Traditional)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Chinese (Traditional)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Chinese (Traditional)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Chinese (Traditional)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,65 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Chinese (Traditional) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/zh_TW/)\n" +"Language-Team: Chinese (Traditional) (http://www.transifex.com/projects/p/xbmc-main/language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0;\n" +msgctxt "#30000" +msgid "NextPVR Hostname" +msgstr "NextPVR主機名稱" + +msgctxt "#30001" +msgid "NextPVR Port (usually 8866 or 7799)" +msgstr "NextPVR端口(通常是8866或7799)" + +msgctxt "#30002" +msgid "NextPVR PinCode" +msgstr "NextPVR PIN碼代號" + +msgctxt "#30003" +msgid "Enable TimeShift with Live TV" +msgstr "直播電視啟用時光平移(TimeShift)" + +msgctxt "#30040" +msgid "Connection" +msgstr "連接" + msgctxt "#30041" msgid "Advanced" msgstr "進階" + +msgctxt "#30050" +msgid "NextPVR server is too old." +msgstr "NextPVR服務器太舊了" + +msgctxt "#30051" +msgid "Upgrade to '%s' or higher!" +msgstr "升級到'%s'或更高版本!" + +msgctxt "#30052" +msgid "Connection failed. Incorrect PIN?" +msgstr "連接失敗。不正確的PIN碼?" + +msgctxt "#30053" +msgid "Tuner no longer available" +msgstr "調諧器已無法使用" + +msgctxt "#30130" +msgid "Keep" +msgstr "保留" + +msgctxt "#30135" +msgid "Default" +msgstr "預設" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Croatian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Croatian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Croatian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Croatian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,121 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Croatian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/hr/)\n" +"Language-Team: Croatian (http://www.transifex.com/projects/p/xbmc-main/language/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +msgctxt "#30000" +msgid "NextPVR Hostname" +msgstr "NextPVR naziv računala" + +msgctxt "#30001" +msgid "NextPVR Port (usually 8866 or 7799)" +msgstr "NextPVR ulaz (uobičajen 8866 ili 7799)" + +msgctxt "#30002" +msgid "NextPVR PinCode" +msgstr "NextPVR PIN kôd" + +msgctxt "#30003" +msgid "Enable TimeShift with Live TV" +msgstr "Omogućiti vremensko premotavanje za TV programe" + +msgctxt "#30040" +msgid "Connection" +msgstr "Povezivanje" + msgctxt "#30041" msgid "Advanced" msgstr "Napredno" + +msgctxt "#30050" +msgid "NextPVR server is too old." +msgstr "NextPVR poslužitelj je zastario." + +msgctxt "#30051" +msgid "Upgrade to '%s' or higher!" +msgstr "Nadogradi na '%s' ili više!" + +msgctxt "#30052" +msgid "Connection failed. Incorrect PIN?" +msgstr "Neuspješno povezivanje. Pogrešan PIN?" + +msgctxt "#30053" +msgid "Tuner no longer available" +msgstr "Prijemnik više nije dostupan" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "[PONOVITI]" + +msgctxt "#30100" +msgid "Add Timer" +msgstr "Dodaj zakazano snimanje" + +msgctxt "#30120" +msgid "Recording Type" +msgstr "Vrsta snimanja" + +msgctxt "#30121" +msgid "Record Once" +msgstr "Snimi jednom" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "Snimi sezonu (nove epizode na ovom programu)" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "Snimi sezonu (sve epizode na ovom programu)" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "Snimi sezonu (dnevno, ovaj vremenski raspon)" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "Snimi sezonu (tjedno, ovaj vremenski raspon)" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "Snimi sezonu (ponedjeljak-petak, ovaj vremenski raspon)" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "Snimi sezonu (vikendom, ovaj vremenski raspon)" + +msgctxt "#30130" +msgid "Keep" +msgstr "Zadrži" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "Sve snimke" + +msgctxt "#30132" +msgid "Pre-Padding (minutes)" +msgstr "Predpostavljanje (minute)" + +msgctxt "#30133" +msgid "Pre-Padding (minutes)" +msgstr "Predpostavljanje (minute)" + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "Direktorij snimanja" + +msgctxt "#30135" +msgid "Default" +msgstr "Uobičajeno" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Czech/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Czech/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Czech/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Czech/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Czech (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/cs/)\n" +"Language-Team: Czech (http://www.transifex.com/projects/p/xbmc-main/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,11 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "Tuner již není dostupný" + +msgctxt "#30130" +msgid "Keep" +msgstr "Ponechat" + +msgctxt "#30135" +msgid "Default" +msgstr "Výchozí" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Danish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Danish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Danish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Danish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Danish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/da/)\n" +"Language-Team: Danish (http://www.transifex.com/projects/p/xbmc-main/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,11 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "Tuneren er ikke længere tilgængelig" + +msgctxt "#30130" +msgid "Keep" +msgstr "Behold" + +msgctxt "#30135" +msgid "Default" +msgstr "Standard" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Dutch/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Dutch/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Dutch/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Dutch/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Dutch (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/nl/)\n" +"Language-Team: Dutch (http://www.transifex.com/projects/p/xbmc-main/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,67 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "Tuner niet langer beschikbaar" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "[RECUR]" + +msgctxt "#30100" +msgid "Add Timer" +msgstr "Timer toevoegen" + +msgctxt "#30120" +msgid "Recording Type" +msgstr "Opname type" + +msgctxt "#30121" +msgid "Record Once" +msgstr "Eenmaal opnemen" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "Neem seizoen op (NIEUWE afleveringen op dit kanaal)" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "Neem seizoen op (alle afleveringen op dit kanaal)" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "Seizoen opnemen (dagelijks, dit tijdvenster)" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "Seizoen opnemen (wekelijks, dit tijdsvenster)" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "Seizoen opnemen (maandag-vrijdag, dit tijdvenster)" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "Seizoen opnemen (Weekenden, dit tijdsvenster)" + +msgctxt "#30130" +msgid "Keep" +msgstr "Behouden" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "Alle opnames" + +msgctxt "#30132" +msgid "Pre-Padding (minutes)" +msgstr "Pre-padding (minuten)" + +msgctxt "#30133" +msgid "Pre-Padding (minutes)" +msgstr "Pre-Padding (minuten)" + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "Opname locatie" + +msgctxt "#30135" +msgid "Default" +msgstr "Standaard" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/English/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/English/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/English/strings.po 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/English/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: English (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/en/)\n" +"Language-Team: English (http://www.transifex.com/projects/p/xbmc-main/language/en/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -64,3 +63,79 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "" + +#empty strings from id 30055 to 30099 + +msgctxt "#30100" +msgid "Add Timer" +msgstr "" + +#empty strings from id 30101 to 30119 +#Recording type + +msgctxt "#30120" +msgid "Recording Type" +msgstr "" + +msgctxt "#30121" +msgid "Record Once" +msgstr "" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "" + +#empty strings from id 30128 to 30129 +#Keep count + +msgctxt "#30130" +msgid "Keep" +msgstr "" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "" + +#Padding + +msgctxt "#30132" +msgid "Pre-Padding (minutes)" +msgstr "" + +msgctxt "#30133" +msgid "Pre-Padding (minutes)" +msgstr "" + +#Recording directory + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "" + +msgctxt "#30135" +msgid "Default" +msgstr "" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/English (Australia)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/English (Australia)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/English (Australia)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/English (Australia)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (Australia) (http://www.transifex.com/projects/p/xbmc-main/language/en_AU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30041" +msgid "Advanced" +msgstr "Advanced" + +msgctxt "#30135" +msgid "Default" +msgstr "Default" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/English (New Zealand)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/English (New Zealand)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/English (New Zealand)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/English (New Zealand)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,121 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (New Zealand) (http://www.transifex.com/projects/p/xbmc-main/language/en_NZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_NZ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "NextPVR Hostname" +msgstr "NextPVR Hostname" + +msgctxt "#30001" +msgid "NextPVR Port (usually 8866 or 7799)" +msgstr "NextPVR Port (usually 8866 or 7799)" + +msgctxt "#30002" +msgid "NextPVR PinCode" +msgstr "NextPVR PinCode" + +msgctxt "#30003" +msgid "Enable TimeShift with Live TV" +msgstr "Enable TimeShift with Live TV" + +msgctxt "#30040" +msgid "Connection" +msgstr "Connection" + +msgctxt "#30041" +msgid "Advanced" +msgstr "Advanced" + +msgctxt "#30050" +msgid "NextPVR server is too old." +msgstr "NextPVR server is too old." + +msgctxt "#30051" +msgid "Upgrade to '%s' or higher!" +msgstr "Upgrade to '%s' or higher!" + +msgctxt "#30052" +msgid "Connection failed. Incorrect PIN?" +msgstr "Connection failed. Incorrect PIN?" + +msgctxt "#30053" +msgid "Tuner no longer available" +msgstr "Tuner no longer available" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "[RECUR]" + +msgctxt "#30100" +msgid "Add Timer" +msgstr "Add Timer" + +msgctxt "#30120" +msgid "Recording Type" +msgstr "Recording Type" + +msgctxt "#30121" +msgid "Record Once" +msgstr "Record Once" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "Record Season (NEW episodes on this channel)" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "Record Season (All episodes on this channel)" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "Record Season (Daily, this timeslot)" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "Record Season (Weekly, this timeslot)" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "Record Season (Monday-Friday, this timeslot)" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "Record Season (Weekends, this timeslot)" + +msgctxt "#30130" +msgid "Keep" +msgstr "Keep" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "All Recordings" + +msgctxt "#30132" +msgid "Pre-Padding (minutes)" +msgstr "Pre-Padding (minutes)" + +msgctxt "#30133" +msgid "Pre-Padding (minutes)" +msgstr "Pre-Padding (minutes)" + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "Recording Directory" + +msgctxt "#30135" +msgid "Default" +msgstr "Default" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/English (US)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/English (US)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/English (US)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/English (US)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (US) (http://www.transifex.com/projects/p/xbmc-main/language/en_US/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_US\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30041" +msgid "Advanced" +msgstr "Advanced" + +msgctxt "#30135" +msgid "Default" +msgstr "Default" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Esperanto/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Esperanto/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Esperanto/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Esperanto/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Esperanto (http://www.transifex.com/projects/p/xbmc-main/language/eo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30135" +msgid "Default" +msgstr "Default" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Estonian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Estonian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Estonian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Estonian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Estonian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/et/)\n" +"Language-Team: Estonian (http://www.transifex.com/projects/p/xbmc-main/language/et/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -28,3 +27,39 @@ msgctxt "#30002" msgid "NextPVR PinCode" msgstr "NextPVR PinCode" + +msgctxt "#30003" +msgid "Enable TimeShift with Live TV" +msgstr "Luba TV ajanihutus" + +msgctxt "#30040" +msgid "Connection" +msgstr "Ühendus" + +msgctxt "#30041" +msgid "Advanced" +msgstr "Põhjalikumad seaded" + +msgctxt "#30050" +msgid "NextPVR server is too old." +msgstr "NextPVR server on liiga vana." + +msgctxt "#30051" +msgid "Upgrade to '%s' or higher!" +msgstr "Uuenda versioonile '%s' või uuemale!" + +msgctxt "#30052" +msgid "Connection failed. Incorrect PIN?" +msgstr "Ühendus nurjus. Vale PIN?" + +msgctxt "#30053" +msgid "Tuner no longer available" +msgstr "Tüüner ei ole enam saadaval" + +msgctxt "#30130" +msgid "Keep" +msgstr "Jäta alles" + +msgctxt "#30135" +msgid "Default" +msgstr "Vaikimisi" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Faroese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Faroese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Faroese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Faroese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Faroese (http://www.transifex.com/projects/p/xbmc-main/language/fo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30135" +msgid "Default" +msgstr "Vanligt" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Finnish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Finnish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Finnish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Finnish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,25 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Finnish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fi/)\n" +"Language-Team: Finnish (http://www.transifex.com/projects/p/xbmc-main/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30001" +msgid "NextPVR Port (usually 8866 or 7799)" +msgstr "NextPVR-portti (yleensä 8866 tai 7799)" + msgctxt "#30040" msgid "Connection" msgstr "Yhteys" @@ -24,3 +27,15 @@ msgctxt "#30041" msgid "Advanced" msgstr "Lisäasetukset" + +msgctxt "#30050" +msgid "NextPVR server is too old." +msgstr "NextPVR-palvelin on liian vanha." + +msgctxt "#30130" +msgid "Keep" +msgstr "Säilytä" + +msgctxt "#30135" +msgid "Default" +msgstr "Oletus" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/French/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/French/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/French/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/French/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: French (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fr/)\n" +"Language-Team: French (http://www.transifex.com/projects/p/xbmc-main/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,67 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "Le tuner n'est plus disponible" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "[RECUR]" + +msgctxt "#30100" +msgid "Add Timer" +msgstr "Ajouter une minuterie" + +msgctxt "#30120" +msgid "Recording Type" +msgstr "Type d'enregistrement" + +msgctxt "#30121" +msgid "Record Once" +msgstr "Enregistrer une seule fois" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "Enregistrer la saison (NOUVEAUX épisodes sur cette chaîne)" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "Enregistrer la saison (tous les épisodes sur cette chaîne)" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "Enregistrer la saison (journalière, ce créneau horaire)" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "Enregistrer la saison (hebdomadaire, ce créneau horaire)" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "Enregistrer la saison (du lundi au vendredi, ce créneau horaire)" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "Enregistrer la saison (week-end, ce créneau horaire)" + +msgctxt "#30130" +msgid "Keep" +msgstr "Conserver" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "Tous les enregistrements" + +msgctxt "#30132" +msgid "Pre-Padding (minutes)" +msgstr "Délai avant (minutes)" + +msgctxt "#30133" +msgid "Pre-Padding (minutes)" +msgstr "Délai avant (minutes)" + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "Répertoire des enregistrements" + +msgctxt "#30135" +msgid "Default" +msgstr "Défaut" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/French (Canada)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/French (Canada)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/French (Canada)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/French (Canada)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,121 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: French (Canada) (http://www.transifex.com/projects/p/xbmc-main/language/fr_CA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_CA\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "NextPVR Hostname" +msgstr "Nom d'hôte de NextPVR" + +msgctxt "#30001" +msgid "NextPVR Port (usually 8866 or 7799)" +msgstr "Port de NextPVR (habituellement 8866 ou 7799)" + +msgctxt "#30002" +msgid "NextPVR PinCode" +msgstr "NIP de NextPVR" + +msgctxt "#30003" +msgid "Enable TimeShift with Live TV" +msgstr "Activer le décalage temporel avec la télé en direct" + +msgctxt "#30040" +msgid "Connection" +msgstr "Connexion" + +msgctxt "#30041" +msgid "Advanced" +msgstr "Avancé" + +msgctxt "#30050" +msgid "NextPVR server is too old." +msgstr "Le serveur NextPVR est trop ancien." + +msgctxt "#30051" +msgid "Upgrade to '%s' or higher!" +msgstr "Mettre à niveau vers « %s » ou ultérieure!" + +msgctxt "#30052" +msgid "Connection failed. Incorrect PIN?" +msgstr "Échec lors de la connexion. NIP erroné?" + +msgctxt "#30053" +msgid "Tuner no longer available" +msgstr "Le syntonisateur n'est plus disponible" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "[RECUR]" + +msgctxt "#30100" +msgid "Add Timer" +msgstr "Ajouter une minuterie" + +msgctxt "#30120" +msgid "Recording Type" +msgstr "Type d'enregistrement" + +msgctxt "#30121" +msgid "Record Once" +msgstr "Enregistrer une fois" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "Enregistrer la saison (NOUVEAUX épisodes sur cette chaîne)" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "Enregistrer la saison (tous les épisodes sur cette chaîne)" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "Enregistrer la saison (tous les jours, cette tranche horaire)" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "Enregistrer la saison (hebdomadairement, cette tranche horaire)" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "Enregistrer la saison (lundi-vendredi, cette tranche horaire)" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "Enregistrer la saison (fins de semaine, cette tranche horaire)" + +msgctxt "#30130" +msgid "Keep" +msgstr "Garder" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "Tous les enregistrements" + +msgctxt "#30132" +msgid "Pre-Padding (minutes)" +msgstr "Pré-enregistrement (minutes)" + +msgctxt "#30133" +msgid "Pre-Padding (minutes)" +msgstr "Pré-enregistrement (minutes)" + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "Répertoire d'enregistrement" + +msgctxt "#30135" +msgid "Default" +msgstr "Par défaut" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Galician/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Galician/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Galician/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Galician/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Galician (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/gl/)\n" +"Language-Team: Galician (http://www.transifex.com/projects/p/xbmc-main/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,59 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "O sintonizador non está dispoñíbel" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "[RECUR]" + +msgctxt "#30100" +msgid "Add Timer" +msgstr "Engadir Temporizador" + +msgctxt "#30120" +msgid "Recording Type" +msgstr "Tipo de Gravación" + +msgctxt "#30121" +msgid "Record Once" +msgstr "Gravar unha vez" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "Gravar Tempada (NOVOS episodios desta canle)" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "Gravar Tempada (Todos os episodios desta canle)" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "Gravar Tempada (Diario, neste horario)" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "Gravar Tempada (Semanal, neste horario)" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "Gravar Tempada (Luns-Venres, neste horario)" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "Gravar Tempada (Fins de semana, neste horario)" + +msgctxt "#30130" +msgid "Keep" +msgstr "Manter" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "Todas as gravacións" + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "Cartafol das Gravacións" + +msgctxt "#30135" +msgid "Default" +msgstr "Predefinido" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Georgian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Georgian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Georgian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Georgian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,57 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Georgian (http://www.transifex.com/projects/p/xbmc-main/language/ka/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ka\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "NextPVR Hostname" +msgstr "NextPVR-ის სერვერის სახელი" + +msgctxt "#30001" +msgid "NextPVR Port (usually 8866 or 7799)" +msgstr "NextPVR-ის პორტი (ზოგადად 8866 ან 7799)" + +msgctxt "#30002" +msgid "NextPVR PinCode" +msgstr "NextPVR-ის პინ-კოდი" + +msgctxt "#30003" +msgid "Enable TimeShift with Live TV" +msgstr "დროში გადანაცვლების ჩართვა Live TV-ში" + +msgctxt "#30040" +msgid "Connection" +msgstr "შეერთება" + +msgctxt "#30041" +msgid "Advanced" +msgstr "დამატებით" + +msgctxt "#30050" +msgid "NextPVR server is too old." +msgstr "NextPVR სერვერი ძალიან ძველია." + +msgctxt "#30051" +msgid "Upgrade to '%s' or higher!" +msgstr "განაახლეთ '%s' ან უფრო ახალ ვერსიამდე!" + +msgctxt "#30052" +msgid "Connection failed. Incorrect PIN?" +msgstr "ვერ შევუერთდი. არასწორი PIN?" + +msgctxt "#30053" +msgid "Tuner no longer available" +msgstr "ტუნერი უკვე არ არის ხელმისაწვდომი" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/German/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/German/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/German/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/German/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: German (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/de/)\n" +"Language-Team: German (http://www.transifex.com/projects/p/xbmc-main/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -51,8 +50,72 @@ msgctxt "#30052" msgid "Connection failed. Incorrect PIN?" -msgstr "Verbindung fehlgeschlagen. Vielleicht ist der PIN falsch?" +msgstr "Verbindung fehlgeschlagen. Ist der PIN richtig?" msgctxt "#30053" msgid "Tuner no longer available" msgstr "Tuner nicht länger verfügbar" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "[WIEDERHOLEN]" + +msgctxt "#30100" +msgid "Add Timer" +msgstr "Timer hinzufügen" + +msgctxt "#30120" +msgid "Recording Type" +msgstr "Aufnahmetyp" + +msgctxt "#30121" +msgid "Record Once" +msgstr "Einmal aufnehmen" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "Staffel aufnehmen (NEUE Folgen auf diesem Sender)" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "Staffel aufnehmen (Alle Folgen auf diesem Sender)" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "Staffel aufnehmen (Täglich, dieser Sendeplatz)" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "Staffel aufnehmen (Wöchentlich, dieser Sendeplatz)" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "Staffel aufnehmen (Montag-Freitag, dieser Sendeplatz)" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "Staffel aufnehmen (Wochenenden, dieser Sendeplatz)" + +msgctxt "#30130" +msgid "Keep" +msgstr "Behalten" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "Alle Aufnahmen" + +msgctxt "#30132" +msgid "Pre-Padding (minutes)" +msgstr "Vorlaufzeit (Minuten)" + +msgctxt "#30133" +msgid "Pre-Padding (minutes)" +msgstr "Vorlaufzeit (Minuten)" + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "Aufnahmenverzeichnis" + +msgctxt "#30135" +msgid "Default" +msgstr "Standard" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Greek/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Greek/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Greek/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Greek/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Greek (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/el/)\n" +"Language-Team: Greek (http://www.transifex.com/projects/p/xbmc-main/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,67 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "Ο δέκτης (tuner) δεν είναι πλέον διαθέσιμος" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "[ΕΠΑΝΑΛΗΨΗ]" + +msgctxt "#30100" +msgid "Add Timer" +msgstr "Προσθήκη Χρονοδιακόπτη" + +msgctxt "#30120" +msgid "Recording Type" +msgstr "Τύπος Εγγραφής" + +msgctxt "#30121" +msgid "Record Once" +msgstr "Εγγραφή Μία Φορά" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "Εγγραφή Κύκλου (ΝΕΑ επεισόδια σε αυτό το κανάλι)" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "Εγγραφή Κύκλου (Όλα τα επεισόδια σε αυτό το κανάλι)" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "Εγγραφή Κύκλου (Καθημερινά, τέτοια ώρα)" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "Εγγραφή Κύκλου (Εβδομαδιαία, τέτοια ώρα)" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "Εγγραφή Κύκλου (Δευτέρα-Παρασκευή, τέτοια ώρα)" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "Εγγραφή Κύκλου (Σαββατοκύριακα, τέτοια ώρα)" + +msgctxt "#30130" +msgid "Keep" +msgstr "Διατήρηση" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "Όλες οι Εγγραφές" + +msgctxt "#30132" +msgid "Pre-Padding (minutes)" +msgstr "Πρώιμη Έναρξη Εγγραφής (λεπτά)" + +msgctxt "#30133" +msgid "Pre-Padding (minutes)" +msgstr "Πρώιμη Έναρξη Εγγραφής (λεπτά)" + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "Φάκελος Εγγραφών" + +msgctxt "#30135" +msgid "Default" +msgstr "Προεπιλογή" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Hebrew/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Hebrew/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Hebrew/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Hebrew/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hebrew (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/he/)\n" +"Language-Team: Hebrew (http://www.transifex.com/projects/p/xbmc-main/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,11 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "מקלט אינו זמין יותר" + +msgctxt "#30130" +msgid "Keep" +msgstr "שמור" + +msgctxt "#30135" +msgid "Default" +msgstr "ברירת מחדל" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Hindi (Devanagiri)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Hindi (Devanagiri)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Hindi (Devanagiri)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Hindi (Devanagiri)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Hindi (Devanagiri) (http://www.transifex.com/projects/p/xbmc-main/language/hi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30041" +msgid "Advanced" +msgstr "उन्नत" + +msgctxt "#30135" +msgid "Default" +msgstr "डिफ़ॉल्ट" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Hungarian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Hungarian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Hungarian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Hungarian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hungarian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/hu/)\n" +"Language-Team: Hungarian (http://www.transifex.com/projects/p/xbmc-main/language/hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,67 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "A vevőkártya már nem elérhető" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "[ISMÉTLÉS]" + +msgctxt "#30100" +msgid "Add Timer" +msgstr "Időzítés" + +msgctxt "#30120" +msgid "Recording Type" +msgstr "Felvétel típusa" + +msgctxt "#30121" +msgid "Record Once" +msgstr "Felvétel egyszer" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "Évad felvétele (ÚJ részek ezen a csatornán)" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "Évad felvétele (minden rész ezen a csatornán)" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "Évad felvétele (Naponta, ebben az időben)" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "Évad felvétele (Hetente ebben az időben)" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "Évad felvétele (Hétfőtől-Péntekig, ebben az időben)" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "Évad felvétele (Hétvégék, ebben az időben)" + +msgctxt "#30130" +msgid "Keep" +msgstr "Megtart" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "Minden felvétel" + +msgctxt "#30132" +msgid "Pre-Padding (minutes)" +msgstr "Elő hosszabbítás (perc)" + +msgctxt "#30133" +msgid "Pre-Padding (minutes)" +msgstr "Elő hosszabbítás (perc)" + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "Felvétel mappa" + +msgctxt "#30135" +msgid "Default" +msgstr "Alapérték" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Icelandic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Icelandic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Icelandic/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Icelandic/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Icelandic (http://www.transifex.com/projects/p/xbmc-main/language/is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30130" +msgid "Keep" +msgstr "Halda" + +msgctxt "#30135" +msgid "Default" +msgstr "Sjálfgefið" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Indonesian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Indonesian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Indonesian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Indonesian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,121 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Indonesian (http://www.transifex.com/projects/p/xbmc-main/language/id/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "NextPVR Hostname" +msgstr "Hostname NextPVR" + +msgctxt "#30001" +msgid "NextPVR Port (usually 8866 or 7799)" +msgstr "Port NextPVR (Biasanya 8866 atau 7799)" + +msgctxt "#30002" +msgid "NextPVR PinCode" +msgstr "Kode Pin NextPVR" + +msgctxt "#30003" +msgid "Enable TimeShift with Live TV" +msgstr "Aktifkan TimeShift dengan Siaran TV" + +msgctxt "#30040" +msgid "Connection" +msgstr "Koneksi" + +msgctxt "#30041" +msgid "Advanced" +msgstr "Tingkat Lanjut" + +msgctxt "#30050" +msgid "NextPVR server is too old." +msgstr "Server NextPVR terlalu tua." + +msgctxt "#30051" +msgid "Upgrade to '%s' or higher!" +msgstr "Upgrade ke versi '%s' atau lebih tinggi!" + +msgctxt "#30052" +msgid "Connection failed. Incorrect PIN?" +msgstr "Koneksi gagal. PIN salah?" + +msgctxt "#30053" +msgid "Tuner no longer available" +msgstr "Tuner tidak lagi tersedia" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "[RECUR]" + +msgctxt "#30100" +msgid "Add Timer" +msgstr "Tambahkan Timer" + +msgctxt "#30120" +msgid "Recording Type" +msgstr "Tipe Perekaman" + +msgctxt "#30121" +msgid "Record Once" +msgstr "Rekam sekali" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "Rekam semusim (Setiap episode baru di kanal ini)" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "Rekam semusim (Semua episode dalam kanal ini)" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "Rekam semusim (Tiap hari di jam ini)" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "Rekam semusim (Mingguan, di jam ini)" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "Rekam semusim (Senin - Jumat, di jam ini)" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "Rekam semusim (Akhir minggu, di jam ini)" + +msgctxt "#30130" +msgid "Keep" +msgstr "Pertahankan" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "Semua rekaman" + +msgctxt "#30132" +msgid "Pre-Padding (minutes)" +msgstr "Pre-Padding (menit)" + +msgctxt "#30133" +msgid "Pre-Padding (minutes)" +msgstr "Pre-Padding (menit)" + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "Direktori Rekaman" + +msgctxt "#30135" +msgid "Default" +msgstr "Standar" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Italian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Italian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Italian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Italian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Italian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/it/)\n" +"Language-Team: Italian (http://www.transifex.com/projects/p/xbmc-main/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,11 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "Il tuner non è più disponibile" + +msgctxt "#30130" +msgid "Keep" +msgstr "Mantieni" + +msgctxt "#30135" +msgid "Default" +msgstr "Predefinito" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Japanese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Japanese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Japanese/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Japanese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Japanese (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ja/)\n" +"Language-Team: Japanese (http://www.transifex.com/projects/p/xbmc-main/language/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,7 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "チューナーがみつかりません" + +msgctxt "#30135" +msgid "Default" +msgstr "デフォルト" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Korean/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Korean/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Korean/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Korean/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Korean (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ko/)\n" +"Language-Team: Korean (http://www.transifex.com/projects/p/xbmc-main/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,11 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "튜너 사용할 수 없음" + +msgctxt "#30130" +msgid "Keep" +msgstr "유지" + +msgctxt "#30135" +msgid "Default" +msgstr "기본" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Latvian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Latvian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Latvian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Latvian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,53 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Latvian (http://www.transifex.com/projects/p/xbmc-main/language/lv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +msgctxt "#30000" +msgid "NextPVR Hostname" +msgstr "NextPVR saimniekvārds" + +msgctxt "#30040" +msgid "Connection" +msgstr "Savienojums" + +msgctxt "#30041" +msgid "Advanced" +msgstr "Papildus" + +msgctxt "#30050" +msgid "NextPVR server is too old." +msgstr "NextPVR serveris ir pārāk vecs." + +msgctxt "#30051" +msgid "Upgrade to '%s' or higher!" +msgstr "Janiniet uz '%s' vai augstāku!" + +msgctxt "#30052" +msgid "Connection failed. Incorrect PIN?" +msgstr "Savienojums neizdevās. VAi nepareizs PIN?" + +msgctxt "#30053" +msgid "Tuner no longer available" +msgstr "Uztvērējs vairs nav pieejams" + +msgctxt "#30130" +msgid "Keep" +msgstr "Paturēt" + +msgctxt "#30135" +msgid "Default" +msgstr "Noklusējums" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Lithuanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Lithuanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Lithuanian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Lithuanian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Lithuanian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/lt/)\n" +"Language-Team: Lithuanian (http://www.transifex.com/projects/p/xbmc-main/language/lt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,11 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "Imtuvas nebepasiekiamas" + +msgctxt "#30130" +msgid "Keep" +msgstr "Išlaikyti" + +msgctxt "#30135" +msgid "Default" +msgstr "Numatytas" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Macedonian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Macedonian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Macedonian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Macedonian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Macedonian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/mk/)\n" +"Language-Team: Macedonian (http://www.transifex.com/projects/p/xbmc-main/language/mk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,7 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "Тјунер не е веќе достапен" + +msgctxt "#30135" +msgid "Default" +msgstr "Подразбирачко" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Malay/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Malay/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Malay/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Malay/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,121 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Malay (http://www.transifex.com/projects/p/xbmc-main/language/ms/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "NextPVR Hostname" +msgstr "Nama hos NextPVR" + +msgctxt "#30001" +msgid "NextPVR Port (usually 8866 or 7799)" +msgstr "Port NextPVR (biasanya 8866 atau 7799)" + +msgctxt "#30002" +msgid "NextPVR PinCode" +msgstr "Kod Pin NextPVR" + +msgctxt "#30003" +msgid "Enable TimeShift with Live TV" +msgstr "Benarkan Anjak Masa dengan TV Langsung" + +msgctxt "#30040" +msgid "Connection" +msgstr "Sambungan" + +msgctxt "#30041" +msgid "Advanced" +msgstr "Lanjutan" + +msgctxt "#30050" +msgid "NextPVR server is too old." +msgstr "Pelayan NextPVR terlalu tua." + +msgctxt "#30051" +msgid "Upgrade to '%s' or higher!" +msgstr "Tatar ke '%s' atau lebih baharu!" + +msgctxt "#30052" +msgid "Connection failed. Incorrect PIN?" +msgstr "Sambungan gagal. PIN salah?" + +msgctxt "#30053" +msgid "Tuner no longer available" +msgstr "Penala tiada lagi tersedia" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "[RECUR]" + +msgctxt "#30100" +msgid "Add Timer" +msgstr "Tambah Pemasa" + +msgctxt "#30120" +msgid "Recording Type" +msgstr "Jenis Rakaman" + +msgctxt "#30121" +msgid "Record Once" +msgstr "Rakam Sekali" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "Rakam Musim (Episod BAHARU dalam saluran ini)" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "Rakam Musim (Semua episod dalam saluran ini)" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "Rakam Musim (Harian, slot masa ini)" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "Rakam Musim (Mingguan, slot masa ini)" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "Rakam Musim (Isnin-Jumaat, slot masa ini)" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "Rekod Musim (Hujung Minggu, slot masa ini)" + +msgctxt "#30130" +msgid "Keep" +msgstr "Kekal" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "Semua Rakaman" + +msgctxt "#30132" +msgid "Pre-Padding (minutes)" +msgstr "Pra-Pemadatan (minit)" + +msgctxt "#30133" +msgid "Pre-Padding (minutes)" +msgstr "Pra-Pemadatan (minit)" + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "Direktori Rakaman" + +msgctxt "#30135" +msgid "Default" +msgstr "Lalai" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Maltese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Maltese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Maltese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Maltese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Maltese (http://www.transifex.com/projects/p/xbmc-main/language/mt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mt\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);\n" + +msgctxt "#30135" +msgid "Default" +msgstr "Difolt" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Maori/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Maori/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Maori/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Maori/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Maori (http://www.transifex.com/projects/p/xbmc-main/language/mi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mi\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30041" +msgid "Advanced" +msgstr "Arā Atu Anō" + +msgctxt "#30130" +msgid "Keep" +msgstr "Penapena" + +msgctxt "#30135" +msgid "Default" +msgstr "Taunoa" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Norwegian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Norwegian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Norwegian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Norwegian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,65 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Norwegian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/no/)\n" +"Language-Team: Norwegian (http://www.transifex.com/projects/p/xbmc-main/language/no/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: no\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "NextPVR Hostname" +msgstr "NextPVR vertsnavn" + +msgctxt "#30001" +msgid "NextPVR Port (usually 8866 or 7799)" +msgstr "NextPVR-port (som regel 8866 eller 7799)" + +msgctxt "#30002" +msgid "NextPVR PinCode" +msgstr "NextPVR PIN-kode" + +msgctxt "#30003" +msgid "Enable TimeShift with Live TV" +msgstr "Aktiver TimeShift med direkte TV" + +msgctxt "#30040" +msgid "Connection" +msgstr "Tilkobling" + msgctxt "#30041" msgid "Advanced" msgstr "Avansert" + +msgctxt "#30050" +msgid "NextPVR server is too old." +msgstr "NextPVR-vert er for gammel." + +msgctxt "#30051" +msgid "Upgrade to '%s' or higher!" +msgstr "Oppgrader til '%s' eller høyere!" + +msgctxt "#30052" +msgid "Connection failed. Incorrect PIN?" +msgstr "Tilkobling feilet. Feil PIN?" + +msgctxt "#30053" +msgid "Tuner no longer available" +msgstr "Tuner er ikke lengre tilgjengelig" + +msgctxt "#30130" +msgid "Keep" +msgstr "Behold" + +msgctxt "#30135" +msgid "Default" +msgstr "Standard" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Persian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Persian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Persian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Persian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Persian (http://www.transifex.com/projects/p/xbmc-main/language/fa/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30040" +msgid "Connection" +msgstr "اتصال" + +msgctxt "#30041" +msgid "Advanced" +msgstr "پیشرفته" + +msgctxt "#30135" +msgid "Default" +msgstr "پیش فرض" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Persian (Iran)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Persian (Iran)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Persian (Iran)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Persian (Iran)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Persian (Iran) (http://www.transifex.com/projects/p/xbmc-main/language/fa_IR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa_IR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30135" +msgid "Default" +msgstr "پیش فرض" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Polish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Polish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Polish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Polish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Polish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pl/)\n" +"Language-Team: Polish (http://www.transifex.com/projects/p/xbmc-main/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -23,7 +22,7 @@ msgctxt "#30001" msgid "NextPVR Port (usually 8866 or 7799)" -msgstr "Port NextPVR (zwykle 8866 lub 7799)" +msgstr "Port NextPVR (zazwyczaj 8866 lub 7799)" msgctxt "#30002" msgid "NextPVR PinCode" @@ -31,7 +30,7 @@ msgctxt "#30003" msgid "Enable TimeShift with Live TV" -msgstr "Włącz TimeShift dla Live TV" +msgstr "Włącz funkcję przesunięcia czasowego dla programów telewizyjnych" msgctxt "#30040" msgid "Connection" @@ -43,16 +42,80 @@ msgctxt "#30050" msgid "NextPVR server is too old." -msgstr "Serwer NextPVR jest zbyt stary." +msgstr "Serwer NextPVR jest w zbyt starej wersji. " msgctxt "#30051" msgid "Upgrade to '%s' or higher!" -msgstr "Uaktulanij do '%s' lub wyższej!" +msgstr "Zainstaluj wersję '%s' lub nowszą!" msgctxt "#30052" msgid "Connection failed. Incorrect PIN?" -msgstr "Połączenie nie powiodło się. Nieprawidłowy PIN?" +msgstr "Problem z połączeniem. Nieprawidłowy PIN?" msgctxt "#30053" msgid "Tuner no longer available" msgstr "Tuner niedostępny" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "[POWTARZAJ]" + +msgctxt "#30100" +msgid "Add Timer" +msgstr "Zaplanuj" + +msgctxt "#30120" +msgid "Recording Type" +msgstr "Rodzaj nagrania" + +msgctxt "#30121" +msgid "Record Once" +msgstr "Nagraj jednorazowo" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "Nagrywaj sezon (nowe odcinki na tym kanale)" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "Nagrywaj sezon (wszystkie odcinki na tym kanale)" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "Nagrywaj sezon (codziennie, w tym przedziale czasowym)" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "Nagrywaj sezon (co tydzień, w tym przedziale czasowym)" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "Nagrywaj sezon (Poniedziałek-Piątek, w tym przedziale czasowym)" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "Nagrywaj sezon (w weekendy, w tym przedziale czasowym)" + +msgctxt "#30130" +msgid "Keep" +msgstr "Zatrzymaj" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "Wszystkie nagrania" + +msgctxt "#30132" +msgid "Pre-Padding (minutes)" +msgstr "Rozpoczęcie nagrywania (minuty)" + +msgctxt "#30133" +msgid "Pre-Padding (minutes)" +msgstr "Rozpoczęcie nagrywania (minuty)" + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "Folder nagrań" + +msgctxt "#30135" +msgid "Default" +msgstr "Domyślny" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Portuguese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Portuguese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Portuguese/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Portuguese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Portuguese (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pt/)\n" +"Language-Team: Portuguese (http://www.transifex.com/projects/p/xbmc-main/language/pt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,67 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "O sintonizador não está disponível" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "[RECUR]" + +msgctxt "#30100" +msgid "Add Timer" +msgstr "Adicionar Temporizador" + +msgctxt "#30120" +msgid "Recording Type" +msgstr "Tipo de Gravação" + +msgctxt "#30121" +msgid "Record Once" +msgstr "Gravar Uma Vez" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "Gravar Temporada (NOVOS episódios neste canal)" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "Gravar Temporada (todos os episódios neste canal)" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "Gravar Temporada (Diariamente, neste horário)" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "Gravar Temporada (Semanalmente, neste horário)" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "Gravar Temporada (De Segunda a Sexta, neste horário)" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "Gravar Temporada (Fins-de-Semana, neste horário)" + +msgctxt "#30130" +msgid "Keep" +msgstr "Manter" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "Todas as Gravações" + +msgctxt "#30132" +msgid "Pre-Padding (minutes)" +msgstr "Atraso na gravação (minutos)" + +msgctxt "#30133" +msgid "Pre-Padding (minutes)" +msgstr "Atraso na gravação (minutos)" + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "Pasta de Gravações" + +msgctxt "#30135" +msgid "Default" +msgstr "Padrão" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Portuguese (Brazil)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Portuguese (Brazil)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Portuguese (Brazil)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Portuguese (Brazil)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pt_BR/)\n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/xbmc-main/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,15 +18,15 @@ msgctxt "#30000" msgid "NextPVR Hostname" -msgstr "Hostname NextPVR" +msgstr "Hostname do NextPVR" msgctxt "#30001" msgid "NextPVR Port (usually 8866 or 7799)" -msgstr "NextPVR Porta (usualmente 8866 ou 7799)" +msgstr "Porta do NextPVR (normalmente 8866 ou 7799" msgctxt "#30002" msgid "NextPVR PinCode" -msgstr "Pincode NextPVR" +msgstr "Pincode do NextPVR" msgctxt "#30003" msgid "Enable TimeShift with Live TV" @@ -43,7 +42,7 @@ msgctxt "#30050" msgid "NextPVR server is too old." -msgstr "NextPVR server é muito antigo." +msgstr "O servidor NextPVR é muito antigo." msgctxt "#30051" msgid "Upgrade to '%s' or higher!" @@ -51,8 +50,72 @@ msgctxt "#30052" msgid "Connection failed. Incorrect PIN?" -msgstr "Conexão falhou. PIN incorreto" +msgstr "A conexão falhou. PIN incorreto?" msgctxt "#30053" msgid "Tuner no longer available" msgstr "Sintonizador não está disponível" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "[RECUR]" + +msgctxt "#30100" +msgid "Add Timer" +msgstr "Adicionar Agendamento" + +msgctxt "#30120" +msgid "Recording Type" +msgstr "Tipos de gravação" + +msgctxt "#30121" +msgid "Record Once" +msgstr "Gravação Única" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "Gravar Temporada (Novos episódios neste canal)" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "Gravar Temporada (Todos os episódios neste canal)" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "Gravar Temporada (Diariamente, neste intervalo de tempo)" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "Gravar Temporada (Semanalmente, neste intervalo de tempo)" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "Gravar Temporada (De Segunda até Sexta-feira, neste intervalo de tempo)" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "Gravar Temporada (Final de semana, neste intervalo de tempo)" + +msgctxt "#30130" +msgid "Keep" +msgstr "Manter" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "Todas as gravações" + +msgctxt "#30132" +msgid "Pre-Padding (minutes)" +msgstr "Pré-preenchimento (minutos)" + +msgctxt "#30133" +msgid "Pre-Padding (minutes)" +msgstr "Pré-preenchimento (minutos)" + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "Diretório para as Gravações" + +msgctxt "#30135" +msgid "Default" +msgstr "Padrão" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Romanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Romanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Romanian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Romanian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Romanian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ro/)\n" +"Language-Team: Romanian (http://www.transifex.com/projects/p/xbmc-main/language/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,7 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "Tuner-ul nu mai este disponibil" + +msgctxt "#30135" +msgid "Default" +msgstr "Standard" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Russian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Russian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Russian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Russian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Russian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ru/)\n" +"Language-Team: Russian (http://www.transifex.com/projects/p/xbmc-main/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,67 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "Тюнер более недоступен" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "[ПОВТОРЯТЬСЯ]" + +msgctxt "#30100" +msgid "Add Timer" +msgstr "Добавить таймер" + +msgctxt "#30120" +msgid "Recording Type" +msgstr "Тип записи" + +msgctxt "#30121" +msgid "Record Once" +msgstr "Записать единожды" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "Записать сезон (НОВЫЕ серии на этом канале)" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "Записать сезон (все серии на этом канале)" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "Записать сезон (ежедневно, этот промежуток времени)" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "Записать сезон (еженедельно, этот промежуток времени)" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "Записать сезон (Понедельник-Пятница, этот промежуток времени)" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "Записать сезон (выходные, этот промежуток времени)" + +msgctxt "#30130" +msgid "Keep" +msgstr "Сохранить" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "Все Записи" + +msgctxt "#30132" +msgid "Pre-Padding (minutes)" +msgstr "Предварительное заполнение (в минутах)" + +msgctxt "#30133" +msgid "Pre-Padding (minutes)" +msgstr "Предварительное заполнение (в минутах)" + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "Папка Записей" + +msgctxt "#30135" +msgid "Default" +msgstr "По умолчанию" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Serbian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Serbian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Serbian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Serbian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Serbian (http://www.transifex.com/projects/p/xbmc-main/language/sr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30135" +msgid "Default" +msgstr "Podrazumevano" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Serbian (Cyrillic)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Serbian (Cyrillic)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Serbian (Cyrillic)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Serbian (Cyrillic)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Serbian (Cyrillic) (http://www.transifex.com/projects/p/xbmc-main/language/sr_RS/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr_RS\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30135" +msgid "Default" +msgstr "Подразумевано" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Slovak/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Slovak/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Slovak/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Slovak/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Slovak (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sk/)\n" +"Language-Team: Slovak (http://www.transifex.com/projects/p/xbmc-main/language/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,11 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "Tuner už nie je k dispozícii" + +msgctxt "#30130" +msgid "Keep" +msgstr "Ponechať" + +msgctxt "#30135" +msgid "Default" +msgstr "Predvolené" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Slovenian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Slovenian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Slovenian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Slovenian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Slovenian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sl/)\n" +"Language-Team: Slovenian (http://www.transifex.com/projects/p/xbmc-main/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,67 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "Sprejemnik ni več na voljo" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "[PONOV]" + +msgctxt "#30100" +msgid "Add Timer" +msgstr "Dodaj časovnik" + +msgctxt "#30120" +msgid "Recording Type" +msgstr "Tip snemanja" + +msgctxt "#30121" +msgid "Record Once" +msgstr "Posnemi enkrat" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "Posnemi sezono (NOVE epizode na tem programu)" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "Posnemi sezono (vse epizode na tem programu)" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "Posnemi sezono (dnevno, isti čas)" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "Posnemi sezono (tedensko, isti čas)" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "Posnemi sezono (ponedeljek-petek, isti čas)" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "Posnemi sezono (vikendi, isti čas)" + +msgctxt "#30130" +msgid "Keep" +msgstr "Obdrži" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "Vsi posnetki" + +msgctxt "#30132" +msgid "Pre-Padding (minutes)" +msgstr "Predčasni začetek (minute)" + +msgctxt "#30133" +msgid "Pre-Padding (minutes)" +msgstr "Predčasni začetek (minute)" + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "Mapa posnetkov" + +msgctxt "#30135" +msgid "Default" +msgstr "Privzeto" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Spanish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Spanish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Spanish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Spanish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es/)\n" +"Language-Team: Spanish (http://www.transifex.com/projects/p/xbmc-main/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,67 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "Sintonizador ya no está disponible" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "[RECUR]" + +msgctxt "#30100" +msgid "Add Timer" +msgstr "Añadir temporizador" + +msgctxt "#30120" +msgid "Recording Type" +msgstr "Tipo de grabación" + +msgctxt "#30121" +msgid "Record Once" +msgstr "Grabar una vez" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "Grabar la temporada (episodios nuevos en este canal)" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "Grabar la temporada (Todos los episodios de este canal)" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "Grabar la temporada (diariamente , en este horario)" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "Grabar la temporada (Semanalmente, en este horario)" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "rabar la temporada (de Lunes a Viernes, en este horario)" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "Grabar la temporada (Fines de semana, en este horario)" + +msgctxt "#30130" +msgid "Keep" +msgstr "Mantener" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "Todas las grabaciones" + +msgctxt "#30132" +msgid "Pre-Padding (minutes)" +msgstr "Pre-Padding (minutos)" + +msgctxt "#30133" +msgid "Pre-Padding (minutes)" +msgstr "Pre-Padding (minutos)" + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "Carpeta de grabaciones" + +msgctxt "#30135" +msgid "Default" +msgstr "Default" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Spanish (Argentina)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Spanish (Argentina)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Spanish (Argentina)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Spanish (Argentina)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es_AR/)\n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/xbmc-main/language/es_AR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,7 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "Sintonizador ya no está disponible" + +msgctxt "#30135" +msgid "Default" +msgstr "Por defecto" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Spanish (Mexico)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Spanish (Mexico)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Spanish (Mexico)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Spanish (Mexico)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es_MX/)\n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/xbmc-main/language/es_MX/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -40,3 +39,11 @@ msgctxt "#30052" msgid "Connection failed. Incorrect PIN?" msgstr "Conexión fallida. ¿PIN incorrecto?" + +msgctxt "#30130" +msgid "Keep" +msgstr "Mantener" + +msgctxt "#30135" +msgid "Default" +msgstr "Por defecto" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Swedish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Swedish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Swedish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Swedish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: NextPVR PVR Client # Addon id: pvr.nextpvr -# Addon version: 1.6.3 # Addon Provider: Graeme Blackley msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Swedish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sv/)\n" +"Language-Team: Swedish (http://www.transifex.com/projects/p/xbmc-main/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -56,3 +55,67 @@ msgctxt "#30053" msgid "Tuner no longer available" msgstr "Mottagaren är inte tillgänglig" + +msgctxt "#30054" +msgid "[RECUR]" +msgstr "[ÅTERK]" + +msgctxt "#30100" +msgid "Add Timer" +msgstr "Lägg till timer" + +msgctxt "#30120" +msgid "Recording Type" +msgstr "Inspelningstyp" + +msgctxt "#30121" +msgid "Record Once" +msgstr "Spela in en gång" + +msgctxt "#30122" +msgid "Record Season (NEW episodes on this channel)" +msgstr "Säsongsinspelning (NYA avsnitt på denna kanalen)" + +msgctxt "#30123" +msgid "Record Season (All episodes on this channel)" +msgstr "Säsongsinspelning (alla avsnitt på denna kanalen)" + +msgctxt "#30124" +msgid "Record Season (Daily, this timeslot)" +msgstr "Säsongsinspelning (dagligen, denna tid)" + +msgctxt "#30125" +msgid "Record Season (Weekly, this timeslot)" +msgstr "Säsongsinspelning (varje vecka, denna tid)" + +msgctxt "#30126" +msgid "Record Season (Monday-Friday, this timeslot)" +msgstr "Säsongsinspelning (Måndag-Fredag, denna tid)" + +msgctxt "#30127" +msgid "Record Season (Weekends, this timeslot)" +msgstr "Säsongsinspelning (helger, denna tid)" + +msgctxt "#30130" +msgid "Keep" +msgstr "Behåll" + +msgctxt "#30131" +msgid "All Recordings" +msgstr "Alla inspelningar" + +msgctxt "#30132" +msgid "Pre-Padding (minutes)" +msgstr "Starta före (i minuter)" + +msgctxt "#30133" +msgid "Pre-Padding (minutes)" +msgstr "Starta före (i minuter)" + +msgctxt "#30134" +msgid "Recording Directory" +msgstr "Inspelningsmapp" + +msgctxt "#30135" +msgid "Default" +msgstr "Standard" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Tajik/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Tajik/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Tajik/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Tajik/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Tajik (http://www.transifex.com/projects/p/xbmc-main/language/tg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30041" +msgid "Advanced" +msgstr "Иловагӣ" + +msgctxt "#30130" +msgid "Keep" +msgstr "Нигоҳ доштан" + +msgctxt "#30135" +msgid "Default" +msgstr "Пешфарз" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Tamil (India)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Tamil (India)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Tamil (India)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Tamil (India)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,61 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Tamil (India) (http://www.transifex.com/projects/p/xbmc-main/language/ta_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "NextPVR Hostname" +msgstr "NextPVR புரவன்பெயர்" + +msgctxt "#30001" +msgid "NextPVR Port (usually 8866 or 7799)" +msgstr "NextPVR முணையம் (பொதுவாக 8866 அல்லது 7799)" + +msgctxt "#30002" +msgid "NextPVR PinCode" +msgstr "NextPVR பின்கோடு" + +msgctxt "#30003" +msgid "Enable TimeShift with Live TV" +msgstr "நேரடி டிவி காண நேர மாற்றத்தை செயல்படுத்து" + +msgctxt "#30040" +msgid "Connection" +msgstr "இணைப்பு" + +msgctxt "#30041" +msgid "Advanced" +msgstr "மேம்பட்ட" + +msgctxt "#30050" +msgid "NextPVR server is too old." +msgstr "NextPVR சேவையகம் மிகவும் பழமையானது." + +msgctxt "#30051" +msgid "Upgrade to '%s' or higher!" +msgstr "'%s' அல்லது அதற்கு மேல் மேம்படுத்து!" + +msgctxt "#30052" +msgid "Connection failed. Incorrect PIN?" +msgstr "இணைப்பு தோல்வியுற்றது. தவறான PIN?" + +msgctxt "#30053" +msgid "Tuner no longer available" +msgstr "வானொலி இனி கிடைக்காது" + +msgctxt "#30135" +msgid "Default" +msgstr "இயல்புநிலை" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Thai/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Thai/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Thai/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Thai/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Thai (http://www.transifex.com/projects/p/xbmc-main/language/th/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30041" +msgid "Advanced" +msgstr "ขั้นสูง" + +msgctxt "#30130" +msgid "Keep" +msgstr "คงไว้" + +msgctxt "#30135" +msgid "Default" +msgstr "ค่าเริ่มต้น" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Turkish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Turkish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Turkish/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Turkish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,53 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Turkish (http://www.transifex.com/projects/p/xbmc-main/language/tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30001" +msgid "NextPVR Port (usually 8866 or 7799)" +msgstr "NextPVR Portu (genellikle 8866 veya 7799'dur)" + +msgctxt "#30002" +msgid "NextPVR PinCode" +msgstr "NextPVR Pin Kodu" + +msgctxt "#30040" +msgid "Connection" +msgstr "Bağlantı" + +msgctxt "#30041" +msgid "Advanced" +msgstr "Gelişmiş" + +msgctxt "#30050" +msgid "NextPVR server is too old." +msgstr "NextPVR sunucusu çok eski." + +msgctxt "#30051" +msgid "Upgrade to '%s' or higher!" +msgstr "'%s' yada daha yükseğine güncelleştir!" + +msgctxt "#30052" +msgid "Connection failed. Incorrect PIN?" +msgstr "Bağlantı başarısız. PIN doğru mu?" + +msgctxt "#30130" +msgid "Keep" +msgstr "Sakla" + +msgctxt "#30135" +msgid "Default" +msgstr "Varsayılan" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Ukrainian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Ukrainian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Ukrainian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Ukrainian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,61 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Ukrainian (http://www.transifex.com/projects/p/xbmc-main/language/uk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "NextPVR Hostname" +msgstr "Сервер NextPVR" + +msgctxt "#30001" +msgid "NextPVR Port (usually 8866 or 7799)" +msgstr "Порт NextPVR (зазвичай 8866 або 7799)" + +msgctxt "#30002" +msgid "NextPVR PinCode" +msgstr "Пін-код NextPVR" + +msgctxt "#30003" +msgid "Enable TimeShift with Live TV" +msgstr "Включити зсув часу з Live TV" + +msgctxt "#30040" +msgid "Connection" +msgstr "Зв’язок" + +msgctxt "#30041" +msgid "Advanced" +msgstr "Більше" + +msgctxt "#30050" +msgid "NextPVR server is too old." +msgstr "Сервер NextPVR застарів." + +msgctxt "#30051" +msgid "Upgrade to '%s' or higher!" +msgstr "Оновити до '%s' або вище!" + +msgctxt "#30052" +msgid "Connection failed. Incorrect PIN?" +msgstr "Зв’язок не вдався. Неправильний пін?" + +msgctxt "#30053" +msgid "Tuner no longer available" +msgstr "Тюнер більше не доступний" + +msgctxt "#30135" +msgid "Default" +msgstr "За промовчанням" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Uzbek/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Uzbek/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Uzbek/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Uzbek/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Uzbek (http://www.transifex.com/projects/p/xbmc-main/language/uz/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uz\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30135" +msgid "Default" +msgstr "Andoza" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Vietnamese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Vietnamese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Vietnamese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Vietnamese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,61 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Vietnamese (http://www.transifex.com/projects/p/xbmc-main/language/vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "NextPVR Hostname" +msgstr "Tên miền NextPVR" + +msgctxt "#30001" +msgid "NextPVR Port (usually 8866 or 7799)" +msgstr "Cổng NextPVR (thông thường là 8866 hoặc 7799)" + +msgctxt "#30002" +msgid "NextPVR PinCode" +msgstr "Mã Pin NextPVR" + +msgctxt "#30003" +msgid "Enable TimeShift with Live TV" +msgstr "Sử dụng chế độ TimeShift với Live TV" + +msgctxt "#30040" +msgid "Connection" +msgstr "Kết nối" + +msgctxt "#30041" +msgid "Advanced" +msgstr "Nâng cao" + +msgctxt "#30050" +msgid "NextPVR server is too old." +msgstr "Máy chủ NextPVR đã không còn sử dụng." + +msgctxt "#30051" +msgid "Upgrade to '%s' or higher!" +msgstr "Nâng cấp lên phiên bản '%s' hoặc mới hơn!" + +msgctxt "#30052" +msgid "Connection failed. Incorrect PIN?" +msgstr "Không thể kết nối được. Kiểm tra lại mã Pin?" + +msgctxt "#30053" +msgid "Tuner no longer available" +msgstr "Dò kênh không được hỗ trợ" + +msgctxt "#30135" +msgid "Default" +msgstr "Mặc định" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Vietnamese (Viet Nam)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Vietnamese (Viet Nam)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Vietnamese (Viet Nam)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Vietnamese (Viet Nam)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/projects/p/xbmc-main/language/vi_VN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi_VN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30041" +msgid "Advanced" +msgstr "Nâng ca" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Welsh/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Welsh/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/language/Welsh/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/language/Welsh/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,61 @@ +# XBMC Media Center language file +# Addon Name: NextPVR PVR Client +# Addon id: pvr.nextpvr +# Addon Provider: Graeme Blackley +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Welsh (http://www.transifex.com/projects/p/xbmc-main/language/cy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" + +msgctxt "#30000" +msgid "NextPVR Hostname" +msgstr "Enw Gwesteiwr NextPVR" + +msgctxt "#30001" +msgid "NextPVR Port (usually 8866 or 7799)" +msgstr "Porth NextPVR (8866 neu 7799 fel rheol)" + +msgctxt "#30002" +msgid "NextPVR PinCode" +msgstr "Cod PIN NextPVR" + +msgctxt "#30003" +msgid "Enable TimeShift with Live TV" +msgstr "Galluogi SymudAmser gyda Teledu Byw?" + +msgctxt "#30040" +msgid "Connection" +msgstr "Cysylltiad" + +msgctxt "#30041" +msgid "Advanced" +msgstr "Uwch" + +msgctxt "#30050" +msgid "NextPVR server is too old." +msgstr "Mae gweinydd NextPVR yn rhy hen." + +msgctxt "#30051" +msgid "Upgrade to '%s' or higher!" +msgstr "Diweddaru i '%s' neu uwch!" + +msgctxt "#30052" +msgid "Connection failed. Incorrect PIN?" +msgstr "Methodd y cysylltiad. PIN anghywir?" + +msgctxt "#30053" +msgid "Tuner no longer available" +msgstr "Tiwniwr ddim ar gael" + +msgctxt "#30135" +msgid "Default" +msgstr "Rhagosodiad" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/skins/skin.confluence/720p/RecordPrefs.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/skins/skin.confluence/720p/RecordPrefs.xml --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/addon/resources/skins/skin.confluence/720p/RecordPrefs.xml 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/addon/resources/skins/skin.confluence/720p/RecordPrefs.xml 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,215 @@ + + 21 + + 1 + 240 + 100 + + dialogeffect + + + background image + 0 + 0 + 800 + 500 + DialogBack.png + + + Dialog Header image + 40 + 16 + 720 + 40 + dialogheader.png + + + header label + 40 + 20 + 720 + 30 + font13_title + + center + center + selected + black + + + Close Window button + 710 + 15 + 64 + 32 + + - + + DialogCloseButton-focus.png + DialogCloseButton.png + 10 + 10 + 10 + 10 + system.getbool(input.enablemouse) + + + + + 40 + 60 + 720 + 30 + font13_title + + left + center + white + + + + + 40 + 100 + 720 + 100 + font13_title + + left + center + grey2 + + true + + + + recording type + 40 + 200 + 720 + 40 + font13 + grey2 + white + button-nofocus.png + button-focus2.png + + 21 + 21 + 1 + 25 + + + + pre padding + 40 + 245 + 720 + 40 + font13 + grey2 + white + button-nofocus.png + button-focus2.png + + 23 + 23 + 21 + 26 + + + + post padding + 40 + 290 + 720 + 40 + font13 + grey2 + white + button-nofocus.png + button-focus2.png + + 23 + 23 + 25 + 23 + + + + keep count + 40 + 335 + 720 + 40 + font13 + grey2 + white + button-nofocus.png + button-focus2.png + + 23 + 23 + 26 + 27 + + + + recording directory + 40 + 380 + 720 + 40 + font13 + grey2 + white + button-nofocus.png + button-focus2.png + + 23 + 23 + 23 + 1 + + + + 190 + 435 + + Ok Button + 0 + 0 + 200 + 40 + center + center + button-nofocus.png + button-focus.png + + font12_title + 27 + 2 + 2 + 21 + + + Cancel Button + 210 + 0 + 200 + 40 + center + center + button-nofocus.png + button-focus.png + + font12_title + 27 + 1 + 1 + 21 + + + + + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/Makefile.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/Makefile.am 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/Makefile.am 2014-01-04 10:28:12.000000000 +0000 @@ -10,11 +10,11 @@ LIBNAME = libnextpvr-addon lib_LTLIBRARIES = libnextpvr-addon.la -LIBS = @abs_top_builddir@/lib/tinyxml/libtinyxml.la +LIBS = @abs_top_srcdir@/lib/tinyxml/libtinyxml.la include ../Makefile.include.am -INCLUDES+=-I$(srcdir)/src +INCLUDES+=-Isrc libnextpvr_addon_la_SOURCES = src/client.cpp \ src/pvrclient-nextpvr.cpp \ @@ -22,5 +22,6 @@ src/uri.cpp \ src/md5.cpp \ src/liveshift.cpp \ - src/RingBuffer.cpp + src/RingBuffer.cpp \ + src/DialogRecordPref.cpp libnextpvr_addon_la_LDFLAGS = @TARGET_LDFLAGS@ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/project/VS2010Express/XBMC_NextPVR.vcxproj xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/project/VS2010Express/XBMC_NextPVR.vcxproj --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/project/VS2010Express/XBMC_NextPVR.vcxproj 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/project/VS2010Express/XBMC_NextPVR.vcxproj 2014-01-04 10:28:12.000000000 +0000 @@ -107,6 +107,10 @@ MachineX86 + + + + @@ -118,6 +122,7 @@ + @@ -127,6 +132,7 @@ + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/project/VS2010Express/XBMC_NextPVR.vcxproj.filters xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/project/VS2010Express/XBMC_NextPVR.vcxproj.filters --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/project/VS2010Express/XBMC_NextPVR.vcxproj.filters 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/project/VS2010Express/XBMC_NextPVR.vcxproj.filters 2014-01-04 10:28:12.000000000 +0000 @@ -32,6 +32,9 @@ Source Files + + Source Files + @@ -55,5 +58,8 @@ Header Files + + Header Files + \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/src/client.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/src/client.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/src/client.cpp 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/src/client.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -42,6 +42,7 @@ std::string g_szClientPath = ""; CHelper_libXBMC_addon *XBMC = NULL; CHelper_libXBMC_pvr *PVR = NULL; +CHelper_libXBMC_gui *GUI = NULL; bool g_bUseTimeshift = false; extern "C" { @@ -69,6 +70,15 @@ return ADDON_STATUS_PERMANENT_FAILURE; } + // register gui + GUI = new CHelper_libXBMC_gui; + if (!GUI->RegisterMe(hdl)) + { + SAFE_DELETE(GUI); + SAFE_DELETE(XBMC); + return ADDON_STATUS_PERMANENT_FAILURE; + } + PVR = new CHelper_libXBMC_pvr; if (!PVR->RegisterMe(hdl)) { @@ -85,7 +95,7 @@ ADDON_ReadSettings(); - /* Create connection to MediaPortal XBMC TV client */ + /* Create connection to NextPVR XBMC TV client */ g_client = new cPVRClientNextPVR(); if (!g_client->Connect()) { @@ -251,6 +261,10 @@ } +void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ +} + /*********************************************************** * PVR Client AddOn specific public library functions ***********************************************************/ @@ -267,6 +281,18 @@ return strMinApiVersion; } +const char* GetGUIAPIVersion(void) +{ + static const char *strGuiApiVersion = XBMC_GUI_API_VERSION; + return strGuiApiVersion; +} + +const char* GetMininumGUIAPIVersion(void) +{ + static const char *strMinGuiApiVersion = XBMC_GUI_MIN_API_VERSION; + return strMinGuiApiVersion; +} + //-- GetAddonCapabilities ----------------------------------------------------- // Tell XBMC our requirements //----------------------------------------------------------------------------- @@ -284,7 +310,8 @@ pCapabilities->bHandlesInputStream = true; pCapabilities->bHandlesDemuxing = false; pCapabilities->bSupportsChannelScan = false; - pCapabilities->bSupportsLastPlayedPosition = false; + pCapabilities->bSupportsLastPlayedPosition = true; + pCapabilities->bSupportsRecordingEdl = true; return PVR_ERROR_NO_ERROR; } @@ -351,7 +378,7 @@ return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook) +PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_MENUHOOK_DATA &item) { return PVR_ERROR_NOT_IMPLEMENTED; } @@ -665,6 +692,27 @@ return false; } +PVR_ERROR SetRecordingLastPlayedPosition(const PVR_RECORDING &recording, int lastplayedposition) +{ + if (g_client) + return g_client->SetRecordingLastPlayedPosition(recording, lastplayedposition); + return PVR_ERROR_SERVER_ERROR; +} + +int GetRecordingLastPlayedPosition(const PVR_RECORDING &recording) +{ + if (g_client) + return g_client->GetRecordingLastPlayedPosition(recording); + return -1; +} + +PVR_ERROR GetRecordingEdl(const PVR_RECORDING &recording, PVR_EDL_ENTRY entries[], int *size) +{ + if (g_client) + return g_client->GetRecordingEdl(recording, entries, size); + return PVR_ERROR_SERVER_ERROR; +} + /** UNUSED API FUNCTIONS */ PVR_ERROR MoveChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } @@ -674,10 +722,11 @@ void DemuxFlush(void) {} PVR_ERROR SetRecordingPlayCount(const PVR_RECORDING &recording, int count) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR SetRecordingLastPlayedPosition(const PVR_RECORDING &recording, int lastplayedposition) { return PVR_ERROR_NOT_IMPLEMENTED; } -int GetRecordingLastPlayedPosition(const PVR_RECORDING &recording) { return -1; } unsigned int GetChannelSwitchDelay(void) { return 0; } bool SeekTime(int,bool,double*) { return false; } void SetSpeed(int) {}; +time_t GetPlayingTime() { return 0; } +time_t GetBufferTimeStart() { return 0; } +time_t GetBufferTimeEnd() { return 0; } } //end extern "C" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/src/client.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/src/client.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/src/client.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/src/client.h 2014-01-04 10:28:12.000000000 +0000 @@ -26,6 +26,7 @@ #include "platform/util/StdString.h" #include "libXBMC_addon.h" #include "libXBMC_pvr.h" +#include "libXBMC_gui.h" enum eStreamingMethod { @@ -51,6 +52,7 @@ extern ADDON::CHelper_libXBMC_addon *XBMC; extern CHelper_libXBMC_pvr *PVR; +extern CHelper_libXBMC_gui *GUI; extern int g_iTVServerXBMCBuild; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/src/DialogRecordPref.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/src/DialogRecordPref.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/src/DialogRecordPref.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/src/DialogRecordPref.cpp 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,213 @@ +/* + * Copyright (C) 2005-2011 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#include "DialogRecordPref.h" +#include "libXBMC_gui.h" + +#include +#include + +#define BUTTON_OK 1 +#define BUTTON_CANCEL 2 +#define BUTTON_CLOSE 22 + +#define RADIO_BUTTON_EPISODE 10 +#define RADIO_BUTTON_SERIES 11 +#define SPIN_CONTROLRunType 12 +#define SPIN_CONTROL_CHANNEL 13 +#define SPIN_CONTROL_AIRTIME 14 +#define LABEL_SHOW_NAME 20 +#define SPIN_CONTROL_RECORD_TYPE 21 +#define SPIN_CONTROL_KEEP_COUNT 23 +#define LABEL_SHOW_DESCRIPTION 24 +#define SPIN_CONTROL_PRE_PADDING 25 +#define SPIN_CONTROL_POST_PADDING 26 +#define SPIN_CONTROL_RECORDING_DIR 27 + + +CDialogRecordPref::CDialogRecordPref(std::string showName, std::string showDescription, int iPrePadding, int iPostPadding, std::string recordingDirectories) +{ + _showName = showName; + _showDescription = showDescription; + + PrePadding = iPrePadding; + PostPadding = iPostPadding; + RecordingDirectory = recordingDirectories; + + // needed for every dialog + _confirmed = -1; // init to failed load value (due to xml file not being found) + _window = GUI->Window_create("RecordPrefs.xml", "Confluence", false, true); + _window->m_cbhdl = this; + _window->CBOnInit = OnInitCB; + _window->CBOnFocus = OnFocusCB; + _window->CBOnClick = OnClickCB; + _window->CBOnAction = OnActionCB; +} + +CDialogRecordPref::~CDialogRecordPref() +{ + GUI->Window_destroy(_window); +} + + +bool CDialogRecordPref::OnInit() +{ + // display the show name in the window + _window->SetControlLabel(LABEL_SHOW_NAME, _showName.c_str()); + _window->SetControlLabel(LABEL_SHOW_DESCRIPTION, _showDescription.c_str()); + + // init record-type + _spinRecordType = GUI->Control_getSpin(_window, SPIN_CONTROL_RECORD_TYPE); + _spinRecordType->AddLabel(XBMC->GetLocalizedString(30121), 0); // record-once + _spinRecordType->AddLabel(XBMC->GetLocalizedString(30122), 1); // record-season (new episodes) + _spinRecordType->AddLabel(XBMC->GetLocalizedString(30123), 2); // record-season (all episodes) + _spinRecordType->AddLabel(XBMC->GetLocalizedString(30124), 3); // record-season (daily, this timeslot) + _spinRecordType->AddLabel(XBMC->GetLocalizedString(30125), 4); // record-season (weekly, this timeslot) + _spinRecordType->AddLabel(XBMC->GetLocalizedString(30126), 5); // record-season (mon-fri, this timeslot) + _spinRecordType->AddLabel(XBMC->GetLocalizedString(30127), 6); // record-season (weekends, this timeslot) + _spinRecordType->SetValue(0); + + // init keep count + _spinKeepCount = GUI->Control_getSpin(_window, SPIN_CONTROL_KEEP_COUNT); + _spinKeepCount->AddLabel(XBMC->GetLocalizedString(30131), 0); // keep all recordings + for (int i=1; i<31; i++) + { + char text[20]; + sprintf(text, "%d", i); + _spinKeepCount->AddLabel(text, i); // keep all recordings + } + _spinKeepCount->SetValue(0); + + // init padding + _spinPrePadding = GUI->Control_getSpin(_window, SPIN_CONTROL_PRE_PADDING); + _spinPostPadding = GUI->Control_getSpin(_window, SPIN_CONTROL_POST_PADDING); + for (int i=0; i<90; i++) + { + char text[20]; + sprintf(text, "%d", i); + _spinPrePadding->AddLabel(text, i); + _spinPostPadding->AddLabel(text, i); + } + _spinPrePadding->SetValue(PrePadding); + _spinPostPadding->SetValue(PostPadding); + + // recording directories + _spinRecordingDirectory = GUI->Control_getSpin(_window, SPIN_CONTROL_RECORDING_DIR); + _spinRecordingDirectory->AddLabel(XBMC->GetLocalizedString(30135), 0); // Default + std::istringstream directories(RecordingDirectory); + std::string directory; + int index = 0; + while (std::getline(directories, directory, ',')) + { + _spinRecordingDirectory->AddLabel(directory.c_str(), index++); + _recordingDirectories.push_back(directory); + } + + return true; +} + +bool CDialogRecordPref::OnClick(int controlId) +{ + switch(controlId) + { + case BUTTON_OK: // save value from GUI, then FALLS THROUGH TO CANCEL + RecordingType = _spinRecordType->GetValue(); + Keep = _spinKeepCount->GetValue(); + PrePadding = _spinPrePadding->GetValue(); + PostPadding = _spinPostPadding->GetValue(); + RecordingDirectory = "["; + RecordingDirectory +=_recordingDirectories[_spinRecordingDirectory->GetValue()]; + RecordingDirectory += "]"; + case BUTTON_CANCEL: + case BUTTON_CLOSE: + if (_confirmed == -1)// if not previously confirmed, set to cancel value + _confirmed = 0; + _window->Close(); + GUI->Control_releaseSpin(_spinRecordType); + GUI->Control_releaseSpin(_spinKeepCount); + break; + } + + return true; +} + +bool CDialogRecordPref::OnInitCB(GUIHANDLE cbhdl) +{ + CDialogRecordPref* dialog = static_cast(cbhdl); + return dialog->OnInit(); +} + +bool CDialogRecordPref::OnClickCB(GUIHANDLE cbhdl, int controlId) +{ + CDialogRecordPref* dialog = static_cast(cbhdl); + if (controlId == BUTTON_OK) + dialog->_confirmed = 1; + //dialog->_confirmed = (controlId == BUTTON_OK); + return dialog->OnClick(controlId); +} + +bool CDialogRecordPref::OnFocusCB(GUIHANDLE cbhdl, int controlId) +{ + CDialogRecordPref* dialog = static_cast(cbhdl); + return dialog->OnFocus(controlId); +} + +bool CDialogRecordPref::OnActionCB(GUIHANDLE cbhdl, int actionId) +{ + CDialogRecordPref* dialog = static_cast(cbhdl); + return dialog->OnAction(actionId); +} + +bool CDialogRecordPref::Show() +{ + if (_window) + return _window->Show(); + + return false; +} + +void CDialogRecordPref::Close() +{ + if (_window) + _window->Close(); +} + +int CDialogRecordPref::DoModal() +{ + if (_window) + _window->DoModal(); + return _confirmed; // return true if user didn't cancel dialog +} + + +bool CDialogRecordPref::OnFocus(int controlId) +{ + return true; +} + +bool CDialogRecordPref::OnAction(int actionId) +{ + if (actionId == ADDON_ACTION_CLOSE_DIALOG || actionId == ADDON_ACTION_PREVIOUS_MENU || actionId == 92/*back*/) + return OnClick(BUTTON_CANCEL); + else + return false; +} + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/src/DialogRecordPref.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/src/DialogRecordPref.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/src/DialogRecordPref.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/src/DialogRecordPref.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,88 @@ +#pragma once + +/* + * Copyright (C) 2005-2012 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#include "client.h" +#include "pvrclient-nextpvr.h" +#include + +//struct TimerInfo +//{ +// bool isSeries; +// int runType; +// bool anyChannel; +// bool anyTime; +// std::string currentChannelName; +// std::string currentAirTime; +// std::string showName; +//} + +class CDialogRecordPref +{ + +public: + CDialogRecordPref(std::string showName, std::string showDescription, int iDefaultPrePadding, int iDefaultPostPadding, std::string recordingDirectories); + virtual ~CDialogRecordPref(); + + bool Show(); + void Close(); + int DoModal(); // returns -1=> load failed, 0=>canceled, 1=>confirmed + //bool LoadFailed(); + + // dialog specific params + int RecordingType; + int Keep; + int PrePadding; + int PostPadding; + std::string RecordingDirectory; +private: + std::string _currentChannel; // these are just used for dialog display + std::string _currentAirTime; + std::string _showName; + std::string _showDescription; + std::vector _recordingDirectories; + +private: + CAddonGUISpinControl *_spinRecordType; + CAddonGUISpinControl *_spinPrePadding; + CAddonGUISpinControl *_spinPostPadding; + CAddonGUISpinControl *_spinKeepCount; + CAddonGUISpinControl *_spinRecordingDirectory; + + // following is needed for every dialog +private: + CAddonGUIWindow *_window; + int _confirmed; //-1=> load failed, 0=>canceled, 1=>confirmed + + bool OnClick(int controlId); + bool OnFocus(int controlId); + bool OnInit(); + bool OnAction(int actionId); + + static bool OnClickCB(GUIHANDLE cbhdl, int controlId); + static bool OnFocusCB(GUIHANDLE cbhdl, int controlId); + static bool OnInitCB(GUIHANDLE cbhdl); + static bool OnActionCB(GUIHANDLE cbhdl, int actionId); + + +}; + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/src/pvrclient-nextpvr.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/src/pvrclient-nextpvr.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/src/pvrclient-nextpvr.cpp 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/src/pvrclient-nextpvr.cpp 2014-01-04 10:28:19.000000000 +0000 @@ -26,6 +26,7 @@ #include "client.h" #include "pvrclient-nextpvr.h" +#include "DialogRecordPref.h" #include "md5.h" @@ -44,7 +45,7 @@ /* PVR client version (don't forget to update also the addon.xml and the Changelog.txt files) */ #define PVRCLIENT_NEXTPVR_VERSION_STRING "1.0.0.0" -#define NEXTPVRC_MIN_VERSION_STRING "2.5.9" +#define NEXTPVRC_MIN_VERSION_STRING "3.1.1" #define HTTP_OK 200 #define HTTP_NOTFOUND 404 @@ -217,6 +218,21 @@ { m_supportsLiveTimeshift = true; } + + // load padding defaults + m_iDefaultPrePadding = 1; + m_iDefaultPostPadding = 2; + if ( settingsDoc.RootElement()->FirstChildElement("PrePadding") != NULL && settingsDoc.RootElement()->FirstChildElement("PrePadding")->FirstChild() != NULL) + { + m_iDefaultPrePadding = atoi(settingsDoc.RootElement()->FirstChildElement("PrePadding")->FirstChild()->Value()); + m_iDefaultPostPadding = atoi( settingsDoc.RootElement()->FirstChildElement("PostPadding")->FirstChild()->Value()); + } + + m_recordingDirectories = ""; + if ( settingsDoc.RootElement()->FirstChildElement("RecordingDirectories") != NULL && settingsDoc.RootElement()->FirstChildElement("RecordingDirectories")->FirstChild() != NULL) + { + m_recordingDirectories += settingsDoc.RootElement()->FirstChildElement("RecordingDirectories")->FirstChild()->Value(); + } } } @@ -334,8 +350,8 @@ if (doc.Parse(response) != NULL) { TiXmlElement* listingsNode = doc.RootElement()->FirstChildElement("listings"); - TiXmlElement* pListingNode = listingsNode->FirstChildElement("l"); - for( pListingNode; pListingNode; pListingNode=pListingNode->NextSiblingElement()) + TiXmlElement* pListingNode; + for( pListingNode = listingsNode->FirstChildElement("l"); pListingNode; pListingNode=pListingNode->NextSiblingElement()) { memset(&broadcast, 0, sizeof(EPG_TAG)); @@ -368,16 +384,27 @@ broadcast.strPlot = description; broadcast.strIconPath = ""; - // genre type - if (pListingNode->FirstChildElement("genre_type") != NULL && pListingNode->FirstChildElement("genre_type")->FirstChild() != NULL) - { - broadcast.iGenreType = atoi(pListingNode->FirstChildElement("genre_type")->FirstChild()->Value()); + char genre[128]; + genre[0] = '\0'; + if (pListingNode->FirstChildElement("genre") != NULL && pListingNode->FirstChildElement("genre")->FirstChild() != NULL) + { + broadcast.iGenreType = EPG_GENRE_USE_STRING; + PVR_STRCPY(genre, pListingNode->FirstChildElement("genre")->FirstChild()->Value()); + broadcast.strGenreDescription = genre; } - - // genre subtype - if (pListingNode->FirstChildElement("genre_subtype") != NULL && pListingNode->FirstChildElement("genre_subtype")->FirstChild() != NULL) + else { - broadcast.iGenreSubType = atoi(pListingNode->FirstChildElement("genre_subtype")->FirstChild()->Value()); + // genre type + if (pListingNode->FirstChildElement("genre_type") != NULL && pListingNode->FirstChildElement("genre_type")->FirstChild() != NULL) + { + broadcast.iGenreType = atoi(pListingNode->FirstChildElement("genre_type")->FirstChild()->Value()); + } + + // genre subtype + if (pListingNode->FirstChildElement("genre_subtype") != NULL && pListingNode->FirstChildElement("genre_subtype")->FirstChild() != NULL) + { + broadcast.iGenreSubType = atoi(pListingNode->FirstChildElement("genre_subtype")->FirstChild()->Value()); + } } broadcast.bNotify = false; @@ -409,8 +436,8 @@ if (doc.Parse(response) != NULL) { TiXmlElement* channelsNode = doc.RootElement()->FirstChildElement("channels"); - TiXmlElement* pChannelNode = channelsNode->FirstChildElement("channel"); - for( pChannelNode; pChannelNode; pChannelNode=pChannelNode->NextSiblingElement()) + TiXmlElement* pChannelNode; + for( pChannelNode = channelsNode->FirstChildElement("channel"); pChannelNode; pChannelNode=pChannelNode->NextSiblingElement()) { m_iChannelCount++; } @@ -513,8 +540,8 @@ if (doc.Parse(response) != NULL) { TiXmlElement* channelsNode = doc.RootElement()->FirstChildElement("channels"); - TiXmlElement* pChannelNode = channelsNode->FirstChildElement("channel"); - for( pChannelNode; pChannelNode; pChannelNode=pChannelNode->NextSiblingElement()) + TiXmlElement* pChannelNode; + for( pChannelNode = channelsNode->FirstChildElement("channel"); pChannelNode; pChannelNode=pChannelNode->NextSiblingElement()) { memset(&tag, 0, sizeof(PVR_CHANNEL)); tag.iUniqueId = atoi(pChannelNode->FirstChildElement("id")->FirstChild()->Value()); @@ -570,8 +597,8 @@ if (doc.Parse(response) != NULL) { TiXmlElement* groupsNode = doc.RootElement()->FirstChildElement("groups"); - TiXmlElement* pGroupNode = groupsNode->FirstChildElement("group"); - for( pGroupNode; pGroupNode; pGroupNode=pGroupNode->NextSiblingElement()) + TiXmlElement* pGroupNode; + for( pGroupNode = groupsNode->FirstChildElement("group"); pGroupNode; pGroupNode=pGroupNode->NextSiblingElement()) { groups++; } @@ -597,8 +624,8 @@ if (doc.Parse(response) != NULL) { TiXmlElement* groupsNode = doc.RootElement()->FirstChildElement("groups"); - TiXmlElement* pGroupNode = groupsNode->FirstChildElement("group"); - for( pGroupNode; pGroupNode; pGroupNode=pGroupNode->NextSiblingElement()) + TiXmlElement* pGroupNode; + for( pGroupNode = groupsNode->FirstChildElement("group"); pGroupNode; pGroupNode=pGroupNode->NextSiblingElement()) { memset(&tag, 0, sizeof(PVR_CHANNEL_GROUP)); tag.bIsRadio = false; @@ -633,8 +660,8 @@ if (doc.Parse(response) != NULL) { TiXmlElement* channelsNode = doc.RootElement()->FirstChildElement("channels"); - TiXmlElement* pChannelNode = channelsNode->FirstChildElement("channel"); - for( pChannelNode; pChannelNode; pChannelNode=pChannelNode->NextSiblingElement()) + TiXmlElement* pChannelNode; + for( pChannelNode = channelsNode->FirstChildElement("channel"); pChannelNode; pChannelNode=pChannelNode->NextSiblingElement()) { memset(&tag, 0, sizeof(PVR_CHANNEL_GROUP_MEMBER)); strncpy(tag.strGroupName, group.strGroupName, sizeof(tag.strGroupName)); @@ -666,8 +693,8 @@ TiXmlElement* recordingsNode = doc.RootElement()->FirstChildElement("recordings"); if (recordingsNode != NULL) { - TiXmlElement* pRecordingNode = recordingsNode->FirstChildElement("recording"); - for( pRecordingNode; pRecordingNode; pRecordingNode=pRecordingNode->NextSiblingElement()) + TiXmlElement* pRecordingNode; + for( pRecordingNode = recordingsNode->FirstChildElement("recording"); pRecordingNode; pRecordingNode=pRecordingNode->NextSiblingElement()) { recordingCount++; } @@ -690,8 +717,8 @@ PVR_RECORDING tag; TiXmlElement* recordingsNode = doc.RootElement()->FirstChildElement("recordings"); - TiXmlElement* pRecordingNode = recordingsNode->FirstChildElement("recording"); - for( pRecordingNode; pRecordingNode; pRecordingNode=pRecordingNode->NextSiblingElement()) + TiXmlElement* pRecordingNode; + for( pRecordingNode = recordingsNode->FirstChildElement("recording"); pRecordingNode; pRecordingNode=pRecordingNode->NextSiblingElement()) { memset(&tag, 0, sizeof(PVR_RECORDING)); @@ -713,6 +740,11 @@ tag.recordingTime = atoi(pRecordingNode->FirstChildElement("start_time_ticks")->FirstChild()->Value()); tag.iDuration = atoi(pRecordingNode->FirstChildElement("duration_seconds")->FirstChild()->Value()); + if (pRecordingNode->FirstChildElement("playback_position") != NULL && pRecordingNode->FirstChildElement("playback_position")->FirstChild() != NULL) + { + tag.iLastPlayedPosition = atoi(pRecordingNode->FirstChildElement("playback_position")->FirstChild()->Value()); + } + CStdString strStream; strStream.Format("http://%s:%d/live?recording=%s", g_szHostname, g_iPort, tag.strRecordingId); strncpy(tag.strStreamURL, strStream.c_str(), sizeof(tag.strStreamURL)); @@ -732,8 +764,8 @@ PVR_RECORDING tag; TiXmlElement* recordingsNode = doc.RootElement()->FirstChildElement("recordings"); - TiXmlElement* pRecordingNode = recordingsNode->FirstChildElement("recording"); - for( pRecordingNode; pRecordingNode; pRecordingNode=pRecordingNode->NextSiblingElement()) + TiXmlElement* pRecordingNode; + for( pRecordingNode = recordingsNode->FirstChildElement("recording"); pRecordingNode; pRecordingNode=pRecordingNode->NextSiblingElement()) { memset(&tag, 0, sizeof(PVR_RECORDING)); @@ -798,6 +830,62 @@ return PVR_ERROR_NO_ERROR; } +PVR_ERROR cPVRClientNextPVR::SetRecordingLastPlayedPosition(const PVR_RECORDING &recording, int lastplayedposition) +{ + XBMC->Log(LOG_DEBUG, "SetRecordingLastPlayedPosition"); + char request[512]; + sprintf(request, "/service?method=recording.watched.set&recording_id=%s&position=%d", recording.strRecordingId, lastplayedposition); + + CStdString response; + if (DoRequest(request, response) == HTTP_OK) + { + if (strstr(response, "") == NULL) + { + XBMC->Log(LOG_DEBUG, "SetRecordingLastPlayedPosition failed"); + return PVR_ERROR_FAILED; + } + } + return PVR_ERROR_NO_ERROR; +} + +int cPVRClientNextPVR::GetRecordingLastPlayedPosition(const PVR_RECORDING &recording) +{ + return recording.iLastPlayedPosition; +} + +PVR_ERROR cPVRClientNextPVR::GetRecordingEdl(const PVR_RECORDING& recording, PVR_EDL_ENTRY entries[], int *size) +{ + XBMC->Log(LOG_DEBUG, "GetRecordingEdl"); + char request[512]; + sprintf(request, "/service?method=recording.edl&recording_id=%s", recording.strRecordingId); + + CStdString response; + if (DoRequest(request, response) == HTTP_OK) + { + if (strstr(response, "") != NULL) + { + TiXmlDocument doc; + if (doc.Parse(response) != NULL) + { + int index = 0; + TiXmlElement* commercialsNode = doc.RootElement()->FirstChildElement("commercials"); + TiXmlElement* pCommercialNode; + for( pCommercialNode = commercialsNode->FirstChildElement("commercial"); pCommercialNode; pCommercialNode=pCommercialNode->NextSiblingElement()) + { + PVR_EDL_ENTRY entry; + entry.start = atoi(pCommercialNode->FirstChildElement("start")->FirstChild()->Value()) * 1000; + entry.end = atoi(pCommercialNode->FirstChildElement("end")->FirstChild()->Value()) * 1000 ; + entry.type = PVR_EDL_TYPE_COMBREAK; + entries[index] = entry; + index++; + } + *size = index; + return PVR_ERROR_NO_ERROR; + } + } + } + return PVR_ERROR_FAILED; +} /************************************************************/ /** Timer handling */ @@ -806,6 +894,28 @@ { int timerCount = 0; CStdString response; + + // get list of recurring recordings + if (DoRequest("/service?method=recording.recurring.list", response) == HTTP_OK) + { + TiXmlDocument doc; + if (doc.Parse(response) != NULL) + { + TiXmlElement* recordingsNode = doc.RootElement()->FirstChildElement("recurrings"); + if (recordingsNode != NULL) + { + TiXmlElement* pRecordingNode; + for( pRecordingNode = recordingsNode->FirstChildElement("recurring"); pRecordingNode; pRecordingNode=pRecordingNode->NextSiblingElement()) + { + timerCount++; + } + } + } + } + + + // get list of pending recordings + response = ""; if (DoRequest("/service?method=recording.list&filter=pending", response) == HTTP_OK) { TiXmlDocument doc; @@ -814,8 +924,8 @@ TiXmlElement* recordingsNode = doc.RootElement()->FirstChildElement("recordings"); if (recordingsNode != NULL) { - TiXmlElement* pRecordingNode = recordingsNode->FirstChildElement("recording"); - for( pRecordingNode; pRecordingNode; pRecordingNode=pRecordingNode->NextSiblingElement()) + TiXmlElement* pRecordingNode; + for( pRecordingNode = recordingsNode->FirstChildElement("recording"); pRecordingNode; pRecordingNode=pRecordingNode->NextSiblingElement()) { timerCount++; } @@ -829,6 +939,48 @@ PVR_ERROR cPVRClientNextPVR::GetTimers(ADDON_HANDLE handle) { CStdString response; + + // first add the recurring recordings + if (DoRequest("/service?method=recording.recurring.list&filter=pending", response) == HTTP_OK) + { + TiXmlDocument doc; + if (doc.Parse(response) != NULL) + { + PVR_TIMER tag; + TiXmlElement* recurringsNode = doc.RootElement()->FirstChildElement("recurrings"); + TiXmlElement* pRecurringNode; + for( pRecurringNode = recurringsNode->FirstChildElement("recurring"); pRecurringNode; pRecurringNode=pRecurringNode->NextSiblingElement()) + { + memset(&tag, 0, sizeof(tag)); + tag.iClientIndex = 0xF000000 + atoi(pRecurringNode->FirstChildElement("id")->FirstChild()->Value()); + + tag.iClientChannelUid = 8101; + + char strTitle[PVR_ADDON_NAME_STRING_LENGTH]; + strncpy(strTitle, pRecurringNode->FirstChildElement("name")->FirstChild()->Value(), sizeof(strTitle)-1); + strncat(tag.strTitle, XBMC->GetLocalizedString(30054), sizeof(tag.strTitle) - 1); + strncat(tag.strTitle, " ", sizeof(tag.strTitle) - 1); + strncat(tag.strTitle, strTitle, sizeof(tag.strTitle) - 1); + + //PVR_STRCPY(tag.strTitle, pRecurringNode->FirstChildElement("name")->FirstChild()->Value()); + //tag.iClientChannelUid = atoi(pRecurringNode->FirstChildElement("channel_id")->FirstChild()->Value()); + tag.state = PVR_TIMER_STATE_SCHEDULED; + + tag.startTime = time(NULL) - 96000; + tag.endTime = time(NULL) - 86000; + + PVR_STRCPY(tag.strSummary, "summary"); + + tag.bIsRepeating = true; + + // pass timer to xbmc + PVR->TransferTimerEntry(handle, &tag); + } + } + } + + // next add the one-off recordings. + response = ""; if (DoRequest("/service?method=recording.list&filter=pending", response) == HTTP_OK) { TiXmlDocument doc; @@ -837,8 +989,8 @@ PVR_TIMER tag; TiXmlElement* recordingsNode = doc.RootElement()->FirstChildElement("recordings"); - TiXmlElement* pRecordingNode = recordingsNode->FirstChildElement("recording"); - for( pRecordingNode; pRecordingNode; pRecordingNode=pRecordingNode->NextSiblingElement()) + TiXmlElement* pRecordingNode; + for( pRecordingNode = recordingsNode->FirstChildElement("recording"); pRecordingNode; pRecordingNode=pRecordingNode->NextSiblingElement()) { memset(&tag, 0, sizeof(tag)); @@ -900,23 +1052,83 @@ PVR_ERROR cPVRClientNextPVR::AddTimer(const PVR_TIMER &timerinfo) { + // editing recording is not supported + if (timerinfo.iClientIndex != -1) + { + return PVR_ERROR_NOT_IMPLEMENTED; + } + std::string encodedName = UriEncode(timerinfo.strTitle); - - // build request string - char request[1024]; - snprintf(request, sizeof(request), "/service?method=recording.save&name=%s&channel=%d&time_t=%d&duration=%d", - encodedName.c_str(), - timerinfo.iClientChannelUid, - (int)timerinfo.startTime, - (int)(timerinfo.endTime - timerinfo.startTime)); - // ask NextPVR to schedule our timer - CStdString response; - if (DoRequest(request, response) == HTTP_OK) + // manual recording (iEpgUid == -1) or instant recording (timerinfo.startTime == 0) + if (timerinfo.startTime == 0 || timerinfo.iEpgUid == -1) { - if (strstr(response, "")) + // build request + char request[1024]; + snprintf(request, sizeof(request), "/service?method=recording.save&name=%s&channel=%d&time_t=%d&duration=%d", + encodedName.c_str(), + timerinfo.iClientChannelUid, + (int)timerinfo.startTime, + (int)(timerinfo.endTime - timerinfo.startTime)); + + // send request to NextPVR + CStdString response; + if (DoRequest(request, response) == HTTP_OK) { - PVR->TriggerTimerUpdate(); + if (strstr(response, "")) + { + PVR->TriggerTimerUpdate(); + return PVR_ERROR_NO_ERROR; + } + } + } + else + { + CDialogRecordPref vWindow(timerinfo.strTitle, timerinfo.strSummary, m_iDefaultPrePadding, m_iDefaultPostPadding, m_recordingDirectories); + if (vWindow.DoModal() == 1) // user hit ok + { + // build request string + char request[1024]; + if (vWindow.RecordingType == 0) + { + // build one-off recording request + snprintf(request, sizeof(request), "/service?method=recording.save&name=%s&channel=%d&time_t=%d&duration=%d&pre_padding=%d&post_padding=%d&directory_id=%s", + encodedName.c_str(), + timerinfo.iClientChannelUid, + (int)timerinfo.startTime, + (int)(timerinfo.endTime - timerinfo.startTime), + vWindow.PrePadding, + vWindow.PostPadding, + vWindow.RecordingDirectory.c_str() + ); + } + else + { + // build recurring recording request + snprintf(request, sizeof(request), "/service?method=recording.recurring.save&event_id=%d&recurring_type=%d&keep=%d&pre_padding=%d&post_padding=%d&directory_id=%s", + timerinfo.iEpgUid, + vWindow.RecordingType, + vWindow.Keep, + vWindow.PrePadding, + vWindow.PostPadding, + vWindow.RecordingDirectory.c_str() + ); + } + + // send request to NextPVR + CStdString response; + if (DoRequest(request, response) == HTTP_OK) + { + if (strstr(response, "")) + { + PVR->TriggerTimerUpdate(); + return PVR_ERROR_NO_ERROR; + } + } + } + else + { + // cancel return PVR_ERROR_NO_ERROR; } } @@ -929,6 +1141,12 @@ char request[512]; sprintf(request, "/service?method=recording.delete&recording_id=%d", timer.iClientIndex); + // handle special-case for recurring recordings + if (timer.iClientIndex > 0xF000000) + { + sprintf(request, "/service?method=recording.recurring.delete&recurring_id=%d", (timer.iClientIndex - 0xF000000)); + } + CStdString response; if (DoRequest(request, response) == HTTP_OK) { @@ -986,6 +1204,12 @@ XBMC->Log(LOG_ERROR, "Could not connect to NextPVR backend for streaming"); return false; } + + if (m_pLiveShiftSource != NULL) + { + delete m_pLiveShiftSource; + m_pLiveShiftSource = NULL; + } char line[256]; sprintf(line, "GET /live?channel=%d&client=XBMC-%s HTTP/1.0\r\n", channelinfo.iChannelNumber, m_sid); @@ -1059,6 +1283,8 @@ int cPVRClientNextPVR::ReadLiveStream(unsigned char *pBuffer, unsigned int iBufferSize) { + //XBMC->Log(LOG_DEBUG, "ReadLiveStream"); + int read = iBufferSize; if (m_supportsLiveTimeshift && m_pLiveShiftSource != NULL) @@ -1072,6 +1298,7 @@ static int total = 0; total += rc; + //XBMC->Log(LOG_DEBUG, "ReadLiveStream read %d bytes. (total %d)", rc, total); return rc; } @@ -1090,10 +1317,10 @@ if (bufferMore) { - bool available = m_streamingclient->read_ready(); int read = m_streamingclient->receive((char *)buf, sizeof buf, 0); if (read > 0) { + //XBMC->Log(LOG_DEBUG, "ReadLiveStream() added %d bytes to buffer. (now at %d bytes)", read, m_incomingStreamBuffer.getMaxReadSize()); // write it to incoming ring buffer m_incomingStreamBuffer.WriteData((char *)buf, read); } @@ -1135,7 +1362,7 @@ m_currentLivePosition += read; } - XBMC->Log(LOG_DEBUG, "ReadLiveStream return %d bytes (%d bytes remaining in buffer)", read, m_incomingStreamBuffer.getMaxReadSize()); + //XBMC->Log(LOG_DEBUG, "ReadLiveStream return %d bytes (%d bytes remaining in buffer)", read, m_incomingStreamBuffer.getMaxReadSize()); return read; } @@ -1264,7 +1491,7 @@ return false; } - if (!m_streamingclient->connect("127.0.0.1", 8866)) + if (!m_streamingclient->connect(g_szHostname, g_iPort)) { XBMC->Log(LOG_ERROR, "Could not connect to NextPVR backend for streaming"); return false; @@ -1339,7 +1566,7 @@ bool cPVRClientNextPVR::OpenRecordedStream(const PVR_RECORDING &recording) { - XBMC->Log(LOG_DEBUG, "OpenRecordedStream(%d:%s)", recording.strRecordingId, recording.strTitle); + XBMC->Log(LOG_DEBUG, "OpenRecordedStream(%s:%s)", recording.strRecordingId, recording.strTitle); m_currentRecordingLength = 0; m_currentRecordingPosition = 0; @@ -1365,6 +1592,7 @@ int cPVRClientNextPVR::ReadRecordedStream(unsigned char *pBuffer, unsigned int iBufferSize) { PLATFORM::CLockObject lock(m_mutex); + XBMC->Log(LOG_DEBUG, "ReadRecordedStream(%d bytes from offset %d)", iBufferSize, (int)m_currentRecordingPosition); // do we have enough data to fill this buffer? unsigned char buf[188*100]; @@ -1382,6 +1610,7 @@ // read from buffer to return for XBMC m_incomingStreamBuffer.ReadData((char *)pBuffer, iBufferSize); m_currentRecordingPosition += iBufferSize; + XBMC->Log(LOG_DEBUG, "ReadRecordedStream return %d bytes", iBufferSize); return iBufferSize; } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/src/pvrclient-nextpvr.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/src/pvrclient-nextpvr.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/src/pvrclient-nextpvr.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/src/pvrclient-nextpvr.h 2014-01-04 10:28:12.000000000 +0000 @@ -67,6 +67,9 @@ PVR_ERROR GetRecordings(ADDON_HANDLE handle); PVR_ERROR DeleteRecording(const PVR_RECORDING &recording); PVR_ERROR RenameRecording(const PVR_RECORDING &recording); + PVR_ERROR SetRecordingLastPlayedPosition(const PVR_RECORDING &recording, int lastplayedposition); + int GetRecordingLastPlayedPosition(const PVR_RECORDING &recording); + PVR_ERROR GetRecordingEdl(const PVR_RECORDING& recording, PVR_EDL_ENTRY[], int *size); /* Timer handling */ int GetNumTimers(void); @@ -124,6 +127,9 @@ bool m_supportsLiveTimeshift; long long m_currentLiveLength; long long m_currentLivePosition; + int m_iDefaultPrePadding; + int m_iDefaultPostPadding; + std::string m_recordingDirectories; CStdString m_PlaybackURL; LiveShiftSource *m_pLiveShiftSource; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/src/README xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/src/README --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/src/README 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/src/README 2014-01-04 10:28:12.000000000 +0000 @@ -11,8 +11,8 @@ - OSX (should work, not tested by me) Dependencies: -- NextPVR 2.6. May work also 2.5.8 (which is 2.5 + extra patches) - +- NextPVR 3.1.1 or higher. + This addon is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/src/Socket.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/src/Socket.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/src/Socket.cpp 2012-12-12 01:00:24.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/src/Socket.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -454,7 +454,7 @@ } -int Socket::recvfrom ( char* data, const int buffersize, const int minpacketsize, struct sockaddr* from, socklen_t* fromlen) const +int Socket::recvfrom ( char* data, const int buffersize, struct sockaddr* from, socklen_t* fromlen) const { int status = ::recvfrom(_sd, data, buffersize, 0, from, fromlen); @@ -658,7 +658,7 @@ } } -#elif defined TARGET_LINUX || defined TARGET_DARWIN +#elif defined TARGET_LINUX || defined TARGET_DARWIN || defined TARGET_FREEBSD bool Socket::set_non_blocking ( const bool b ) { int opts; @@ -767,6 +767,6 @@ { // Not needed for Linux } -#endif //TARGET_WINDOWS || TARGET_LINUX || TARGET_DARWIN +#endif //TARGET_WINDOWS || TARGET_LINUX || TARGET_DARWIN || TARGET_FREEBSD } //namespace NextPVR diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/src/Socket.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/src/Socket.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.nextpvr/src/Socket.h 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/src/Socket.h 2014-01-28 20:43:50.000000000 +0000 @@ -85,7 +85,7 @@ enum SocketDomain { - #if defined TARGET_LINUX || defined TARGET_DARWIN + #if defined TARGET_LINUX || defined TARGET_DARWIN || defined TARGET_FREEBSD pf_unix = PF_UNIX, pf_local = PF_LOCAL, #endif @@ -270,12 +270,11 @@ * * \param data Pointer to a character array of size buffersize. Used to store the received data. * \param buffersize Size of the 'data' buffer - * \param minpacketsize Do not return before at least 'minpacketsize' bytes are in the buffer. * \param from Optional: pointer to a sockaddr struct that will get the address from which the data is received * \param fromlen Optional, only required if 'from' is given: length of from struct * \return Number of bytes received or SOCKET_ERROR */ - int recvfrom ( char* data, const int buffersize, const int minpacketsize, struct sockaddr* from = NULL, socklen_t* fromlen = NULL) const; + int recvfrom ( char* data, const int buffersize, struct sockaddr* from = NULL, socklen_t* fromlen = NULL) const; bool set_non_blocking ( const bool ); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/addon.xml.in xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/addon.xml.in --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/addon.xml.in 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/addon.xml.in 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,69 @@ - + + Njoy N7 PVR Client + Njoy N7 ПВР клиент + Client PVR Njoy N7 + Klient PVR Njoy N7 + Rhaglen Rhaglenni Njoy N7 + Njoy N7 PVR Klient + Njoy N7 PVR Client + Πελάτης PVR Njoy N7 Njoy N7 PVR Client + Njoy N7 PVR Client + Cliente PVR Njoy N7 + Cliente PVR Njoy N7 + Cliente Njoy N7 PVR + Njoy N7 PVR klient + Client PVR Njoy N7 + Client numériscope Njoy N7 + Cliente PVR de Njoy N7 + Njoy N7 PVR Client + Njoy N7 PVR klijent + Njoy N7 PVR ügyfél + Klien Njoy N7 PVR + Client PVR Njoy N7 + Njoy N7 PVR クライアント + Njoy N7 PVR კლიენტი + Njoy N7 PVR 클라이언트 + Njoy N7 PVR klients + Njoy N7 PVR клиент + Klien PVR Njoy N7 + Njoy N7 PVR Client + Njoy N7 PVR cliënt + Njoy N7 PVR Klient + Klient PVR Njoy N7 + Cliente PVR Njoy N7 + Cliente de PVR Njoy N7 + Client PVR Njoy N7 + Njoy N7 PVR Клиент + Njoy N7 PVR Klient + Odjemalec PVR Njoy N7 + PVR клијент Njoy N7 + Njoy N7 PVR Klient + Njoy N7 PVR கிளையன் + Муштарии Njoy N7 PVR + Njoy N7 PVR İstemcisi + Клієнт Njoy N7 для PVR + Phần mềm PVR cho Njoy N7 + Njoy N7 PVR 客户端 + Njoy N7 PVR 用戶端 @OS@ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Amharic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Amharic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Amharic/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Amharic/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Amharic (http://www.transifex.com/projects/p/xbmc-main/language/am/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: am\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 Port" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Bulgarian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Bulgarian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Bulgarian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Bulgarian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Bulgarian (http://www.transifex.com/projects/p/xbmc-main/language/bg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 порт" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Burmese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Burmese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Burmese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Burmese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Burmese (http://www.transifex.com/projects/p/xbmc-main/language/my/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 Port" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Catalan/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Catalan/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Catalan/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Catalan/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Catalan (http://www.transifex.com/projects/p/xbmc-main/language/ca/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "IP N7" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "Port N7" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Chinese (Simple)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Chinese (Simple)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Chinese (Simple)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Chinese (Simple)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Chinese (Simple) (http://www.transifex.com/projects/p/xbmc-main/language/zh/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 端口" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Chinese (Traditional)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Chinese (Traditional)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Chinese (Traditional)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Chinese (Traditional)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Chinese (Traditional) (http://www.transifex.com/projects/p/xbmc-main/language/zh_TW/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 端口" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Croatian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Croatian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Croatian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Croatian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Croatian (http://www.transifex.com/projects/p/xbmc-main/language/hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP adresa" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 ulaz" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Czech/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Czech/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Czech/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Czech/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Czech (http://www.transifex.com/projects/p/xbmc-main/language/cs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "IP pro N7" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "Port N7" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Danish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Danish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Danish/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Danish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Danish (http://www.transifex.com/projects/p/xbmc-main/language/da/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 Port" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Dutch/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Dutch/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Dutch/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Dutch/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Dutch (http://www.transifex.com/projects/p/xbmc-main/language/nl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7-IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7-poort" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/English/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/English/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/English/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/English/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: Njoy N7 PVR Client # Addon id: pvr.njoy -# Addon version: 1.6.2 # Addon Provider: Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: English (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/en/)\n" +"Language-Team: English (http://www.transifex.com/projects/p/xbmc-main/language/en/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/English (New Zealand)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/English (New Zealand)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/English (New Zealand)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/English (New Zealand)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (New Zealand) (http://www.transifex.com/projects/p/xbmc-main/language/en_NZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_NZ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 Port" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Estonian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Estonian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Estonian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Estonian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Estonian (http://www.transifex.com/projects/p/xbmc-main/language/et/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 Port" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/French/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/French/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/French/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/French/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: French (http://www.transifex.com/projects/p/xbmc-main/language/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "IP de N7" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "Port de N7" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/French (Canada)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/French (Canada)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/French (Canada)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/French (Canada)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: French (Canada) (http://www.transifex.com/projects/p/xbmc-main/language/fr_CA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_CA\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "IP N7" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "Port N7" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Galician/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Galician/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Galician/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Galician/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Galician (http://www.transifex.com/projects/p/xbmc-main/language/gl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: gl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "IP de N7" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "Porto de N7" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Georgian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Georgian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Georgian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Georgian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Georgian (http://www.transifex.com/projects/p/xbmc-main/language/ka/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ka\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 პორტი" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/German/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/German/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/German/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/German/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: German (http://www.transifex.com/projects/p/xbmc-main/language/de/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 Port" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Greek/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Greek/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Greek/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Greek/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Greek (http://www.transifex.com/projects/p/xbmc-main/language/el/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "Διεύθυνση IP N7" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "Θύρα N7" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Hebrew/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Hebrew/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Hebrew/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Hebrew/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Hebrew (http://www.transifex.com/projects/p/xbmc-main/language/he/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 Port" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Hungarian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Hungarian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Hungarian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Hungarian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Hungarian (http://www.transifex.com/projects/p/xbmc-main/language/hu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP cím" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 Port" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Indonesian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Indonesian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Indonesian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Indonesian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Indonesian (http://www.transifex.com/projects/p/xbmc-main/language/id/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "IP N7" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "Port N7" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Italian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Italian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Italian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Italian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Italian (http://www.transifex.com/projects/p/xbmc-main/language/it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "IP N7" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "Potra N7" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Japanese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Japanese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Japanese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Japanese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Japanese (http://www.transifex.com/projects/p/xbmc-main/language/ja/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP アドレス" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 ポート" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Korean/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Korean/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Korean/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Korean/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Korean (http://www.transifex.com/projects/p/xbmc-main/language/ko/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 포트" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Latvian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Latvian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Latvian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Latvian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Latvian (http://www.transifex.com/projects/p/xbmc-main/language/lv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 Ports" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Macedonian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Macedonian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Macedonian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Macedonian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Macedonian (http://www.transifex.com/projects/p/xbmc-main/language/mk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mk\n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 Port" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Malay/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Malay/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Malay/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Malay/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Malay (http://www.transifex.com/projects/p/xbmc-main/language/ms/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "IP N7" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "Port N7" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Norwegian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Norwegian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Norwegian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Norwegian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Norwegian (http://www.transifex.com/projects/p/xbmc-main/language/no/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 Port" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Polish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Polish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Polish/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Polish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Polish (http://www.transifex.com/projects/p/xbmc-main/language/pl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 Port" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Portuguese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Portuguese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Portuguese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Portuguese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Portuguese (http://www.transifex.com/projects/p/xbmc-main/language/pt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 Porta" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Portuguese (Brazil)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Portuguese (Brazil)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Portuguese (Brazil)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Portuguese (Brazil)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/xbmc-main/language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "IP do N7" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "Porta do N7" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Romanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Romanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Romanian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Romanian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Romanian (http://www.transifex.com/projects/p/xbmc-main/language/ro/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "IP N7" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "Port N7" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Russian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Russian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Russian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Russian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Russian (http://www.transifex.com/projects/p/xbmc-main/language/ru/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 Port" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Serbian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Serbian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Serbian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Serbian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Serbian (http://www.transifex.com/projects/p/xbmc-main/language/sr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP адреса" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 порт" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Slovak/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Slovak/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Slovak/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Slovak/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Slovak (http://www.transifex.com/projects/p/xbmc-main/language/sk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 Port" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Slovenian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Slovenian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Slovenian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Slovenian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Slovenian (http://www.transifex.com/projects/p/xbmc-main/language/sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "IP N7" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "Vrata N7" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Spanish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Spanish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Spanish/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Spanish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Spanish (http://www.transifex.com/projects/p/xbmc-main/language/es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "IP N7" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "Puerto N7" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Spanish (Argentina)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Spanish (Argentina)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Spanish (Argentina)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Spanish (Argentina)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/xbmc-main/language/es_AR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_AR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "IP de N7" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "Puerto de N7" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Spanish (Mexico)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Spanish (Mexico)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Spanish (Mexico)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Spanish (Mexico)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/xbmc-main/language/es_MX/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_MX\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "Puerto N7" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Swedish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Swedish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Swedish/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Swedish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Swedish (http://www.transifex.com/projects/p/xbmc-main/language/sv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 Port" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Tajik/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Tajik/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Tajik/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Tajik/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Tajik (http://www.transifex.com/projects/p/xbmc-main/language/tg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "Порти N7" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Tamil (India)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Tamil (India)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Tamil (India)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Tamil (India)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Tamil (India) (http://www.transifex.com/projects/p/xbmc-main/language/ta_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 ஐபீ" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 துறை" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Turkish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Turkish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Turkish/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Turkish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Turkish (http://www.transifex.com/projects/p/xbmc-main/language/tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP'si" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "N7 Portu" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Ukrainian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Ukrainian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Ukrainian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Ukrainian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Ukrainian (http://www.transifex.com/projects/p/xbmc-main/language/uk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "Порт N7" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Vietnamese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Vietnamese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Vietnamese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Vietnamese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Vietnamese (http://www.transifex.com/projects/p/xbmc-main/language/vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "IP N7" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "Cổng N7" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Welsh/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Welsh/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/addon/resources/language/Welsh/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/addon/resources/language/Welsh/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: Njoy N7 PVR Client +# Addon id: pvr.njoy +# Addon Provider: Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Welsh (http://www.transifex.com/projects/p/xbmc-main/language/cy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" + +msgctxt "#30000" +msgid "N7 IP" +msgstr "N7 IP" + +msgctxt "#30001" +msgid "N7 Port" +msgstr "Porth N7" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/Makefile.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/Makefile.am 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/Makefile.am 2014-01-04 10:28:12.000000000 +0000 @@ -10,7 +10,7 @@ LIBNAME = libpvrnjoy-addon lib_LTLIBRARIES = libpvrnjoy-addon.la -LIBS = @abs_top_builddir@/lib/tinyxml/libtinyxml.la +LIBS = @abs_top_srcdir@/lib/tinyxml/libtinyxml.la include ../Makefile.include.am diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/project/VS2010Express/pvrclient_njoy.vcxproj xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/project/VS2010Express/pvrclient_njoy.vcxproj --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/project/VS2010Express/pvrclient_njoy.vcxproj 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/project/VS2010Express/pvrclient_njoy.vcxproj 2014-01-04 10:28:12.000000000 +0000 @@ -51,7 +51,7 @@ Disabled MultiThreadedDebug ..\..\..\..\xbmc;..\..\..\..\lib;..\..\..\..\lib\platform\windows - _WINDLL;_CRT_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;%(PreprocessorDefinitions) + _WINDLL;TARGET_WINDOWS;_CRT_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;%(PreprocessorDefinitions) true @@ -68,7 +68,7 @@ true MultiThreaded ..\..\..\..\xbmc;..\..\..\..\lib;..\..\..\..\lib\platform\windows - _WINDLL;_CRT_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;%(PreprocessorDefinitions) + _WINDLL;TARGET_WINDOWS;_CRT_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;%(PreprocessorDefinitions) true diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/src/client.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/src/client.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/src/client.cpp 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/src/client.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -64,6 +64,18 @@ return strMinApiVersion; } +const char* GetGUIAPIVersion(void) +{ + static const char *strGuiApiVersion = XBMC_GUI_API_VERSION; + return strGuiApiVersion; +} + +const char* GetMininumGUIAPIVersion(void) +{ + static const char *strMinGuiApiVersion = XBMC_GUI_MIN_API_VERSION; + return strMinGuiApiVersion; +} + ADDON_STATUS ADDON_Create(void* hdl, void* props) { if (!props) @@ -178,6 +190,11 @@ return; } +void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ + return; +} + /*********************************************************** * PVR Client AddOn specific public library functions ***********************************************************/ @@ -227,7 +244,7 @@ /** UNUSED API FUNCTIONS */ PVR_ERROR GetDriveSpace(long long *iTotal, long long *iUsed) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR DialogChannelScan() { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook) { return PVR_ERROR_NOT_IMPLEMENTED; } +PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_MENUHOOK_DATA &item) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart, time_t iEnd) { return PVR_ERROR_NOT_IMPLEMENTED; } int GetChannelGroupsAmount(void) { return 0; } PVR_ERROR GetChannelGroups(ADDON_HANDLE handle, bool bRadio) { return PVR_ERROR_NOT_IMPLEMENTED; } @@ -261,6 +278,7 @@ PVR_ERROR SetRecordingPlayCount(const PVR_RECORDING &recording, int count) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR SetRecordingLastPlayedPosition(const PVR_RECORDING &recording, int lastplayedposition) { return PVR_ERROR_NOT_IMPLEMENTED; } int GetRecordingLastPlayedPosition(const PVR_RECORDING &recording) { return -1; } +PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY[], int*) { return PVR_ERROR_NOT_IMPLEMENTED; }; int GetTimersAmount(void) { return -1; } PVR_ERROR GetTimers(ADDON_HANDLE handle) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR AddTimer(const PVR_TIMER &timer) { return PVR_ERROR_NOT_IMPLEMENTED; } @@ -273,4 +291,7 @@ bool CanSeekStream(void) { return false; } bool SeekTime(int,bool,double*) { return false; } void SetSpeed(int) {}; +time_t GetPlayingTime() { return 0; } +time_t GetBufferTimeStart() { return 0; } +time_t GetBufferTimeEnd() { return 0; } } //end extern "C" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/src/client.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/src/client.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/src/client.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/src/client.h 2014-01-04 10:28:12.000000000 +0000 @@ -23,6 +23,7 @@ #include "platform/util/StdString.h" #include "libXBMC_addon.h" #include "libXBMC_pvr.h" +#include "libXBMC_gui.h" #define DEFAULT_HOST "127.0.0.1" #define DEFAULT_PORT 80 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/src/N7Xml.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/src/N7Xml.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/src/N7Xml.cpp 2012-11-15 21:18:19.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/src/N7Xml.cpp 2014-01-04 10:28:19.000000000 +0000 @@ -123,14 +123,3 @@ return PVR_ERROR_NO_ERROR; } - -PVR_ERROR N7Xml::requestEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart, time_t iEnd) -{ - return PVR_ERROR_NOT_IMPLEMENTED; -} - -PVR_ERROR N7Xml::getSignal(PVR_SIGNAL_STATUS &qualityinfo) -{ - return PVR_ERROR_NOT_IMPLEMENTED; -} - diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/src/N7Xml.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/src/N7Xml.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.njoy/src/N7Xml.h 2012-11-15 21:18:19.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.njoy/src/N7Xml.h 2014-01-04 10:28:19.000000000 +0000 @@ -37,8 +37,6 @@ ~N7Xml(void); int getChannelsAmount(void); PVR_ERROR requestChannelList(ADDON_HANDLE handle, bool bRadio); - PVR_ERROR requestEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart, time_t iEnd); - PVR_ERROR getSignal(PVR_SIGNAL_STATUS &qualityinfo); void list_channels(void); private: std::vector m_channels; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/addon.xml.in xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/addon.xml.in --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/addon.xml.in 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/addon.xml.in 2014-05-04 06:40:43.000000000 +0000 @@ -1,39 +1,53 @@ - + + + PVR kliënt om VDR te konnekteer aan XBMC oor die VNSI koppelvlak PVR client to connect VDR to XBMC over the VNSI interface + ПВР клиент за свързване на VDR към XBMC чрез VNSI интерфейс + Client PVR per connectar VDR a XBMC sobre la interfície VNSI Klient PVR pro spojení VDR do XBMC skrze rozhraní VNSI + Rhaglen Recordydd i gysylltu VDR â XBMC dros rhyngwyneb VNSI PVR klient som forbinder VDR til XBMC over VNSI grænsefladen - Programm um XBMC mit VDR über die VNSI-Schnittstelle zu verbinden + PVR-Client, der einen VDR über das VNSI-Interface mit XBMC verbindet. Πελάτης PVR για σύνδεση του VDR στο XBMC διαμέσου του VNSI PVR client to connect VDR to XBMC over the VNSI interface + PVR client to connect VDR to XBMC over the VNSI interface Cliente PVR para conectar VDR a XBMC sobre la interfaz VNSI Cliente PVR para conectar VDR a XBMC sobre la interfaz VNSI PVR-asiakas, joka kytkee VDR:n XBMC:iin VNSI:n avulla Client d'enregistrement connectant l'Enregistreur de Disque Vidéo à XBMC via l'interface d'enregistrement de flux réseau vidéo + Client numériscope pour connecter VDR à XBMC par une interface VNSI. + Cliente PVR que conecta VDR ao XBMC mediante a interface VNSI קליינט PVR לחיבור VDR ל XBMC ע״י ממשק VNSI + PVR klijent za povezivanje VDR na XBMC preko VNSI sučelja PVR ügyfél a VDR és az XBMC VNSI interfészen keresztüli csatlakoztatásához + Klien PVR untuk mengkoneksikan VDR dengan XBMC melalui antarmuka VNSI Cliente PVR per connettere VDR a XBMC attraverso l'interfaccia VNSI + VNSIインタフェース上でVDRをXBMCに接続するためのPVRクライアント PVR client to connect VDR to XBMC over the VNSI interface PVR kliento prisijungimas VDR prie XBMC per VNSI sąsaja PVR клиент за поврзување со XBMC преку VNSI интерфејс - PVR client VDR verbinding te maken met XBMC op de VNSI-interface + Klin PVR untuk sambungkan VDR ke XBMC menerusi antaramuka VNSI + PVR client om VDR te verbinden met XBMC op de VNSI-interface + PVR-klient for å koble VDR til XBMC over VNSI-grensesnittet Klient PVR do podłączenia VDR do XBMC przez interfejs VNSI Cliente PVR para ligar VDR ao XBMC através da interface VNSI Cliente PVR para conectar VDR ao XBMC sobre interface VNSI @@ -41,64 +55,108 @@ PVR клиент для подключения VDR к XBMC через интерфейс VNSI PVR klientská aplikácia na pripojenie VDR servera do XBMC prostredníctvom rozhrania VNSI Odjemalec PVR za povezavo VDR in XBMC preko vmesnika VNSI + Klient PVR për lidhjen e VDR dhe XBMC mbi ndërfaqjen VNSI PVR-klient för att ansluta VDR till XBMC över VNSI-gränsnittet - 让XBMC通过VNSI界面与VDR连接的PVR客户端 + VNSI இடைமுகம் மேல் VDR ஐ XBMC ஓடு இணைக்கும் PVR பயனகம் + Клієнт PVR для зв’язку VDR з XBMC через інтерфейс VNSI + Trình PVR để kết nối VDR với XBMC qua giao tiếp VNSI + 让 XBMC 通过 VNSI 界面与 VDR 连接的 PVR 客户端 + PVR用戶端經由VNSI介面接口連接VDR到XBMC VDR voorprogram; ondersteun stroom van Lewendige TV & Opnames, EPG, Tydhouers oor die VNSI byvoegsel VDR frontend; supporting streaming of Live TV & Recordings, EPG, Timers over the VNSI plugin + VDR клиент. Поддържа стрийминг и записване на телевизия, електронен програмен справочник, броячи чрез VNSI приставка. + Frontal VDR; suportant fluxes de TV en directe i enregistraments, EPG, temporitzadors sobre el connector VNSI Rozhraní VDR. Podporuje proudové vysílání živého vysílání a nahrávek, poslech kanálů rádia, EPG, a časovače skrze modul VNSI - VDR frontend; understøtter streaming af TV og Optagelser, EPG og Timere over VNSI add-on - Erlaubt das wiedergeben von Live TV und Aufnahmen mittels VDR auf XBMC. Des weiteren werden EPG, Kanalsuche und Timer unterstützt. + Blaen VDR; cynnal ffrydio Teledu Byw, Recordio, Amserlenni, Amseryddion dros ategyn VNSI + VDR frontend; understøtter streaming af TV og Optagelser, EPG og Timere over VNSI-addon + VDR-Oberfläche: Erlaubt die Wiedergabe von Live TV und Aufnahmen sowie die Anzeige des EPG, die Kanalsuche und die Programmierung von Timer über das VNSI Plugin. Frontend για το VDR. Υποστηρίζει ροές Live TV & Εγγραφές, Χρονοδιακόπτες διαμέσου του plugin VNSI VDR frontend; supporting streaming of Live TV & Recordings, EPG, Timers over the VNSI plugin + VDR frontend; supporting streaming of Live TV & Recordings, EPG, Timers over the VNSI plugin Front-end VDR, soporte de streaming de televisión en vivo y grabaciones, EPG, temporizador con el plugin VNSI Front-end VDR, soporte de streaming de televisión en vivo y grabaciones, EPG, temporizador con el plugin VNSI VDR-frontend; tukee livelähetyksiä sekä tallenteita, ohjelmaopasta, ajastuksia ja VNSI-lisäosia Applicatif d'Enregistreur de Disque Vidéo. Il Supporte la lecture en continu de flux direct télévision et l'enregistrement, les guides de programmes, les minuteries via les routines d'enregistrement de flux réseau vidéo + Frontal VDR, prenant en charge la lecture en transit des télés en direct & les enregistrements, le GÉP et les minuteries avec le plugiciel VNSI. + Interface VDR; soporta a transmisión de TV ao vivo e gravacións, Guía de programación e temporizadores mediante o engadido de VNSI ממשק קדמי של VDR;תומך בזרימת שידורי טלוויזיה חיה והקלטה,רשימות שידורים ומתזמני הקלטות דרך תוסף VNSI + VDR pozadinski softver; podržava streamanje televizije, snimanje, EPG, zakazania snimanja preko VNSI dodatka VDR előtér-kiszolgáló. Élő adások és felvételek sugárzásának támogatása EPG-vel és időzítéssel a VNSI kiegészítőn keresztül + Frontend VDR; Mendukung pengaliran Siaran TV langsung dan Rekaman, EPG, Timer melalui plugin VNSI Frontend VDR; supporta lo streaming di Live TV e le registrazioni, EPG e timer sul plugin VNSI + VU+ フロントエンド:ライブテレビのストリーミングや録画、EPG、タイマーをサポートしています。 VDR 프론트엔드; TV 시청 & 녹화, EPG, VNSI 플러그인을 통한 타이머 지원 VDR sąsaja, remti transliacijos Live TV & įrašai, EPG, Laikmačiai ir VNSI įskiepiai + VDR galasistēma; atbalsta tiešraides TV un ierakstu straumēšanu, EPG, taimerus no VNSI spraudņa VDR интерфејс; подржува стриминг на Live TV и снимки, EPG тајмери преку VNSI додаток - VDR frontend, het ondersteunen streaming van Live TV & Recordings, EPG, Timers over de VNSI plugin - Interfejs VDR; wspiera strumieniowanie TV na żywo i nagrywanie, EPG, wyłączniki czasowe przez plugin VNSI + Bahagian hadapan VDR; menyokong penstirman TV Langsung & Rakaman, EPG, Pemasa menerusi pemalam VNSI + VDR frontend: ondersteunt streaming van Live TV & Recordings, EPG, Timers over de VNSI plugin + VDR frontend; støtte for visning av direkte TV og opptak, EPG og tidtakere over VNSI-tillegget + Interfejs VDR; wspiera strumieniowanie TV na żywo i nagrywanie, przewodnik TV - EPG oraz harmonogramy przez plugin VNSI Frontend VDR; suporta transmissão de Live TV e Gravações, EPG e Temporizadores através do plugin VNSI Frontend VDR; suporta streaming de TV ao vivo e gravações, EPG, agendamentos sobre o plugin VNSI Frontend VDRş suportă streaming de TV Live & Înregistrări, EPG, Cronometre folosind pluginul VNSI VDR фронтэнд; поддерживает потоковое TV, запись, ЕПГ, таймеры через VNSI плагин VDR rozhranie; je podporované streamovanie živého televízneho vysielania a nahrávok, EPG, časovačov prostredníctvom modulu VNSI Vmesnik za VDR; podpira pretakanje televizije v živo & posnetkov, EPG, časovnike preko vtičnika VNSI + VDR frontend, që lejon transmetimin e Live TV'së & Regjistrime, EPG, Timer, nëpërmes shtesës VNSI VDR frontend; stödjer strömning av direktsänd TV & inspelningar, EPG, timers över VNSI-tillägget - VDR前端,通过VNSI插件支持直播电视播放和录制、电子节目单、定时器 + VDR முன்நிலை: VNSI இடைமுகம் மேல் லைவ் டிவி & பதிவுகளின் ஸ்ட்ரீமிங், EPG கேட்கவும் துணைபுரிகிறது. + Надстройка над VDR; підтримує потік TV і записів, EPG, таймерів через додаток VNSI + Giao tiếp cho VDR; hỗ trợ truyền phát và thu chương trình Live TV, hẹn giờ và hiển thị lịch trình chiếu (EPG) thông qua plugin VNSI + VDR 前端,通过 VNSI 插件支持直播电视和录像流媒体、电子节目单、定时器 + VDR前端,在VNSI外掛插件上支援的串流媒體包括有:電視直播和錄影,電子節目表,定時器。 Hierdie is onstabiele sagteware! Die outeurs is op geen manier verantwoordelik vir gefaalde opnames, inkorrekte tydhouers, gemorsde ure, of enige ander ongewensde effekte. This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. + Тази програма е нестабилна! Авторите не носят отговорност за неуспешно записване, некоректни броячи, пропиляно време и други нежелани ефекти. + Això és programari inestable! Els autors no són de cap manera responsables dels enregistraments que han fallat, temporitzadors incorrectes, hores perdudes, o qualsevols altres efectes indesitjables.. Tento software není stabilní. Autoři nejsou žádným způsobem zodpovědní za selhání při nahrávání, neplatné časovače, ztracený čas, či jakékoliv jiné nežádoucí události... + Mae hwn yn feddalwedd ansad! Nid yw'r awduron yn gyfrifol mewn unrhyw ffordd am fethu recordio, amseru gwallus, oriau wedi eu gwastraffu nac effeithiau anymunol eraill. Dette er ustabil software! Ophavsmændene er på ingen måde ansvarlige for mislykkede optagelser, ukorrekte timere, spildte timer, eller andre uønskede konsekvenser.. Diese Software ist noch in der Entwicklung! Die Autoren sind nicht für fehlgeschlagene Aufnahmen, falsche Timer, verschwendete Zeit oder andere ungewollte Effekte verantwortlich. Ασταθές πρόγραμμα! Οι δημιουργοί δεν είναι σε καμία περίπτωση υπεύθυνοι για αποτυχημένες εγγραφές, λανθασμένους χρονοδιακόπτες, χαμένες ώρες, ή κάθε είδους ανεπιθύμητα αποτελέσματα.. This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. + This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. ¡Este software es aún inestable! Los autores no son responsables en forma alguna por grabaciones fallidas, temporizaciones incorrectas, tiempo perdido o ningún otro efecto no deseado. ¡Este software es inestable! Los autores no se responsabilizan por grabaciones fallidas, temporizadores incorrectos, horas perdidas, o cualquier otro efecto no deseado.. + ¡Esto es software inestable! Los autores no son de ninguna manera responsables por grabaciones fallidas, temporizadores incorrectos, horas perdidas o cualquier otro efecto no deseado... + See on ebastabiilne tarkvara! Autorid ei ole kuidagi moodi vastutavad nurjunud salvestiste, ebaõige aegrelee, raisatud tundide ega muude soovimatute asjade eest. Tämä on epävakaa ohjelmisto! Ohjelmiston tekijät eivät ole millään muotoa vastuussa epäonnistuneista tallennuksista, virheellisistä ajastuksista, haaskatusta ajasta, verenpaineen noususta eikä mistään muusta epäsuotuisasta vaikutuksesta. Applicatif en cours de réalisation ! Les auteurs ne sont en aucun cas responsables d'enregistrements défaillants, de minuteries erronées, de temps perdu ou tout autre effet indésirable.. + Ce logiciel est instable! Les auteurs ne sont aucunement responsables des enregistrements défaillants, des minuteries erronées, des heures perdues ou tout autre effet indésirable. Este é software non estable, os autores non se fan responsábeis dos erros na gravacións, temporizadores incorrectos, e outros efectos non desexados. זו היא תוכנה בלתי יציבה בעליל! המחברים אינם אחראים בשום דרך להקלטות כושלות או תיזמוני הקלטות לא מדויקים , אובדן של של שעות או כל אפקט בלתי רצוי אחר.... + Ovo je nestabilan softver! Autori nisu na koji način odgovorani za neuspjele snimke, netočna vremena, izgubjene sate, ili bilo koje druge neželjene učinke... Ez nem stabil szoftver! A készítők nem vállalnak felelősséget, a hibás felvételért, rossz időzítésért, elvesztegetett időért... + Ini merupakan software yang tidak stabil! Penulis tidak bertanggung jawab untuk rekaman gagal, timer salah, waktu terbuang, atau efek tak diinginkan lainnya... + Þetta er óstöðugur hugbúnaður! Höfundarnir eru á engann hátt ábyrgir fyrir misheppnuðum upptökum, röngum upptökutímum, klukkustundum sem að fóru í súginn eða nokkrum öðrum óæskilegum áhrifum. Questo programma non è stabile! Gli autori non sono in alcun modo responsabili per registrazioni fallite, timer non corretti, ore perse, o altri effetti indesiderati.. これは不安定なソフトウェアです!本プログラムの作者は、録画の失敗、正確に作動しなかったタイマー、無駄にした時間、その他あらゆる好ましくない結果について責任を負わないものとします。 + ეს არის არასტაბილური პროგრამული უზრუნველყოფა! ავტორები არ არიან პასუხისმგებელი შეცდომებზე, არასწორ EPG-ზე, დაკარგულ დროზე ან სხვა ხარვეზებზე 이 소프트웨어는 불안정합니다! 제작자는 녹화 실패, 부정확한 타이머, 시간 낭비 및 기타 예상하지 못한 결과에 대해 책임지지 않습니다.. Tai yra nestabili programinė įranga! Autorius jokiu būdu neatsakingas už nepavykusius įrašus, neteisingus laikmačius, iššvaistytas valandas, ar nutikus kitiems nepageidaujamiems poveikiams ...[COLOR=red](xbmc.lt siūlo/rekomenduoja testuojant šį priedą persijungti į Anglų [orinali] kalbą)[/COLOR] + Šī ir nestabila programmatūra! Autori nav nekādā vaidā atbildīgi par nesanākušiem ierakstiem, nepareiziem taimeriem, iztērētām stundām vai jebkādiem citiem nevēlamiem efektiem.. Ова е нестабилен софтвер! Ауторите не се во никој случај одговорни за неуспешни снимања, грешни тајмери, други непосакувани ефекти... - Dit is onstabiel software! De auteurs zijn op geen enkele wijze verantwoordelijk voor de mislukte opnames, onjuiste timers, verspilde uren, of een andere ongewenste effecten .. - To oprogramowanie jest niestabilne! Autorzy w żaden sposób nie odpowiadają za nieudane nagrania, źle działające wyłączniki czasowe, stracone godziny czy też jakiekolwiek inne niepożądane efekty. + Ini merupakan perisian tidak stabil! Pengarang tidak bertanggungjawab atas kegagalan rakaman, pemasa tidak betul, masa yang dibazirkan, atau apa jua kesan yang tidak dikehendaki.. + Dit is onstabiele software! De auteurs zijn op geen enkele wijze verantwoordelijk voor mislukte opnames, onjuiste timers, verspilde uren, of andere ongewenste effecten .. + Dette er ustabilt programvare! Forfatterne er ikke ansvarlig på noen måte for ødelagte opptak, feile timere, bortkastede timer, eller andre uønskede hendinger... + To oprogramowanie jest niestabilne! Autorzy w żaden sposób nie są odpowiedzialni za nieudane nagrania, nieprawidłowe czasy EPG, czy też jakiekolwiek inne niepożądane efekty oraz za Twój zmarnowany czas. Este software é instável! Os autores não são responsáveis por falhas na gravação, temporizadores incorrectos, horas perdidas ou outro qualquer efeito não desejado... Este é um software instável! Os autores não são responsáveis por gravações com falhas, agendamentos incorretos, tempo desperdiçado, ou quaisquer outros efeitos indesejáveis... Acesta nu este o aplicație definitivă! Autorii nu sunt în nici un fel responsabili pentru înregistrări eșuate, cronometre incorecte, ore pierdute, sau orice alte efecte nedorite... Это тестовая программа! Авторы не несут никакой ответственности за испорченные записи, неверные таймеры, потраченное время и прочие нежелательные эффекты.. Tento softvér nie je stabilný! Autori nenesú žiadnu zodpovednosť za chybné nahrávky vysielania, nesprávne časovače alebo iné neželané udalosti spôsobené týmto softvérom.. To je nestabilna programska oprema! Avtorji niso odgovorni za neuspela snemanja, nepravilne časovnike, zapravljen čas in katerikoli drug neželen učinek... + Ky program nuk është ende stabil! Autorët e këtij programi nuk janë në as një menyr përgjegjës për rregistrime të gabuara, timer të pasaktë, kohë të humbur ose efekte të tilla të padëshirueshme. + Овај софтвер је нестабилан! Аутори ни на који начин нису одговорни за неуспела снимања, неисправна заказана снимања, изгубљене сате или друге нежељене ефекте. Detta är ostabil mjukvara! Upphovsmännen är inte ansvariga för misslyckade inspelningar, inkorrekta timers, bortslösade timmar, eller någon annan oönskad effekt.. - 这是不稳定版的软件!作者不对录制失败、错误定时造成时间浪费或其它不良影响负责。 + இந்த நிலையற்ற மென்பொருள்! தோல்வியடைந்தது பதிவுகள், தவறான டைமர்கள், வீணாகி மணி, அல்லது வேறு எந்த விரும்பத்தகாத விளைவுகலுக்கு இதன் ஆசிரியர்கள் பொறுப்பு இல்லை. + Ин нармафзори ноустувор аст! Муаллифон барои вайрониҳои сабт, вақтсанҷҳои нодуруст, соатҳои бефоида ва дигар таъсирҳои номатлуб ҷавобгар намебошанд. + Bu stabil olmayan program! Yapımcılar hatalı kayıtlardan, bozuk sürelerden, harcanan vakitten veya herhangi bir olumsuz etkiden dolayı sorumlu tutulamaz. + Це нестабільна програма! Автори не несуть відповідальності за попсуті записи, неправильні таймери, втрачений час та інші небажані ефекти. + Đây là phần mềm không ổn định! Các tác giả không chịu trách nhiệm đối với các lỗi thu chương trình, hẹn giờ không chính xác, giờ lãng phí, hoặc bất kỳ tác dụng không mong muốn khác.. + 这是不稳定版的软件!作者不对录像失败、错误定时造成时间浪费或其它不良影响负责。 + 這是測試版軟體!其原創作者並無法對於以下情況負責,包含:錄影失敗,不正確的定時設定,多餘時數,或任何產生的其它不良影響... @OS@ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Afrikaans/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Afrikaans/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Afrikaans/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Afrikaans/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Afrikaans (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/af/)\n" +"Language-Team: Afrikaans (http://www.transifex.com/projects/p/xbmc-main/language/af/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -204,3 +203,11 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Skep kanaal groepe outomaties op die bediener" + +msgctxt "#30101" +msgid "Setup" +msgstr "Konfigurasie" + +msgctxt "#30108" +msgid "Channels" +msgstr "Kanale" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Albanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Albanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Albanian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Albanian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,209 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Albanian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sq/)\n" +"Language-Team: Albanian (http://www.transifex.com/projects/p/xbmc-main/language/sq/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sq\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "VDR Hostname or IP" +msgstr "VDR Hostname ose IP" + +msgctxt "#30001" +msgid "VNSI Port" +msgstr "Porti VNSI" + +msgctxt "#30002" +msgid "Priority" +msgstr "Prioriteti" + +msgctxt "#30003" +msgid "Character Set Conversion" +msgstr "Shndërrimi i Character Set" + +msgctxt "#30004" +msgid "Connect timeout (s)" +msgstr "Timeout i lidhjes (s)" + +msgctxt "#30005" +msgid "Allow VDR Messages" +msgstr "Lejo Mesazhet Nga VDR" + +msgctxt "#30006" +msgid "Read recordings from directory" +msgstr "Lexo regjistrimiet nga regjistri" + +msgctxt "#30007" +msgid "VDR recordings directory" +msgstr "Regjistri i regjistrimeve së VDR" + +msgctxt "#30008" +msgid "Channel search" +msgstr "Kërkimi i kanaleve" + +msgctxt "#30009" +msgid "Channel search - Settings" +msgstr "Kërkimi i kanaleve - Cilësimet" + +msgctxt "#30010" +msgid "Start Channel search" +msgstr "Fillo kërkimin e kanaleve" + +msgctxt "#30011" +msgid "Source Type" +msgstr "Tipi i Burimit" + +msgctxt "#30012" +msgid "TV channels" +msgstr "TV Kanalet" + +msgctxt "#30013" +msgid "Radio channels" +msgstr "Radio Kanalet" + +msgctxt "#30014" +msgid "FTA channels" +msgstr "Kanale të lira" + +msgctxt "#30015" +msgid "Scrambled channels" +msgstr "Kanale të mbyllur" + +msgctxt "#30016" +msgid "HD channels" +msgstr "Kanalet HD" + +msgctxt "#30017" +msgid "Country" +msgstr "Vendi" + +msgctxt "#30018" +msgid "Cable Inversion" +msgstr "Cable Inversion" + +msgctxt "#30019" +msgid "Cable Symbolrate" +msgstr "Cable Symbolrate" + +msgctxt "#30020" +msgid "Cable modulation" +msgstr "Cable modulation" + +msgctxt "#30021" +msgid "Terr Inversion" +msgstr "Terr Inversion" + +msgctxt "#30022" +msgid "Satellite" +msgstr "Sateliti" + +msgctxt "#30023" +msgid "ATSC Type" +msgstr "Tipi ATSC" + msgctxt "#30024" msgid "Back" msgstr "Mbrapa" + +msgctxt "#30025" +msgid "Channel search - running... %i %%" +msgstr "Kërkimi kanaleve - duke kërkuar... %i %%" + +msgctxt "#30026" +msgid "Type:" +msgstr "Tipi: " + +msgctxt "#30027" +msgid "Device:" +msgstr "Aparati:" + +msgctxt "#30028" +msgid "Scan: %i" +msgstr "Kërkimi: %i" + +msgctxt "#30029" +msgid "Signal: %i %%" +msgstr "Sinjali: %i %%" + +msgctxt "#30030" +msgid "New channels: %i" +msgstr "Kanale të reja: %i" + +msgctxt "#30031" +msgid "All channels: %i" +msgstr "Gjithë kanalet: %i" + +msgctxt "#30032" +msgid "Analog TV" +msgstr "TV analog" + +msgctxt "#30033" +msgid "Analog Radio" +msgstr "Radio analog" + +msgctxt "#30034" +msgid "Transponder:" +msgstr "Transponderi:" + +msgctxt "#30035" +msgid "New channels" +msgstr "Kanale të reja" + +msgctxt "#30036" +msgid "Channel search - Finished" +msgstr "Kërkimi i kanaleve - Përfundoj" + +msgctxt "#30037" +msgid "No device available - exiting" +msgstr "Asnjë aparat në dispozicion - duke përfunduar" + +msgctxt "#30038" +msgid "No DVB-S2 device available - trying fallback to DVB-S" +msgstr "Asnjë aparat DVB-S2 në dispozicion - duke provuar ndërrimin në DVB-S" + +msgctxt "#30039" +msgid "Running" +msgstr "Duke punuar" + +msgctxt "#30040" +msgid "Stopped" +msgstr "Ndaloi" + +msgctxt "#30041" +msgid "Finished" +msgstr "Përfundoi" + +msgctxt "#30042" +msgid "Channel search - Canceled" +msgstr "Kërkimi kanaleve - U anulua" + +msgctxt "#30043" +msgid "Channel search - Error" +msgstr "Kërkimi kanaleve - Gabim" + +msgctxt "#30044" +msgid "Lost connection to VDR Server" +msgstr "U humb lidhja me Serverin VDR" + +msgctxt "#30045" +msgid "Connection to VDR Server restored" +msgstr "U rilidh lidhja me Serverin VDR" + +msgctxt "#30046" +msgid "Create channel groups automatically on the server" +msgstr "Krijo grupe kanalesh automatikisht në server" + +msgctxt "#30108" +msgid "Channels" +msgstr "Kanalet" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Amharic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Amharic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Amharic/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Amharic/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,25 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Amharic (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/am/)\n" +"Language-Team: Amharic (http://www.transifex.com/projects/p/xbmc-main/language/am/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: am\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +msgctxt "#30002" +msgid "Priority" +msgstr "ቅድሚያ" + msgctxt "#30008" msgid "Channel search" msgstr "ጣቢያ መፈለጊያ" @@ -45,6 +48,10 @@ msgid "Country" msgstr "አገር" +msgctxt "#30024" +msgid "Back" +msgstr "ወደ ኋላ" + msgctxt "#30025" msgid "Channel search - running... %i %%" msgstr "ጣቢያ መፈለጊያ - በማስኬድ ላይ... %i %%" @@ -88,3 +95,11 @@ msgctxt "#30041" msgid "Finished" msgstr "ጨርሷል " + +msgctxt "#30101" +msgid "Setup" +msgstr "ማዋቀሪያ " + +msgctxt "#30108" +msgid "Channels" +msgstr "ጣቢያዎች" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Arabic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Arabic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Arabic/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Arabic/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Arabic (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ar/)\n" +"Language-Team: Arabic (http://www.transifex.com/projects/p/xbmc-main/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -40,3 +39,11 @@ msgctxt "#30039" msgid "Running" msgstr "%i جزء" + +msgctxt "#30101" +msgid "Setup" +msgstr "إعدادات" + +msgctxt "#30108" +msgid "Channels" +msgstr "محطات" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Azerbaijani/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Azerbaijani/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Azerbaijani/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Azerbaijani/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Azerbaijani (http://www.transifex.com/projects/p/xbmc-main/language/az/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: az\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30017" +msgid "Country" +msgstr "Ölkə" + +msgctxt "#30026" +msgid "Type:" +msgstr "Növ:" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Basque/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Basque/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Basque/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Basque/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Basque (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/eu/)\n" +"Language-Team: Basque (http://www.transifex.com/projects/p/xbmc-main/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -36,3 +35,11 @@ msgctxt "#30039" msgid "Running" msgstr "Exekutatzen" + +msgctxt "#30101" +msgid "Setup" +msgstr "Konfigurazioa" + +msgctxt "#30108" +msgid "Channels" +msgstr "Kateak" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Belarusian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Belarusian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Belarusian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Belarusian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Belarusian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/be/)\n" +"Language-Team: Belarusian (http://www.transifex.com/projects/p/xbmc-main/language/be/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -204,3 +203,11 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Create channel groups automatically on the server" + +msgctxt "#30101" +msgid "Setup" +msgstr "Setup" + +msgctxt "#30108" +msgid "Channels" +msgstr "Channels" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Bosnian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Bosnian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Bosnian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Bosnian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,29 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Bosnian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/bs/)\n" +"Language-Team: Bosnian (http://www.transifex.com/projects/p/xbmc-main/language/bs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bs\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +msgctxt "#30012" +msgid "TV channels" +msgstr "TV Kanali" + +msgctxt "#30013" +msgid "Radio channels" +msgstr "Radio Kanali" + msgctxt "#30017" msgid "Country" msgstr "Država" @@ -28,3 +35,11 @@ msgctxt "#30039" msgid "Running" msgstr "Pokretanje" + +msgctxt "#30101" +msgid "Setup" +msgstr "Konfiguracija" + +msgctxt "#30108" +msgid "Channels" +msgstr "Kanali" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Bulgarian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Bulgarian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Bulgarian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Bulgarian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,69 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Bulgarian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/bg/)\n" +"Language-Team: Bulgarian (http://www.transifex.com/projects/p/xbmc-main/language/bg/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bg\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "VDR Hostname or IP" +msgstr "VDR хост или IP адрес" + +msgctxt "#30001" +msgid "VNSI Port" +msgstr "VNSI порт" + +msgctxt "#30002" +msgid "Priority" +msgstr "Приоритет" + +msgctxt "#30003" +msgid "Character Set Conversion" +msgstr "Конвертиране на кодировката" + +msgctxt "#30004" +msgid "Connect timeout (s)" +msgstr "Таймаут при свързване (с)" + +msgctxt "#30005" +msgid "Allow VDR Messages" +msgstr "Включи VDR съобщенията" + +msgctxt "#30006" +msgid "Read recordings from directory" +msgstr "Чети записите от папката" + +msgctxt "#30007" +msgid "VDR recordings directory" +msgstr "Папка за VDR записи" + +msgctxt "#30008" +msgid "Channel search" +msgstr "Търсене на канал" + +msgctxt "#30009" +msgid "Channel search - Settings" +msgstr "Търсене на канал - Настройки" + +msgctxt "#30010" +msgid "Start Channel search" +msgstr "Започни търсене на канала" + +msgctxt "#30011" +msgid "Source Type" +msgstr "Вид на източника" + msgctxt "#30012" msgid "TV channels" msgstr "ТВ канали" @@ -25,18 +72,198 @@ msgid "Radio channels" msgstr "Радио канали" +msgctxt "#30014" +msgid "FTA channels" +msgstr "Отворени канали" + +msgctxt "#30015" +msgid "Scrambled channels" +msgstr "Кодирани канали" + +msgctxt "#30016" +msgid "HD channels" +msgstr "HD канали" + msgctxt "#30017" msgid "Country" -msgstr "Държава" +msgstr "Страна" + +msgctxt "#30018" +msgid "Cable Inversion" +msgstr "Кабелна инверсия" + +msgctxt "#30019" +msgid "Cable Symbolrate" +msgstr "Символна кабелна скорост" + +msgctxt "#30020" +msgid "Cable modulation" +msgstr "Кабелна модулация" + +msgctxt "#30021" +msgid "Terr Inversion" +msgstr "Наземна инверсия" + +msgctxt "#30022" +msgid "Satellite" +msgstr "Сателитна" + +msgctxt "#30023" +msgid "ATSC Type" +msgstr "ATSC вид" msgctxt "#30024" msgid "Back" msgstr "Назад" +msgctxt "#30025" +msgid "Channel search - running... %i %%" +msgstr "Търсене на канала... %i %%" + msgctxt "#30026" msgid "Type:" -msgstr "Тип:" +msgstr "Вид:" + +msgctxt "#30027" +msgid "Device:" +msgstr "Устройство:" + +msgctxt "#30028" +msgid "Scan: %i" +msgstr "Сканирано: %i" + +msgctxt "#30029" +msgid "Signal: %i %%" +msgstr "Сигнал: %i %%" + +msgctxt "#30030" +msgid "New channels: %i" +msgstr "Нови канали: %i" + +msgctxt "#30031" +msgid "All channels: %i" +msgstr "Всички канали: %i" + +msgctxt "#30032" +msgid "Analog TV" +msgstr "Аналогова телевизия" + +msgctxt "#30033" +msgid "Analog Radio" +msgstr "Аналогово радио" + +msgctxt "#30034" +msgid "Transponder:" +msgstr "Транспондер:" + +msgctxt "#30035" +msgid "New channels" +msgstr "Нови канали" + +msgctxt "#30036" +msgid "Channel search - Finished" +msgstr "Приключи търсенето на канали" + +msgctxt "#30037" +msgid "No device available - exiting" +msgstr "Няма достъпно устройство - изход" + +msgctxt "#30038" +msgid "No DVB-S2 device available - trying fallback to DVB-S" +msgstr "Няма достъпно DVB-S2 устройство - ще се опитам да се върна към DVB-S" msgctxt "#30039" msgid "Running" -msgstr "Изпълнява се" +msgstr "Работи" + +msgctxt "#30040" +msgid "Stopped" +msgstr "Спряно" + +msgctxt "#30041" +msgid "Finished" +msgstr "Завършено" + +msgctxt "#30042" +msgid "Channel search - Canceled" +msgstr "Търсенето на канали прекъсна" + +msgctxt "#30043" +msgid "Channel search - Error" +msgstr "Грешка при търсенето на канали" + +msgctxt "#30044" +msgid "Lost connection to VDR Server" +msgstr "Изгубена връзка с VDR сървъра" + +msgctxt "#30045" +msgid "Connection to VDR Server restored" +msgstr "Връзката с VDR сървъра е възстановена" + +msgctxt "#30046" +msgid "Create channel groups automatically on the server" +msgstr "Създай автоматично канални групи на сървъра" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Изисквай таймшиф" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR екранно меню" + +msgctxt "#30101" +msgid "Setup" +msgstr "Настройване" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Контролиране на екранното меню - натиснете инфо, за да излезете" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Изберете, за да контролирате екранното меню" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Таймшифт режим" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Таймшифт буфер (RAM) x100 МБ" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Таймшифт буфер (Файл) x1 ГБ" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "VDR админ" + +msgctxt "#30108" +msgid "Channels" +msgstr "Канали" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "Бял списък с доставчици" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "Черен списък с канали" + +msgctxt "#30111" +msgid "Channel filters" +msgstr "Филтри на каналите" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Радио канали" + +msgctxt "#30113" +msgid "Save filters" +msgstr "Съхрани филтрите" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "Неизвестен доставчик" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Burmese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Burmese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Burmese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Burmese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,45 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Burmese (http://www.transifex.com/projects/p/xbmc-main/language/my/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30004" +msgid "Connect timeout (s)" +msgstr "ချိတ်ဆက်မှု့အချိန်ပြည့်သွားပါပြီ။" + +msgctxt "#30012" +msgid "TV channels" +msgstr "TV ချယ်နယ်" + +msgctxt "#30013" +msgid "Radio channels" +msgstr "ရေဒီယိုချယ်နယ်" + +msgctxt "#30017" +msgid "Country" +msgstr "နိုင်ငံ" + +msgctxt "#30026" +msgid "Type:" +msgstr "အမျိုးအစား -" + +msgctxt "#30039" +msgid "Running" +msgstr "ဖွင့်နေပါသည်" + +msgctxt "#30108" +msgid "Channels" +msgstr "Channel များ" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Catalan/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Catalan/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Catalan/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Catalan/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,69 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Catalan (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ca/)\n" +"Language-Team: Catalan (http://www.transifex.com/projects/p/xbmc-main/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "VDR Hostname or IP" +msgstr "Nom de màquina o IP del VDR" + +msgctxt "#30001" +msgid "VNSI Port" +msgstr "Port VNSI" + +msgctxt "#30002" +msgid "Priority" +msgstr "Prioritat" + +msgctxt "#30003" +msgid "Character Set Conversion" +msgstr "Conversió del joc de caràcters" + +msgctxt "#30004" +msgid "Connect timeout (s)" +msgstr "Temps d'espera de connexió (s)" + +msgctxt "#30005" +msgid "Allow VDR Messages" +msgstr "Permet missatges VDR" + +msgctxt "#30006" +msgid "Read recordings from directory" +msgstr "Llegeix els enregistraments des del direcotri" + +msgctxt "#30007" +msgid "VDR recordings directory" +msgstr "Directori d'enregistraments VDR" + +msgctxt "#30008" +msgid "Channel search" +msgstr "Cerca del canal" + +msgctxt "#30009" +msgid "Channel search - Settings" +msgstr "Cerca de canals - Configuració" + +msgctxt "#30010" +msgid "Start Channel search" +msgstr "Inicia la cerca del canal" + +msgctxt "#30011" +msgid "Source Type" +msgstr "Tipus de font" + msgctxt "#30012" msgid "TV channels" msgstr "Canals de TV" @@ -25,18 +72,142 @@ msgid "Radio channels" msgstr "Canals de ràdio" +msgctxt "#30014" +msgid "FTA channels" +msgstr "Canals FTA" + +msgctxt "#30015" +msgid "Scrambled channels" +msgstr "Canals codificats" + +msgctxt "#30016" +msgid "HD channels" +msgstr "Canals HD" + msgctxt "#30017" msgid "Country" msgstr "País" +msgctxt "#30018" +msgid "Cable Inversion" +msgstr "Inversió del cable" + +msgctxt "#30019" +msgid "Cable Symbolrate" +msgstr "Cable Symbolrate" + +msgctxt "#30020" +msgid "Cable modulation" +msgstr "Modulació del cable" + +msgctxt "#30021" +msgid "Terr Inversion" +msgstr "Inversió Terr" + +msgctxt "#30022" +msgid "Satellite" +msgstr "Satèl·lit" + +msgctxt "#30023" +msgid "ATSC Type" +msgstr "Tipus ATSC" + msgctxt "#30024" msgid "Back" msgstr "Enrere" +msgctxt "#30025" +msgid "Channel search - running... %i %%" +msgstr "Cerca de canals - executant... %i %%" + msgctxt "#30026" msgid "Type:" msgstr "Tipus:" +msgctxt "#30027" +msgid "Device:" +msgstr "Dispositiu:" + +msgctxt "#30028" +msgid "Scan: %i" +msgstr "Escaneig: %i" + +msgctxt "#30029" +msgid "Signal: %i %%" +msgstr "Senyal: %i %%" + +msgctxt "#30030" +msgid "New channels: %i" +msgstr "Canals nous: %i" + +msgctxt "#30031" +msgid "All channels: %i" +msgstr "Tots els canals: %i" + +msgctxt "#30032" +msgid "Analog TV" +msgstr "TV analògica" + +msgctxt "#30033" +msgid "Analog Radio" +msgstr "Ràdio analògica" + +msgctxt "#30034" +msgid "Transponder:" +msgstr "Transponedor:" + +msgctxt "#30035" +msgid "New channels" +msgstr "Canals nous" + +msgctxt "#30036" +msgid "Channel search - Finished" +msgstr "Cerca del canal - Finalitzada" + +msgctxt "#30037" +msgid "No device available - exiting" +msgstr "No hi ha cap dispositiu disponible - sortint" + +msgctxt "#30038" +msgid "No DVB-S2 device available - trying fallback to DVB-S" +msgstr "Dispositiu DVB-S2 no disponible - intentant tornar a DVB-S" + msgctxt "#30039" msgid "Running" msgstr "S'està executant" + +msgctxt "#30040" +msgid "Stopped" +msgstr "Aturat" + +msgctxt "#30041" +msgid "Finished" +msgstr "Finalitzat" + +msgctxt "#30042" +msgid "Channel search - Canceled" +msgstr "Cerca del canal - Cancel·lat" + +msgctxt "#30043" +msgid "Channel search - Error" +msgstr "Cerca de canals - Error" + +msgctxt "#30044" +msgid "Lost connection to VDR Server" +msgstr "S'ha perdut la connexió amb el servidor VDR" + +msgctxt "#30045" +msgid "Connection to VDR Server restored" +msgstr "S'ha restaurat la connexió amb el servidor VDR" + +msgctxt "#30046" +msgid "Create channel groups automatically on the server" +msgstr "Crea grups de canals de forma automàtica al servidor" + +msgctxt "#30101" +msgid "Setup" +msgstr "Configuració" + +msgctxt "#30108" +msgid "Channels" +msgstr "Canals" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Chinese (Simple)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Chinese (Simple)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Chinese (Simple)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Chinese (Simple)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Chinese (Simple) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/zh/)\n" +"Language-Team: Chinese (Simple) (http://www.transifex.com/projects/p/xbmc-main/language/zh/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,11 +18,11 @@ msgctxt "#30000" msgid "VDR Hostname or IP" -msgstr "VDR主机名或IP地址" +msgstr "VDR 主机名或 IP 地址" msgctxt "#30001" msgid "VNSI Port" -msgstr "VNSI端口" +msgstr "VNSI 端口" msgctxt "#30002" msgid "Priority" @@ -39,15 +38,15 @@ msgctxt "#30005" msgid "Allow VDR Messages" -msgstr "允许VDR信息" +msgstr "允许 VDR 信息" msgctxt "#30006" msgid "Read recordings from directory" -msgstr "从目录读取录制" +msgstr "读取录像于目录" msgctxt "#30007" msgid "VDR recordings directory" -msgstr "VDR录制目录" +msgstr "VDR 录像目录" msgctxt "#30008" msgid "Channel search" @@ -75,7 +74,7 @@ msgctxt "#30014" msgid "FTA channels" -msgstr "FTA频道" +msgstr "免费频道" msgctxt "#30015" msgid "Scrambled channels" @@ -103,7 +102,7 @@ msgctxt "#30021" msgid "Terr Inversion" -msgstr "Terr反转" +msgstr "Terr 反转" msgctxt "#30022" msgid "Satellite" @@ -111,7 +110,7 @@ msgctxt "#30023" msgid "ATSC Type" -msgstr "ATSC类型" +msgstr "ATSC 类型" msgctxt "#30024" msgid "Back" @@ -171,7 +170,7 @@ msgctxt "#30038" msgid "No DVB-S2 device available - trying fallback to DVB-S" -msgstr "无可用DVB-S2设备 - 尝试DVB-S" +msgstr "无可用 DVB-S2 设备 - 尝试 DVB-S" msgctxt "#30039" msgid "Running" @@ -195,12 +194,76 @@ msgctxt "#30044" msgid "Lost connection to VDR Server" -msgstr "失去与VDR服务器的连接" +msgstr "失去与 VDR 服务器的连接" msgctxt "#30045" msgid "Connection to VDR Server restored" -msgstr "与VDR服务器的连接已恢复" +msgstr "与 VDR 服务器的连接已恢复" msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "自动在服务器上创建频道组" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "请求时光平移" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD" + +msgctxt "#30101" +msgid "Setup" +msgstr "设置" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "控制 OSD - 按 info 退出" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "选择控制 OSD" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "时光平移模式" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "时光平移缓存(RAM)x100MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "时光平移缓存(文件)x1GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "VDR 管理" + +msgctxt "#30108" +msgid "Channels" +msgstr "频道" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "来源白名单" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "频道黑名单" + +msgctxt "#30111" +msgid "Channel filters" +msgstr "频道筛选" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "电台频道" + +msgctxt "#30113" +msgid "Save filters" +msgstr "保存筛选" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "未知来源" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Chinese (Traditional)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Chinese (Traditional)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Chinese (Traditional)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Chinese (Traditional)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,69 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Chinese (Traditional) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/zh_TW/)\n" +"Language-Team: Chinese (Traditional) (http://www.transifex.com/projects/p/xbmc-main/language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0;\n" +msgctxt "#30000" +msgid "VDR Hostname or IP" +msgstr "VDR的主機名稱或IP" + +msgctxt "#30001" +msgid "VNSI Port" +msgstr "VNSI端口" + +msgctxt "#30002" +msgid "Priority" +msgstr "優先順序" + +msgctxt "#30003" +msgid "Character Set Conversion" +msgstr "字元集轉換" + +msgctxt "#30004" +msgid "Connect timeout (s)" +msgstr "連接超時(秒)" + +msgctxt "#30005" +msgid "Allow VDR Messages" +msgstr "允許VDR訊息" + +msgctxt "#30006" +msgid "Read recordings from directory" +msgstr "從目錄中讀取錄影檔案" + +msgctxt "#30007" +msgid "VDR recordings directory" +msgstr "VDR錄影目錄" + +msgctxt "#30008" +msgid "Channel search" +msgstr "頻道搜尋" + +msgctxt "#30009" +msgid "Channel search - Settings" +msgstr "頻道搜尋-設定" + +msgctxt "#30010" +msgid "Start Channel search" +msgstr "開始頻道搜尋" + +msgctxt "#30011" +msgid "Source Type" +msgstr "來源類型" + msgctxt "#30012" msgid "TV channels" msgstr "電視頻道" @@ -25,18 +72,174 @@ msgid "Radio channels" msgstr "無線電廣播頻道" +msgctxt "#30014" +msgid "FTA channels" +msgstr "FTA頻道" + +msgctxt "#30015" +msgid "Scrambled channels" +msgstr "加密頻道" + +msgctxt "#30016" +msgid "HD channels" +msgstr "高清頻道" + msgctxt "#30017" msgid "Country" msgstr "國家" +msgctxt "#30018" +msgid "Cable Inversion" +msgstr "電纜倒位" + +msgctxt "#30019" +msgid "Cable Symbolrate" +msgstr "電纜符碼率" + +msgctxt "#30020" +msgid "Cable modulation" +msgstr "電纜調變器" + +msgctxt "#30021" +msgid "Terr Inversion" +msgstr "Terr 倒位" + +msgctxt "#30022" +msgid "Satellite" +msgstr "衛星" + +msgctxt "#30023" +msgid "ATSC Type" +msgstr "ATSC類型" + msgctxt "#30024" msgid "Back" msgstr "返回" +msgctxt "#30025" +msgid "Channel search - running... %i %%" +msgstr "頻道搜索 - 運行中... %i %%" + msgctxt "#30026" msgid "Type:" msgstr "類型:" +msgctxt "#30027" +msgid "Device:" +msgstr "設備:" + +msgctxt "#30028" +msgid "Scan: %i" +msgstr "掃描: %i" + +msgctxt "#30029" +msgid "Signal: %i %%" +msgstr "信號: %i %%" + +msgctxt "#30030" +msgid "New channels: %i" +msgstr "新頻道: %i" + +msgctxt "#30031" +msgid "All channels: %i" +msgstr "所有頻道: %i" + +msgctxt "#30032" +msgid "Analog TV" +msgstr "類比電視" + +msgctxt "#30033" +msgid "Analog Radio" +msgstr "類比電台" + +msgctxt "#30034" +msgid "Transponder:" +msgstr "發射機應答器:" + +msgctxt "#30035" +msgid "New channels" +msgstr "新頻道" + +msgctxt "#30036" +msgid "Channel search - Finished" +msgstr "頻道搜索-已完成" + +msgctxt "#30037" +msgid "No device available - exiting" +msgstr "沒有可用設備-退出中" + +msgctxt "#30038" +msgid "No DVB-S2 device available - trying fallback to DVB-S" +msgstr "沒有可用的DVB-S2設備 - 試圖退回使用DVB-S" + msgctxt "#30039" msgid "Running" msgstr "正在執行" + +msgctxt "#30040" +msgid "Stopped" +msgstr "已停止" + +msgctxt "#30041" +msgid "Finished" +msgstr "已完成" + +msgctxt "#30042" +msgid "Channel search - Canceled" +msgstr "頻道搜索 - 取消" + +msgctxt "#30043" +msgid "Channel search - Error" +msgstr "頻道搜索 - 錯誤" + +msgctxt "#30044" +msgid "Lost connection to VDR Server" +msgstr "VDR服務器失去連線" + +msgctxt "#30045" +msgid "Connection to VDR Server restored" +msgstr "VDR服務器連線已恢復" + +msgctxt "#30046" +msgid "Create channel groups automatically on the server" +msgstr "自動在服務器上建立頻道群組" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "請求時間平移" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD選單" + +msgctxt "#30101" +msgid "Setup" +msgstr "系統設定" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "控制OSD選單中 - 按 info 鍵離開" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "選擇控制OSD選單" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "時間平移模式" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "時間平移緩衝 (RAM) x 100MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "時間平移緩衝 (檔案) x 1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "VDR 管理" + +msgctxt "#30108" +msgid "Channels" +msgstr "頻道" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Croatian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Croatian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Croatian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Croatian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,42 +1,269 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Croatian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/hr/)\n" +"Language-Team: Croatian (http://www.transifex.com/projects/p/xbmc-main/language/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +msgctxt "#30000" +msgid "VDR Hostname or IP" +msgstr "VDR naziv računala ili IP" + +msgctxt "#30001" +msgid "VNSI Port" +msgstr "VNSI ulaz" + +msgctxt "#30002" +msgid "Priority" +msgstr "Prioritet" + +msgctxt "#30003" +msgid "Character Set Conversion" +msgstr "Skup znakova konverzije" + +msgctxt "#30004" +msgid "Connect timeout (s)" +msgstr "Istek vremena povezivanja (sek)" + +msgctxt "#30005" +msgid "Allow VDR Messages" +msgstr "Dopusti VDR poruke" + +msgctxt "#30006" +msgid "Read recordings from directory" +msgstr "Čitaj snimanja iz direktorija" + +msgctxt "#30007" +msgid "VDR recordings directory" +msgstr "VDR direktorij snimanja" + +msgctxt "#30008" +msgid "Channel search" +msgstr "Pretraživanje programa" + +msgctxt "#30009" +msgid "Channel search - Settings" +msgstr "Pretraživanje programa - Postavke" + +msgctxt "#30010" +msgid "Start Channel search" +msgstr "Pokreni pretraživanje programa" + +msgctxt "#30011" +msgid "Source Type" +msgstr "Vrsta izvora" + msgctxt "#30012" msgid "TV channels" -msgstr "TV kanali" +msgstr "TV programi" msgctxt "#30013" msgid "Radio channels" -msgstr "Radio kanali" +msgstr "Radio programi" + +msgctxt "#30014" +msgid "FTA channels" +msgstr "Nekôdirani programi" + +msgctxt "#30015" +msgid "Scrambled channels" +msgstr "Kôdirani programi" + +msgctxt "#30016" +msgid "HD channels" +msgstr "HD programi" msgctxt "#30017" msgid "Country" msgstr "Zemlja" +msgctxt "#30018" +msgid "Cable Inversion" +msgstr "Inverzija kabla" + +msgctxt "#30019" +msgid "Cable Symbolrate" +msgstr "Protok simbola kabla" + +msgctxt "#30020" +msgid "Cable modulation" +msgstr "Modulacija kabla" + +msgctxt "#30021" +msgid "Terr Inversion" +msgstr "Zemaljska inverzija" + +msgctxt "#30022" +msgid "Satellite" +msgstr "Satelit" + +msgctxt "#30023" +msgid "ATSC Type" +msgstr "ATSC vrsta" + msgctxt "#30024" msgid "Back" msgstr "Nazad" +msgctxt "#30025" +msgid "Channel search - running... %i %%" +msgstr "Pretraživanje programa - pokretanje... %i %%" + msgctxt "#30026" msgid "Type:" -msgstr "Tip:" +msgstr "Vrsta:" + +msgctxt "#30027" +msgid "Device:" +msgstr "Uređaj:" + +msgctxt "#30028" +msgid "Scan: %i" +msgstr "Pretraži: %i" + +msgctxt "#30029" +msgid "Signal: %i %%" +msgstr "Signal: %i %%" + +msgctxt "#30030" +msgid "New channels: %i" +msgstr "Novi programi: %i" + +msgctxt "#30031" +msgid "All channels: %i" +msgstr "Svi programi: %i" + +msgctxt "#30032" +msgid "Analog TV" +msgstr "Analogna TV" + +msgctxt "#30033" +msgid "Analog Radio" +msgstr "Analogni Radio" + +msgctxt "#30034" +msgid "Transponder:" +msgstr "Transponder:" + +msgctxt "#30035" +msgid "New channels" +msgstr "Novi programi" + +msgctxt "#30036" +msgid "Channel search - Finished" +msgstr "Pretraživanje programa - Završeno" + +msgctxt "#30037" +msgid "No device available - exiting" +msgstr "Nema dostupnih uređaja - izlazim" + +msgctxt "#30038" +msgid "No DVB-S2 device available - trying fallback to DVB-S" +msgstr "Nema dostupnih DVB-S2 uređaja - pokušavam prebaciti na DVB-S" msgctxt "#30039" msgid "Running" -msgstr "Pokrenut" +msgstr "Pokrenuto" + +msgctxt "#30040" +msgid "Stopped" +msgstr "Zaustavljeno" + +msgctxt "#30041" +msgid "Finished" +msgstr "Završeno" + +msgctxt "#30042" +msgid "Channel search - Canceled" +msgstr "Pretraživanje programa - Prekinuto" + +msgctxt "#30043" +msgid "Channel search - Error" +msgstr "Pretraživanje programa - Greška" + +msgctxt "#30044" +msgid "Lost connection to VDR Server" +msgstr "Izgubljena veza s VDR poslužiteljem" + +msgctxt "#30045" +msgid "Connection to VDR Server restored" +msgstr "Povezivanje s VDR poslužiteljem ponovno uspostavljeno" + +msgctxt "#30046" +msgid "Create channel groups automatically on the server" +msgstr "Stvori grupu programa automatski na poslužitelju" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Omogući vremensko premotavanje" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD" + +msgctxt "#30101" +msgid "Setup" +msgstr "Postavljanje" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Upravljanje OSD - pritisni info za izlaz" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Odaberi za upravljanje OSD-om" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Način vremenskog premotavanja" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Međumemorija vremenskog premotavanja (RAM) x100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Međumemorija vremenskog premotavanja (Datoteka) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "VDR administrator" + +msgctxt "#30108" +msgid "Channels" +msgstr "Programi" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "Dopušteni pružatelj usluga" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "Blokirani programi" + +msgctxt "#30111" +msgid "Channel filters" +msgstr "Filtri programa" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Radio programi" + +msgctxt "#30113" +msgid "Save filters" +msgstr "Spremi filter" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "Nepoznat pružatelj usluge" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Czech/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Czech/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Czech/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Czech/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Czech (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/cs/)\n" +"Language-Team: Czech (http://www.transifex.com/projects/p/xbmc-main/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -204,3 +203,43 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Automaticky vytvářet skupiny kanálu na serveru" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Vyžádat časový posun" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD" + +msgctxt "#30101" +msgid "Setup" +msgstr "Nastavení" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Ovládám OSD - stiskněte info pro ukončení" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Vyberte k ovládání OSD" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Režim časového posunu" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Zásobník časového posunu (RAM) x100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Zásobník časového posunu (Soubor) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "Správce VDR" + +msgctxt "#30108" +msgid "Channels" +msgstr "Kanály" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Danish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Danish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Danish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Danish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Danish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/da/)\n" +"Language-Team: Danish (http://www.transifex.com/projects/p/xbmc-main/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -204,3 +203,43 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Opret automatisk en kanalgruppe på serveren" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Ønsk tidsforskydning" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD" + +msgctxt "#30101" +msgid "Setup" +msgstr "Opsætning" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Kontrollere OSD - tryk på info for at forlade" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Vælg for at kontrollere OSD" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Tidsforskydningstilstand" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Tidsforskydningsbuffer (RAM) X 100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Tidsforskyningsbuffer (Fil) X 1 Gb" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "VDR Administration" + +msgctxt "#30108" +msgid "Channels" +msgstr "Kanaler" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Dutch/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Dutch/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Dutch/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Dutch/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Dutch (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/nl/)\n" +"Language-Team: Dutch (http://www.transifex.com/projects/p/xbmc-main/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -31,7 +30,7 @@ msgctxt "#30003" msgid "Character Set Conversion" -msgstr "Character Set Conversie" +msgstr "Characterset Conversie" msgctxt "#30004" msgid "Connect timeout (s)" @@ -39,7 +38,7 @@ msgctxt "#30005" msgid "Allow VDR Messages" -msgstr "Berichten vanuit VDR toestaan" +msgstr "VDR-berichten toestaan" msgctxt "#30006" msgid "Read recordings from directory" @@ -55,7 +54,7 @@ msgctxt "#30009" msgid "Channel search - Settings" -msgstr "Kanalen scan - opties" +msgstr "Kanalen scan - Settings" msgctxt "#30010" msgid "Start Channel search" @@ -204,3 +203,67 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Automatisch Kanaal Groepen maken op de server" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Vraag Timeshift aan" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD" + +msgctxt "#30101" +msgid "Setup" +msgstr "Setup" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "OSD Beheren - Druk info om te sluiten" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Selecteer om de OSD te beheren" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Timeshift modus" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Timeshift Buffer (RAM)x100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Timeshift Buffer (Bestand) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "VDR Beheer" + +msgctxt "#30108" +msgid "Channels" +msgstr "Kanalen" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "Provider Whitelist" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "Kanaal blacklijst" + +msgctxt "#30111" +msgid "Channel filters" +msgstr "Kanalen filters" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Radio kanalen" + +msgctxt "#30113" +msgid "Save filters" +msgstr "Filters opslaan" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "Provider onbekend" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/English/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/English/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/English/strings.po 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/English/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: English (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/en/)\n" +"Language-Team: English (http://www.transifex.com/projects/p/xbmc-main/language/en/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -206,3 +205,69 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "" + +#empty strings from id 30048 to 30099 + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "" + +msgctxt "#30101" +msgid "Setup" +msgstr "" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "" + +msgctxt "#30108" +msgid "Channels" +msgstr "" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "" + +msgctxt "#30111" +msgid "Channel filters" +msgstr "" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "" + +msgctxt "#30113" +msgid "Save filters" +msgstr "" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/English (Australia)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/English (Australia)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/English (Australia)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/English (Australia)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (Australia) (http://www.transifex.com/projects/p/xbmc-main/language/en_AU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30017" +msgid "Country" +msgstr "Country" + +msgctxt "#30026" +msgid "Type:" +msgstr "Type:" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/English (New Zealand)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/English (New Zealand)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/English (New Zealand)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/English (New Zealand)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,269 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (New Zealand) (http://www.transifex.com/projects/p/xbmc-main/language/en_NZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_NZ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "VDR Hostname or IP" +msgstr "VDR Hostname or IP" + +msgctxt "#30001" +msgid "VNSI Port" +msgstr "VNSI Port" + +msgctxt "#30002" +msgid "Priority" +msgstr "Priority" + +msgctxt "#30003" +msgid "Character Set Conversion" +msgstr "Character Set Conversion" + +msgctxt "#30004" +msgid "Connect timeout (s)" +msgstr "Connect timeout (s)" + +msgctxt "#30005" +msgid "Allow VDR Messages" +msgstr "Allow VDR Messages" + +msgctxt "#30006" +msgid "Read recordings from directory" +msgstr "Read recordings from directory" + +msgctxt "#30007" +msgid "VDR recordings directory" +msgstr "VDR recordings directory" + +msgctxt "#30008" +msgid "Channel search" +msgstr "Channel search" + +msgctxt "#30009" +msgid "Channel search - Settings" +msgstr "Channel search - Settings" + +msgctxt "#30010" +msgid "Start Channel search" +msgstr "Start Channel search" + +msgctxt "#30011" +msgid "Source Type" +msgstr "Source Type" + +msgctxt "#30012" +msgid "TV channels" +msgstr "TV channels" + +msgctxt "#30013" +msgid "Radio channels" +msgstr "Radio channels" + +msgctxt "#30014" +msgid "FTA channels" +msgstr "FTA channels" + +msgctxt "#30015" +msgid "Scrambled channels" +msgstr "Scrambled channels" + +msgctxt "#30016" +msgid "HD channels" +msgstr "HD channels" + +msgctxt "#30017" +msgid "Country" +msgstr "Country" + +msgctxt "#30018" +msgid "Cable Inversion" +msgstr "Cable Inversion" + +msgctxt "#30019" +msgid "Cable Symbolrate" +msgstr "Cable Symbolrate" + +msgctxt "#30020" +msgid "Cable modulation" +msgstr "Cable modulation" + +msgctxt "#30021" +msgid "Terr Inversion" +msgstr "Terr Inversion" + +msgctxt "#30022" +msgid "Satellite" +msgstr "Satellite" + +msgctxt "#30023" +msgid "ATSC Type" +msgstr "ATSC Type" + +msgctxt "#30024" +msgid "Back" +msgstr "Back" + +msgctxt "#30025" +msgid "Channel search - running... %i %%" +msgstr "Channel search - running... %i %%" + +msgctxt "#30026" +msgid "Type:" +msgstr "Type:" + +msgctxt "#30027" +msgid "Device:" +msgstr "Device:" + +msgctxt "#30028" +msgid "Scan: %i" +msgstr "Scan: %i" + +msgctxt "#30029" +msgid "Signal: %i %%" +msgstr "Signal: %i %%" + +msgctxt "#30030" +msgid "New channels: %i" +msgstr "New channels: %i" + +msgctxt "#30031" +msgid "All channels: %i" +msgstr "All channels: %i" + +msgctxt "#30032" +msgid "Analog TV" +msgstr "Analog TV" + +msgctxt "#30033" +msgid "Analog Radio" +msgstr "Analog Radio" + +msgctxt "#30034" +msgid "Transponder:" +msgstr "Transponder:" + +msgctxt "#30035" +msgid "New channels" +msgstr "New channels" + +msgctxt "#30036" +msgid "Channel search - Finished" +msgstr "Channel search - Finished" + +msgctxt "#30037" +msgid "No device available - exiting" +msgstr "No device available - exiting" + +msgctxt "#30038" +msgid "No DVB-S2 device available - trying fallback to DVB-S" +msgstr "No DVB-S2 device available - trying fallback to DVB-S" + +msgctxt "#30039" +msgid "Running" +msgstr "Running" + +msgctxt "#30040" +msgid "Stopped" +msgstr "Stopped" + +msgctxt "#30041" +msgid "Finished" +msgstr "Finished" + +msgctxt "#30042" +msgid "Channel search - Canceled" +msgstr "Channel search - Canceled" + +msgctxt "#30043" +msgid "Channel search - Error" +msgstr "Channel search - Error" + +msgctxt "#30044" +msgid "Lost connection to VDR Server" +msgstr "Lost connection to VDR Server" + +msgctxt "#30045" +msgid "Connection to VDR Server restored" +msgstr "Connection to VDR Server restored" + +msgctxt "#30046" +msgid "Create channel groups automatically on the server" +msgstr "Create channel groups automatically on the server" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Request Timeshift" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD" + +msgctxt "#30101" +msgid "Setup" +msgstr "Setup" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Controlling OSD - press info to exit" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Select to control OSD" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Timeshift Mode" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Timeshift Buffer (RAM) x100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Timeshift Buffer (File) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "VDR Admin" + +msgctxt "#30108" +msgid "Channels" +msgstr "Channels" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "Provider whitelist" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "Channel blacklist" + +msgctxt "#30111" +msgid "Channel filters" +msgstr "Channel filters" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Radio Channels" + +msgctxt "#30113" +msgid "Save filters" +msgstr "Save filters" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "Provider Unknown" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/English (US)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/English (US)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/English (US)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/English (US)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,41 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (US) (http://www.transifex.com/projects/p/xbmc-main/language/en_US/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_US\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30012" +msgid "TV channels" +msgstr "TV channels" + +msgctxt "#30013" +msgid "Radio channels" +msgstr "Radio channels" + +msgctxt "#30017" +msgid "Country" +msgstr "Country" + +msgctxt "#30026" +msgid "Type:" +msgstr "Type:" + +msgctxt "#30039" +msgid "Running" +msgstr "Running" + +msgctxt "#30108" +msgid "Channels" +msgstr "Channels" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Esperanto/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Esperanto/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Esperanto/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Esperanto/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Esperanto (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/eo/)\n" +"Language-Team: Esperanto (http://www.transifex.com/projects/p/xbmc-main/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -20,3 +19,7 @@ msgctxt "#30026" msgid "Type:" msgstr "Speco:" + +msgctxt "#30101" +msgid "Setup" +msgstr "Preferoj" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Estonian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Estonian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Estonian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Estonian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,26 +1,97 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Estonian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/et/)\n" +"Language-Team: Estonian (http://www.transifex.com/projects/p/xbmc-main/language/et/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: et\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "VDR Hostname or IP" +msgstr "VDR hosti nimi või IP" + +msgctxt "#30001" +msgid "VNSI Port" +msgstr "VNSI port" + +msgctxt "#30002" +msgid "Priority" +msgstr "Tähtsus" + +msgctxt "#30003" +msgid "Character Set Conversion" +msgstr "Märgistiku muutmine" + +msgctxt "#30004" +msgid "Connect timeout (s)" +msgstr "Ühenduse aegumine (s)" + +msgctxt "#30005" +msgid "Allow VDR Messages" +msgstr "Luba VDR teated" + +msgctxt "#30008" +msgid "Channel search" +msgstr "Kanaliotsing" + +msgctxt "#30009" +msgid "Channel search - Settings" +msgstr "Kanaliotsing - seaded" + +msgctxt "#30010" +msgid "Start Channel search" +msgstr "Alusta kanaliotsingut" + +msgctxt "#30011" +msgid "Source Type" +msgstr "Allika tüüp" + +msgctxt "#30012" +msgid "TV channels" +msgstr "TV kanalid" + +msgctxt "#30013" +msgid "Radio channels" +msgstr "Raadio kanalid" + +msgctxt "#30014" +msgid "FTA channels" +msgstr "Vabalevi kanalid" + +msgctxt "#30015" +msgid "Scrambled channels" +msgstr "Krüptitud kanalid" + +msgctxt "#30016" +msgid "HD channels" +msgstr "HD kanalid" + msgctxt "#30017" msgid "Country" msgstr "Maa" +msgctxt "#30020" +msgid "Cable modulation" +msgstr "Kaabli modulatsioon" + +msgctxt "#30022" +msgid "Satellite" +msgstr "Satelliit" + +msgctxt "#30023" +msgid "ATSC Type" +msgstr "ATSC tüüp" + msgctxt "#30024" msgid "Back" msgstr "Tagasi" @@ -29,6 +100,70 @@ msgid "Type:" msgstr "Tüüp:" +msgctxt "#30027" +msgid "Device:" +msgstr "Seade:" + +msgctxt "#30029" +msgid "Signal: %i %%" +msgstr "Signaal: %i %%" + +msgctxt "#30030" +msgid "New channels: %i" +msgstr "Uued kanalid: %i" + +msgctxt "#30031" +msgid "All channels: %i" +msgstr "Kõik kanalid: %i" + +msgctxt "#30032" +msgid "Analog TV" +msgstr "Analoog TV" + +msgctxt "#30033" +msgid "Analog Radio" +msgstr "Analoog raadio" + +msgctxt "#30034" +msgid "Transponder:" +msgstr "Transponder:" + +msgctxt "#30035" +msgid "New channels" +msgstr "Uued kanalid" + +msgctxt "#30036" +msgid "Channel search - Finished" +msgstr "Kanaliotsing - lõpetatud" + +msgctxt "#30037" +msgid "No device available - exiting" +msgstr "Ühtegi seadet pole saadaval - väljumine" + msgctxt "#30039" msgid "Running" msgstr "Töötab" + +msgctxt "#30040" +msgid "Stopped" +msgstr "Peatatud" + +msgctxt "#30041" +msgid "Finished" +msgstr "Lõpetatud" + +msgctxt "#30042" +msgid "Channel search - Canceled" +msgstr "Kanaliotsing - tühistatud" + +msgctxt "#30043" +msgid "Channel search - Error" +msgstr "Kanaliotsing - tõrge" + +msgctxt "#30101" +msgid "Setup" +msgstr "Seadistus" + +msgctxt "#30108" +msgid "Channels" +msgstr "Kanalid" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Faroese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Faroese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Faroese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Faroese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,41 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Faroese (http://www.transifex.com/projects/p/xbmc-main/language/fo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30012" +msgid "TV channels" +msgstr "Sjónvarpsrásir" + +msgctxt "#30013" +msgid "Radio channels" +msgstr "Útvarpsrásir" + +msgctxt "#30017" +msgid "Country" +msgstr "Land" + +msgctxt "#30026" +msgid "Type:" +msgstr "Slag:" + +msgctxt "#30039" +msgid "Running" +msgstr "Spæli" + +msgctxt "#30108" +msgid "Channels" +msgstr "Rás" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Finnish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Finnish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Finnish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Finnish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Finnish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fi/)\n" +"Language-Team: Finnish (http://www.transifex.com/projects/p/xbmc-main/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -204,3 +203,11 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Luo kanavaryhmät automaattisesti palvelimella" + +msgctxt "#30101" +msgid "Setup" +msgstr "Asetukset" + +msgctxt "#30108" +msgid "Channels" +msgstr "Kanavat" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/French/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/French/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/French/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/French/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: French (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fr/)\n" +"Language-Team: French (http://www.transifex.com/projects/p/xbmc-main/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -204,3 +203,67 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Créer automatiquement les groupes de chaîne sur le serveur" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Demander le différé" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "Menu de réglage VDR" + +msgctxt "#30101" +msgid "Setup" +msgstr "Configuration" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Menu de réglage en cours - Appuyer sur info pour sortir" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Sélectionner pour contrôler l'affichage à l'écran" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Mode différé" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Tampon pour le différé (RAM) x100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Tampon pour le différé (Fichier) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "Administrateur VDR" + +msgctxt "#30108" +msgid "Channels" +msgstr "Chaînes" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "Liste blanche de fournisseur" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "Liste noire de chaînes" + +msgctxt "#30111" +msgid "Channel filters" +msgstr "Filtre de chaînes" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Postes Radio" + +msgctxt "#30113" +msgid "Save filters" +msgstr "Enregistrer les filtres" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "Fournisseur inconnu" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/French (Canada)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/French (Canada)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/French (Canada)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/French (Canada)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,265 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: French (Canada) (http://www.transifex.com/projects/p/xbmc-main/language/fr_CA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_CA\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "VDR Hostname or IP" +msgstr "Nom d'hôte ou adresse IP de VDR" + +msgctxt "#30001" +msgid "VNSI Port" +msgstr "Port VNSI" + +msgctxt "#30002" +msgid "Priority" +msgstr "Priorité" + +msgctxt "#30003" +msgid "Character Set Conversion" +msgstr "Conversion du jeu de caractères" + +msgctxt "#30004" +msgid "Connect timeout (s)" +msgstr "Délai d'attente de connexion (s)" + +msgctxt "#30005" +msgid "Allow VDR Messages" +msgstr "Permettre les messages de VDR" + +msgctxt "#30006" +msgid "Read recordings from directory" +msgstr "Lire les enregistrements du répertoire" + +msgctxt "#30007" +msgid "VDR recordings directory" +msgstr "Répertoire des enregistrements de VDR" + +msgctxt "#30008" +msgid "Channel search" +msgstr "Recherche de chaînes" + +msgctxt "#30009" +msgid "Channel search - Settings" +msgstr "Recherche de chaînes - Paramètres" + +msgctxt "#30010" +msgid "Start Channel search" +msgstr "Démarrer la recherche des chaînes" + +msgctxt "#30011" +msgid "Source Type" +msgstr "Type de sources" + +msgctxt "#30012" +msgid "TV channels" +msgstr "Chaînes télé" + +msgctxt "#30013" +msgid "Radio channels" +msgstr "Chaînes radio" + +msgctxt "#30014" +msgid "FTA channels" +msgstr "Chaînes en clair" + +msgctxt "#30015" +msgid "Scrambled channels" +msgstr "Chaînes brouillées" + +msgctxt "#30016" +msgid "HD channels" +msgstr "Chaînes HD" + +msgctxt "#30017" +msgid "Country" +msgstr "Pays" + +msgctxt "#30018" +msgid "Cable Inversion" +msgstr "Inversion du câble" + +msgctxt "#30019" +msgid "Cable Symbolrate" +msgstr "Débit de symboles du câble" + +msgctxt "#30020" +msgid "Cable modulation" +msgstr "Modulation du câble" + +msgctxt "#30022" +msgid "Satellite" +msgstr "Satellite" + +msgctxt "#30023" +msgid "ATSC Type" +msgstr "Type ATSC" + +msgctxt "#30024" +msgid "Back" +msgstr "Retour" + +msgctxt "#30025" +msgid "Channel search - running... %i %%" +msgstr "Recherche de chaînes - en cours... %i %%" + +msgctxt "#30026" +msgid "Type:" +msgstr "Type :" + +msgctxt "#30027" +msgid "Device:" +msgstr "Dispositif :" + +msgctxt "#30028" +msgid "Scan: %i" +msgstr "Balayage : %i" + +msgctxt "#30029" +msgid "Signal: %i %%" +msgstr "Signal : %i %%" + +msgctxt "#30030" +msgid "New channels: %i" +msgstr "Nouvelles chaînes : %i" + +msgctxt "#30031" +msgid "All channels: %i" +msgstr "Toutes les chaînes : %i" + +msgctxt "#30032" +msgid "Analog TV" +msgstr "Télé analogique" + +msgctxt "#30033" +msgid "Analog Radio" +msgstr "Radio analogique" + +msgctxt "#30034" +msgid "Transponder:" +msgstr "Transpondeur :" + +msgctxt "#30035" +msgid "New channels" +msgstr "Nouvelles chaînes" + +msgctxt "#30036" +msgid "Channel search - Finished" +msgstr "Recherche de chaînes - Terminée" + +msgctxt "#30037" +msgid "No device available - exiting" +msgstr "Aucun dispositif disponible - Sortie" + +msgctxt "#30038" +msgid "No DVB-S2 device available - trying fallback to DVB-S" +msgstr "Aucun dispositif DVB-S2 disponible - Tentative de repli sur DVB-S" + +msgctxt "#30039" +msgid "Running" +msgstr "En fonction" + +msgctxt "#30040" +msgid "Stopped" +msgstr "Arrêté" + +msgctxt "#30041" +msgid "Finished" +msgstr "Fini" + +msgctxt "#30042" +msgid "Channel search - Canceled" +msgstr "Recherche de chaînes - Annulée" + +msgctxt "#30043" +msgid "Channel search - Error" +msgstr "Recherche de chaînes - Erreur" + +msgctxt "#30044" +msgid "Lost connection to VDR Server" +msgstr "Connexion perdue vers le serveur VDR" + +msgctxt "#30045" +msgid "Connection to VDR Server restored" +msgstr "Connexion récupérée avec le serveur VDR" + +msgctxt "#30046" +msgid "Create channel groups automatically on the server" +msgstr "Créer automatiquement des groupes de chaînes sur le serveur" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Demander le décalage temporel" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "Affichage à l'écran VDR" + +msgctxt "#30101" +msgid "Setup" +msgstr "Réglage" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Contrôle de l'affichage à l'écran - Peser sur info pour sortir" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Sélectionner pour contrôler l'affichage à l'écran" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Mode de décalage temporel" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Tampon de décalage temporel (RAM) x 100 Mo" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Tampon de décalage temporel (fichier ) x 1 Go" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "Administration VDR" + +msgctxt "#30108" +msgid "Channels" +msgstr "Chaînes" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "Liste blanche des fournisseurs" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "Liste noire des chaînes" + +msgctxt "#30111" +msgid "Channel filters" +msgstr "Filtres de chaînes" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Chaîne radio" + +msgctxt "#30113" +msgid "Save filters" +msgstr "Enregistrer les filtres" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "Fournisseur inconnu" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Galician/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Galician/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Galician/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Galician/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,26 +1,69 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Galician (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/gl/)\n" +"Language-Team: Galician (http://www.transifex.com/projects/p/xbmc-main/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: gl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "VDR Hostname or IP" +msgstr "Nome de host ou IP de VDR" + +msgctxt "#30001" +msgid "VNSI Port" +msgstr "Porto VNSI" + +msgctxt "#30002" +msgid "Priority" +msgstr "Prioridade" + +msgctxt "#30003" +msgid "Character Set Conversion" +msgstr "Conversión do conxunto de caracteres" + msgctxt "#30004" msgid "Connect timeout (s)" msgstr "Tempo(s) de espera para conectar" +msgctxt "#30005" +msgid "Allow VDR Messages" +msgstr "Permitir mensaxes do VDR" + +msgctxt "#30006" +msgid "Read recordings from directory" +msgstr "Ler gravacións do cartafol" + +msgctxt "#30007" +msgid "VDR recordings directory" +msgstr "Cartafol das gravacións do VDR" + +msgctxt "#30008" +msgid "Channel search" +msgstr "Busca de canles" + +msgctxt "#30009" +msgid "Channel search - Settings" +msgstr "Busca de canles - Configuración" + +msgctxt "#30010" +msgid "Start Channel search" +msgstr "Iniciar Busca" + +msgctxt "#30011" +msgid "Source Type" +msgstr "Tipo de Fonte" + msgctxt "#30012" msgid "TV channels" msgstr "Canles de TV" @@ -29,18 +72,198 @@ msgid "Radio channels" msgstr "Canles de Radio" +msgctxt "#30014" +msgid "FTA channels" +msgstr "Canles FTA" + +msgctxt "#30015" +msgid "Scrambled channels" +msgstr "Canles Codificadas" + +msgctxt "#30016" +msgid "HD channels" +msgstr "Canles HD" + msgctxt "#30017" msgid "Country" msgstr "País" +msgctxt "#30018" +msgid "Cable Inversion" +msgstr "Inversión de cable" + +msgctxt "#30019" +msgid "Cable Symbolrate" +msgstr "Ratio do cable" + +msgctxt "#30020" +msgid "Cable modulation" +msgstr "Modulación do cable" + +msgctxt "#30021" +msgid "Terr Inversion" +msgstr "Inversión Terr" + +msgctxt "#30022" +msgid "Satellite" +msgstr "Satélite" + +msgctxt "#30023" +msgid "ATSC Type" +msgstr "Tipo ATSC" + msgctxt "#30024" msgid "Back" msgstr "Atrás" +msgctxt "#30025" +msgid "Channel search - running... %i %%" +msgstr "Busca de canles - executando... %i %%" + msgctxt "#30026" msgid "Type:" msgstr "Tipo:" +msgctxt "#30027" +msgid "Device:" +msgstr "Dispositivo:" + +msgctxt "#30028" +msgid "Scan: %i" +msgstr "Buscar: %i" + +msgctxt "#30029" +msgid "Signal: %i %%" +msgstr "Sinal: %i %%" + +msgctxt "#30030" +msgid "New channels: %i" +msgstr "Novas canles: %i" + +msgctxt "#30031" +msgid "All channels: %i" +msgstr "Todas as canles: %i" + +msgctxt "#30032" +msgid "Analog TV" +msgstr "TV Analóxica" + +msgctxt "#30033" +msgid "Analog Radio" +msgstr "Radio Analóxica" + +msgctxt "#30034" +msgid "Transponder:" +msgstr "Transpondedor:" + +msgctxt "#30035" +msgid "New channels" +msgstr "Novas canles" + +msgctxt "#30036" +msgid "Channel search - Finished" +msgstr "Busca da canles - Remantado" + +msgctxt "#30037" +msgid "No device available - exiting" +msgstr "Dispositivo non dispoñíbel - saíndo" + +msgctxt "#30038" +msgid "No DVB-S2 device available - trying fallback to DVB-S" +msgstr "Dispositivo DVB-S2 non dispoñíbel - tente de voltar ao DVB-S" + msgctxt "#30039" msgid "Running" msgstr "Procesando" + +msgctxt "#30040" +msgid "Stopped" +msgstr "Detido" + +msgctxt "#30041" +msgid "Finished" +msgstr "Rematado" + +msgctxt "#30042" +msgid "Channel search - Canceled" +msgstr "Busca de canles - Cancelada" + +msgctxt "#30043" +msgid "Channel search - Error" +msgstr "Busca de canles - Erro" + +msgctxt "#30044" +msgid "Lost connection to VDR Server" +msgstr "Perdeuse a conexión co Servidor VDR" + +msgctxt "#30045" +msgid "Connection to VDR Server restored" +msgstr "Restabeleceuse a conexión co Servidor VDR" + +msgctxt "#30046" +msgid "Create channel groups automatically on the server" +msgstr "Crear grupos de canles automaticamente no servidor" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Solicitar Timeshift" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD" + +msgctxt "#30101" +msgid "Setup" +msgstr "Configuración" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Controlando o OSD - prema info. para saír" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Seleccionar para controlar o OSD" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Modo Timeshift" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Búfer do Timeshift (RAM) x100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Búfer do Timeshift (Ficheiro) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "Administrador VDR" + +msgctxt "#30108" +msgid "Channels" +msgstr "Canles" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "Listaxe branca de Provedores" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "Listaxe negra de Provedores" + +msgctxt "#30111" +msgid "Channel filters" +msgstr "Filtros das canles" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Canles de Radio" + +msgctxt "#30113" +msgid "Save filters" +msgstr "Gardar filtros" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "Provedor Descoñecido" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Georgian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Georgian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Georgian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Georgian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,25 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Georgian (http://www.transifex.com/projects/p/xbmc-main/language/ka/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ka\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30004" +msgid "Connect timeout (s)" +msgstr "შეერთების დაყოვნება(ები)" + +msgctxt "#30024" +msgid "Back" +msgstr "უკან" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/German/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/German/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/German/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/German/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: German (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/de/)\n" +"Language-Team: German (http://www.transifex.com/projects/p/xbmc-main/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -35,7 +34,7 @@ msgctxt "#30004" msgid "Connect timeout (s)" -msgstr "Verbindungszeitüberlauf (s)" +msgstr "Verbindungstimeout (s)" msgctxt "#30005" msgid "Allow VDR Messages" @@ -67,23 +66,23 @@ msgctxt "#30012" msgid "TV channels" -msgstr "TV Kanäle" +msgstr "TV Sender" msgctxt "#30013" msgid "Radio channels" -msgstr "Radio Kanäle" +msgstr "Radio Sender" msgctxt "#30014" msgid "FTA channels" -msgstr "Frei empfangbare Kanäle" +msgstr "Frei empfangbare Sender" msgctxt "#30015" msgid "Scrambled channels" -msgstr "Verschlüsselte Kanäle" +msgstr "Verschlüsselte Sender" msgctxt "#30016" msgid "HD channels" -msgstr "HD Kanäle" +msgstr "HD Sender" msgctxt "#30017" msgid "Country" @@ -111,7 +110,7 @@ msgctxt "#30023" msgid "ATSC Type" -msgstr "ATSC Type" +msgstr "ATSC Typ" msgctxt "#30024" msgid "Back" @@ -139,11 +138,11 @@ msgctxt "#30030" msgid "New channels: %i" -msgstr "Neue Kanäle: %i" +msgstr "Neue Sender: %i" msgctxt "#30031" msgid "All channels: %i" -msgstr "Alle Kanäle: %i" +msgstr "Alle Sender: %i" msgctxt "#30032" msgid "Analog TV" @@ -159,15 +158,15 @@ msgctxt "#30035" msgid "New channels" -msgstr "Neue Kanäle" +msgstr "Neue Sender" msgctxt "#30036" msgid "Channel search - Finished" -msgstr "Kanalsuche - Abgeschlossen" +msgstr "Sendersuche - Abgeschlossen" msgctxt "#30037" msgid "No device available - exiting" -msgstr "Kein Empfangsgerät verfügbar" +msgstr "Kein Empfangsgerät verfügbar - Beende Vorgang" msgctxt "#30038" msgid "No DVB-S2 device available - trying fallback to DVB-S" @@ -183,15 +182,15 @@ msgctxt "#30041" msgid "Finished" -msgstr "Fertig" +msgstr "Abgeschlossen" msgctxt "#30042" msgid "Channel search - Canceled" -msgstr "Kanalsuche - Abgebrochen" +msgstr "Sendersuche - Abgebrochen" msgctxt "#30043" msgid "Channel search - Error" -msgstr "Kanalsuche - Fehler" +msgstr "Sendersuche - Fehler" msgctxt "#30044" msgid "Lost connection to VDR Server" @@ -203,4 +202,68 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" -msgstr "Kanalgruppen automatisch am Server erzeugen" +msgstr "Sendergruppen automatisch auf dem Server anlegen" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Fordere Timeshift an" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD" + +msgctxt "#30101" +msgid "Setup" +msgstr "Setup" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "OSD-Steuerung aktiv - Drücke Info zum Verlassen" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Auswählen zur OSD-Steuerung" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Timeshift-Modus" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Timeshift Puffer (RAM) x100MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Timeshift Puffer (Datei) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "VDR Admin" + +msgctxt "#30108" +msgid "Channels" +msgstr "Kanäle" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "Weißliste der Anbieter" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "Weißliste der Kanäle" + +msgctxt "#30111" +msgid "Channel filters" +msgstr "Kanalfilter" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Radiokanäle" + +msgctxt "#30113" +msgid "Save filters" +msgstr "Filter speichern" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "Anbieter unbekannt" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Greek/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Greek/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Greek/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Greek/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Greek (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/el/)\n" +"Language-Team: Greek (http://www.transifex.com/projects/p/xbmc-main/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -204,3 +203,67 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Αυτόματη δημιουργία γκρουπ καναλιών σε αυτό το διακομιστή" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Αίτημα για Timeshift" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "OSD του VDR" + +msgctxt "#30101" +msgid "Setup" +msgstr "Εγκατάσταση" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Έλεγχος OSD - πιέστε το info για έξοδο" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Επιλέξτε για έλεγχο του OSD" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Λειτουργία Timeshift" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Προσωρινή Αποθήκευση του Timeshift (RAM) x100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Προσωρινή Αποθήκευση του Timeshift (Αρχείο) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "Admin του VDR" + +msgctxt "#30108" +msgid "Channels" +msgstr "Κανάλια" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "Λευκή λίστα παρόχων" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "Μαύρη λίστα καναλιών" + +msgctxt "#30111" +msgid "Channel filters" +msgstr "Φίλτρα καναλιών" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Ραδιοφωνικοί Σταθμοί" + +msgctxt "#30113" +msgid "Save filters" +msgstr "Αποθήκευση φίλτρων" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "Άγνωστος Πάροχος" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Hebrew/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Hebrew/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Hebrew/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Hebrew/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hebrew (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/he/)\n" +"Language-Team: Hebrew (http://www.transifex.com/projects/p/xbmc-main/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -204,3 +203,43 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "צור קבוצות ערוצים על השרת אוטומטית" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "בקש תזוזה בזמן" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD" + +msgctxt "#30101" +msgid "Setup" +msgstr "הגדרות" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "שליטה ב-OSD - ליציאה לחץ על Info" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "בחר לשליטה ב-OSD" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "מצב תזוזה בזמן" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "חוצץ תזוזה בזמן (זיכרון נדיף) x100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "חוצץ תזוזה בזמן (קובץ) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "VDR Admin" + +msgctxt "#30108" +msgid "Channels" +msgstr "ערוצים" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Hindi (Devanagiri)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Hindi (Devanagiri)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Hindi (Devanagiri)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Hindi (Devanagiri)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hindi (Devanagiri) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/hi/)\n" +"Language-Team: Hindi (Devanagiri) (http://www.transifex.com/projects/p/xbmc-main/language/hi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -20,3 +19,7 @@ msgctxt "#30017" msgid "Country" msgstr "देश" + +msgctxt "#30026" +msgid "Type:" +msgstr "टाइप" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Hungarian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Hungarian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Hungarian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Hungarian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hungarian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/hu/)\n" +"Language-Team: Hungarian (http://www.transifex.com/projects/p/xbmc-main/language/hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -204,3 +203,67 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Csatorna csoportok automatikus létrehozása a szerveren" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Csúsztatott élőkép kérése" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD" + +msgctxt "#30101" +msgid "Setup" +msgstr "Beállítás" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "OSD vezérlés - info gombbal kilép" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "OSD vezérlése" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Csúsztatott felvétel mód" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Csúsztatott felvétel puffer (RAM) x100 Mb" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Csúsztatott felvétel (Fájl)x1 Gb" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "VDR Admin" + +msgctxt "#30108" +msgid "Channels" +msgstr "Csatornák" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "Szolgáltató fehérlista" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "Csatorna fekete-lista" + +msgctxt "#30111" +msgid "Channel filters" +msgstr "Csatorna szűrők" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Rádió csatornák" + +msgctxt "#30113" +msgid "Save filters" +msgstr "Szűrők elmentése" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "Szolgáltató ismeretlen" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Icelandic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Icelandic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Icelandic/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Icelandic/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Icelandic (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/is/)\n" +"Language-Team: Icelandic (http://www.transifex.com/projects/p/xbmc-main/language/is/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -40,3 +39,15 @@ msgctxt "#30039" msgid "Running" msgstr "Keyrir" + +msgctxt "#30041" +msgid "Finished" +msgstr "Búið" + +msgctxt "#30101" +msgid "Setup" +msgstr "Uppsetning" + +msgctxt "#30108" +msgid "Channels" +msgstr "Rásir" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Indonesian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Indonesian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Indonesian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Indonesian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,269 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Indonesian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/id/)\n" +"Language-Team: Indonesian (http://www.transifex.com/projects/p/xbmc-main/language/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: id\n" "Plural-Forms: nplurals=1; plural=0;\n" +msgctxt "#30000" +msgid "VDR Hostname or IP" +msgstr "Hostname atau alamat IP VDR" + +msgctxt "#30001" +msgid "VNSI Port" +msgstr "Port VNSI" + +msgctxt "#30002" +msgid "Priority" +msgstr "Prioritas" + +msgctxt "#30003" +msgid "Character Set Conversion" +msgstr "Konversi Set Karakter" + +msgctxt "#30004" +msgid "Connect timeout (s)" +msgstr "Timeout koneksi (s)" + +msgctxt "#30005" +msgid "Allow VDR Messages" +msgstr "Perbolehkan pesan VDR" + +msgctxt "#30006" +msgid "Read recordings from directory" +msgstr "Baca rekaman dari direktori" + +msgctxt "#30007" +msgid "VDR recordings directory" +msgstr "Direktori perekaman VDR" + +msgctxt "#30008" +msgid "Channel search" +msgstr "Cari Kanal" + +msgctxt "#30009" +msgid "Channel search - Settings" +msgstr "Cari Kanal - Setelan" + +msgctxt "#30010" +msgid "Start Channel search" +msgstr "Mulai pencarian kanal" + +msgctxt "#30011" +msgid "Source Type" +msgstr "Tipe sumber" + +msgctxt "#30012" +msgid "TV channels" +msgstr "Saluran TV" + +msgctxt "#30013" +msgid "Radio channels" +msgstr "Saluran Radio" + +msgctxt "#30014" +msgid "FTA channels" +msgstr "Kanal siaran gratis" + +msgctxt "#30015" +msgid "Scrambled channels" +msgstr "Kanal yang diacak" + +msgctxt "#30016" +msgid "HD channels" +msgstr "Kanal HD" + +msgctxt "#30017" +msgid "Country" +msgstr "Negara" + +msgctxt "#30018" +msgid "Cable Inversion" +msgstr "Inversi Kabel" + +msgctxt "#30019" +msgid "Cable Symbolrate" +msgstr "Symbolrate Kabel" + +msgctxt "#30020" +msgid "Cable modulation" +msgstr "Modulasi Kabel" + +msgctxt "#30021" +msgid "Terr Inversion" +msgstr "Inversi Terr" + +msgctxt "#30022" +msgid "Satellite" +msgstr "Satelit" + +msgctxt "#30023" +msgid "ATSC Type" +msgstr "Tipe ATSC" + +msgctxt "#30024" +msgid "Back" +msgstr "Mundur" + +msgctxt "#30025" +msgid "Channel search - running... %i %%" +msgstr "Pencarian kanal - sedang berlangsung... %i %%" + msgctxt "#30026" msgid "Type:" msgstr "Tipe:" + +msgctxt "#30027" +msgid "Device:" +msgstr "Perangkat:" + +msgctxt "#30028" +msgid "Scan: %i" +msgstr "Pindai: %i" + +msgctxt "#30029" +msgid "Signal: %i %%" +msgstr "Sinyal: %i %%" + +msgctxt "#30030" +msgid "New channels: %i" +msgstr "Kanal baru: %i" + +msgctxt "#30031" +msgid "All channels: %i" +msgstr "Semua kanal: %i" + +msgctxt "#30032" +msgid "Analog TV" +msgstr "TV analog" + +msgctxt "#30033" +msgid "Analog Radio" +msgstr "Radio analog" + +msgctxt "#30034" +msgid "Transponder:" +msgstr "Transponder:" + +msgctxt "#30035" +msgid "New channels" +msgstr "Kanal baru" + +msgctxt "#30036" +msgid "Channel search - Finished" +msgstr "Pencarian kanal - Selesai" + +msgctxt "#30037" +msgid "No device available - exiting" +msgstr "Tidak ada perangkat tersedia - Program dihentikan" + +msgctxt "#30038" +msgid "No DVB-S2 device available - trying fallback to DVB-S" +msgstr "Tidak ada perangkat DVB-S2 tersedia - Mencoba kembali ke DVB-S" + +msgctxt "#30039" +msgid "Running" +msgstr "Menjalankan" + +msgctxt "#30040" +msgid "Stopped" +msgstr "Terhenti" + +msgctxt "#30041" +msgid "Finished" +msgstr "Selesai" + +msgctxt "#30042" +msgid "Channel search - Canceled" +msgstr "Pencarian kanal - digagalkan" + +msgctxt "#30043" +msgid "Channel search - Error" +msgstr "Pencarian kanal - Error" + +msgctxt "#30044" +msgid "Lost connection to VDR Server" +msgstr "Koneksi ke Server VDR terputus" + +msgctxt "#30045" +msgid "Connection to VDR Server restored" +msgstr "Koneksi ke Server VDR tersambung kembali" + +msgctxt "#30046" +msgid "Create channel groups automatically on the server" +msgstr "Buat grup kanal secara otomatis di server" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Meminta Timeshift" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "OSD VDR" + +msgctxt "#30101" +msgid "Setup" +msgstr "Konfigurasi" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Mengatur OSD - tekan info untuk keluar" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Pilih untuk menjalankan OSD" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Modus Timeshift" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Penyangga Timeshift (RAM) x100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Penyangga Timeshift (Berkas) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "Admin VDR" + +msgctxt "#30108" +msgid "Channels" +msgstr "Saluran" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "Whitelist Penyedia" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "Blacklist Kanal" + +msgctxt "#30111" +msgid "Channel filters" +msgstr "Filter Kanal" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Kanal Radio" + +msgctxt "#30113" +msgid "Save filters" +msgstr "Simpan filter" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "Penyedia tidak dikenal" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Italian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Italian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Italian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Italian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Italian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/it/)\n" +"Language-Team: Italian (http://www.transifex.com/projects/p/xbmc-main/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -23,7 +22,7 @@ msgctxt "#30001" msgid "VNSI Port" -msgstr "Porta VSNI" +msgstr "Porta VNSI" msgctxt "#30002" msgid "Priority" @@ -204,3 +203,43 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Crea automaticamente gruppi di canali sul server" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Richiesta " + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "OSD VDR" + +msgctxt "#30101" +msgid "Setup" +msgstr "Impostazioni" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Controllo OSD - premi info per uscire" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Seleziona per controllare l'OSD" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Modalità Timeshift" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Buffer Timeshift (RAM) x100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Buffer Timeshift (File) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "Amministratore VDR" + +msgctxt "#30108" +msgid "Channels" +msgstr "Canali" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Japanese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Japanese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Japanese/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Japanese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Japanese (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ja/)\n" +"Language-Team: Japanese (http://www.transifex.com/projects/p/xbmc-main/language/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -25,10 +24,30 @@ msgid "VNSI Port" msgstr "VNSI ポート" +msgctxt "#30002" +msgid "Priority" +msgstr "優先順位" + +msgctxt "#30003" +msgid "Character Set Conversion" +msgstr "文字セット変換" + msgctxt "#30004" msgid "Connect timeout (s)" msgstr "接続タイムアウト (秒)" +msgctxt "#30005" +msgid "Allow VDR Messages" +msgstr "VDRのメッセージを許可する" + +msgctxt "#30006" +msgid "Read recordings from directory" +msgstr "ディレクトリから録画を読む" + +msgctxt "#30007" +msgid "VDR recordings directory" +msgstr "VDR録画のディレクトリ" + msgctxt "#30008" msgid "Channel search" msgstr "チャンネル検索" @@ -69,6 +88,10 @@ msgid "Country" msgstr "国" +msgctxt "#30022" +msgid "Satellite" +msgstr "衛星" + msgctxt "#30023" msgid "ATSC Type" msgstr "ATSCタイプ" @@ -97,6 +120,14 @@ msgid "Signal: %i %%" msgstr "シグナル:%i %%" +msgctxt "#30030" +msgid "New channels: %i" +msgstr "新規チャンネル: %i" + +msgctxt "#30031" +msgid "All channels: %i" +msgstr "全チャンネル: %i" + msgctxt "#30032" msgid "Analog TV" msgstr "アナログTV" @@ -105,10 +136,22 @@ msgid "Analog Radio" msgstr "アナログラジオ" +msgctxt "#30035" +msgid "New channels" +msgstr "新規チャンネル" + msgctxt "#30036" msgid "Channel search - Finished" msgstr "チャンネル検索 - 完了" +msgctxt "#30037" +msgid "No device available - exiting" +msgstr "利用可能なデバイスがありません - 出ます" + +msgctxt "#30038" +msgid "No DVB-S2 device available - trying fallback to DVB-S" +msgstr "DVB-S2のデバイスが見つかりませんーDVB-Sへフォールバックしようとしています" + msgctxt "#30039" msgid "Running" msgstr "実行中" @@ -136,3 +179,47 @@ msgctxt "#30045" msgid "Connection to VDR Server restored" msgstr "VDRサーバとの接続が復活しました" + +msgctxt "#30046" +msgid "Create channel groups automatically on the server" +msgstr "サーバ上で自動的にチャネルグループを作成する" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "タイムシフトを要求する" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD" + +msgctxt "#30101" +msgid "Setup" +msgstr "設定" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "OSDを制御する - 終了するのには「Info]を押して下さい" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "OSDを制御するため選択してください" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "タイムシフトモード" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "タイムシフトバッファー(RAM)x100MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "タイムシフトバッファー(ファイル) x 1GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "VDR管理" + +msgctxt "#30108" +msgid "Channels" +msgstr "チャンネル" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Korean/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Korean/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Korean/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Korean/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Korean (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ko/)\n" +"Language-Team: Korean (http://www.transifex.com/projects/p/xbmc-main/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -192,3 +191,15 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "서버에 자동으로 채널 그룹 생성" + +msgctxt "#30101" +msgid "Setup" +msgstr "설정" + +msgctxt "#30108" +msgid "Channels" +msgstr "채널" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "라디오 채널" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Latvian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Latvian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Latvian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Latvian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,97 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Latvian (http://www.transifex.com/projects/p/xbmc-main/language/lv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +msgctxt "#30000" +msgid "VDR Hostname or IP" +msgstr "VDR saimniekvārds vai IP" + +msgctxt "#30002" +msgid "Priority" +msgstr "Prioritāte" + +msgctxt "#30012" +msgid "TV channels" +msgstr "TV kanāli" + +msgctxt "#30013" +msgid "Radio channels" +msgstr "Radio kanāli" + +msgctxt "#30016" +msgid "HD channels" +msgstr "HD kanāli" + +msgctxt "#30017" +msgid "Country" +msgstr "Valsts" + +msgctxt "#30022" +msgid "Satellite" +msgstr "Satelīts" + +msgctxt "#30023" +msgid "ATSC Type" +msgstr "ATSC tips" + +msgctxt "#30024" +msgid "Back" +msgstr "Atpakaļ" + +msgctxt "#30026" +msgid "Type:" +msgstr "Tips:" + +msgctxt "#30027" +msgid "Device:" +msgstr "Ierīce:" + +msgctxt "#30032" +msgid "Analog TV" +msgstr "Analogā TV" + +msgctxt "#30034" +msgid "Transponder:" +msgstr "Nesējfrekvence:" + +msgctxt "#30039" +msgid "Running" +msgstr "Darbojas" + +msgctxt "#30040" +msgid "Stopped" +msgstr "Apturēts" + +msgctxt "#30041" +msgid "Finished" +msgstr "Pabeigts" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD" + +msgctxt "#30101" +msgid "Setup" +msgstr "Iestatīšana" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "VDR admins" + +msgctxt "#30108" +msgid "Channels" +msgstr "Kanāli" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Lithuanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Lithuanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Lithuanian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Lithuanian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Lithuanian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/lt/)\n" +"Language-Team: Lithuanian (http://www.transifex.com/projects/p/xbmc-main/language/lt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -204,3 +203,11 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Serveryje sukurti kanalų grupes automatiškai" + +msgctxt "#30101" +msgid "Setup" +msgstr "Sąrankos" + +msgctxt "#30108" +msgid "Channels" +msgstr "Kanalai" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Macedonian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Macedonian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Macedonian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Macedonian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Macedonian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/mk/)\n" +"Language-Team: Macedonian (http://www.transifex.com/projects/p/xbmc-main/language/mk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -204,3 +203,11 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Автоматски креирај група на канали на сервер" + +msgctxt "#30101" +msgid "Setup" +msgstr "Конфигурација" + +msgctxt "#30108" +msgid "Channels" +msgstr "Канали" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Malay/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Malay/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Malay/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Malay/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,269 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Malay (http://www.transifex.com/projects/p/xbmc-main/language/ms/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "VDR Hostname or IP" +msgstr "Nama hos atau alamat IP VDR" + +msgctxt "#30001" +msgid "VNSI Port" +msgstr "Port VNSI" + +msgctxt "#30002" +msgid "Priority" +msgstr "Keutamaan" + +msgctxt "#30003" +msgid "Character Set Conversion" +msgstr "Penukaran Set Aksara" + +msgctxt "#30004" +msgid "Connect timeout (s)" +msgstr "Had masa tamat sambung" + +msgctxt "#30005" +msgid "Allow VDR Messages" +msgstr "Benarkan Mesej VDR" + +msgctxt "#30006" +msgid "Read recordings from directory" +msgstr "Baca rakaman dari direktori" + +msgctxt "#30007" +msgid "VDR recordings directory" +msgstr "Direktori rakaman VDR" + +msgctxt "#30008" +msgid "Channel search" +msgstr "Gelintar saluran" + +msgctxt "#30009" +msgid "Channel search - Settings" +msgstr "Gelintar saluran - Tetapan" + +msgctxt "#30010" +msgid "Start Channel search" +msgstr "Mulakan gelintar Saluran" + +msgctxt "#30011" +msgid "Source Type" +msgstr "Jenis Sumber" + +msgctxt "#30012" +msgid "TV channels" +msgstr "Saluran TV" + +msgctxt "#30013" +msgid "Radio channels" +msgstr "Saluran radio" + +msgctxt "#30014" +msgid "FTA channels" +msgstr "Saluran FTA" + +msgctxt "#30015" +msgid "Scrambled channels" +msgstr "Saluran terkarau" + +msgctxt "#30016" +msgid "HD channels" +msgstr "Saluran HD" + +msgctxt "#30017" +msgid "Country" +msgstr "Negara" + +msgctxt "#30018" +msgid "Cable Inversion" +msgstr "Songsangan Kabel" + +msgctxt "#30019" +msgid "Cable Symbolrate" +msgstr "Kadar Simbol Kabel" + +msgctxt "#30020" +msgid "Cable modulation" +msgstr "Modulasi Kabel" + +msgctxt "#30021" +msgid "Terr Inversion" +msgstr "Songsangan Terr" + +msgctxt "#30022" +msgid "Satellite" +msgstr "Satelit" + +msgctxt "#30023" +msgid "ATSC Type" +msgstr "Jenis ATSC" + +msgctxt "#30024" +msgid "Back" +msgstr "Undur" + +msgctxt "#30025" +msgid "Channel search - running... %i %%" +msgstr "Gelintar saluran - berjalan... %i %%" + +msgctxt "#30026" +msgid "Type:" +msgstr "Jenis:" + +msgctxt "#30027" +msgid "Device:" +msgstr "Peranti:" + +msgctxt "#30028" +msgid "Scan: %i" +msgstr "Imbas: %i" + +msgctxt "#30029" +msgid "Signal: %i %%" +msgstr "Isyarat: %i %%" + +msgctxt "#30030" +msgid "New channels: %i" +msgstr "Saluran baru: %i" + +msgctxt "#30031" +msgid "All channels: %i" +msgstr "Semua saluran: %i" + +msgctxt "#30032" +msgid "Analog TV" +msgstr "TV analog" + +msgctxt "#30033" +msgid "Analog Radio" +msgstr "Radio analog" + +msgctxt "#30034" +msgid "Transponder:" +msgstr "Transponder:" + +msgctxt "#30035" +msgid "New channels" +msgstr "Saluran baru" + +msgctxt "#30036" +msgid "Channel search - Finished" +msgstr "Gelintar saluran - Selesai" + +msgctxt "#30037" +msgid "No device available - exiting" +msgstr "Tiada peranti tersedia - keluar" + +msgctxt "#30038" +msgid "No DVB-S2 device available - trying fallback to DVB-S" +msgstr "Tiada peranti DVB-S2 tersedia - mencuba jatuh balik ke DVB-5" + +msgctxt "#30039" +msgid "Running" +msgstr "Berjalan" + +msgctxt "#30040" +msgid "Stopped" +msgstr "Berhenti" + +msgctxt "#30041" +msgid "Finished" +msgstr "Selesai" + +msgctxt "#30042" +msgid "Channel search - Canceled" +msgstr "Gelintar saluran - Dibatalkan" + +msgctxt "#30043" +msgid "Channel search - Error" +msgstr "Gelintar saluran - Ralat" + +msgctxt "#30044" +msgid "Lost connection to VDR Server" +msgstr "Sambungan terputus ke Pelayan VDR" + +msgctxt "#30045" +msgid "Connection to VDR Server restored" +msgstr "Sambungan ke Pelayan VDR dipulihkan" + +msgctxt "#30046" +msgid "Create channel groups automatically on the server" +msgstr "Cipta kumpulan saluran secara automatik pada pelayan" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Pinta Anjak Masa" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "OSD VDR" + +msgctxt "#30101" +msgid "Setup" +msgstr "Persediaan" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Pengawalan OSD - tekan maklumat untuk keluar" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Pilih untuk kawal OSD" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Mod Anjak Masa" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Penimbal Anjak Masa (RAM) x100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Penimbal Anjak Masa (Fail) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "Pentadbir VDR" + +msgctxt "#30108" +msgid "Channels" +msgstr "Saluran" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "Senarai putih penyedia" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "Senarai hitam saluran" + +msgctxt "#30111" +msgid "Channel filters" +msgstr "Penapis saluran" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Saluran Radio" + +msgctxt "#30113" +msgid "Save filters" +msgstr "Simpan penapis" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "Penyedia tidak diketahui" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Malayalam/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Malayalam/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Malayalam/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Malayalam/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Malayalam (http://www.transifex.com/projects/p/xbmc-main/language/ml/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ml\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30026" +msgid "Type:" +msgstr "രീതി" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Maltese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Maltese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Maltese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Maltese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Maltese (http://www.transifex.com/projects/p/xbmc-main/language/mt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mt\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);\n" + +msgctxt "#30017" +msgid "Country" +msgstr "Pajjiż" + +msgctxt "#30026" +msgid "Type:" +msgstr "Tip:" + +msgctxt "#30101" +msgid "Setup" +msgstr "Konfigurazzjoni" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Maori/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Maori/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Maori/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Maori/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,41 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Maori (http://www.transifex.com/projects/p/xbmc-main/language/mi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mi\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30012" +msgid "TV channels" +msgstr "Hongere TV" + +msgctxt "#30013" +msgid "Radio channels" +msgstr "Hongere Irirangi" + +msgctxt "#30017" +msgid "Country" +msgstr "Country" + +msgctxt "#30026" +msgid "Type:" +msgstr "Momo:" + +msgctxt "#30039" +msgid "Running" +msgstr "Rere" + +msgctxt "#30108" +msgid "Channels" +msgstr "Ngā hongere" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Norwegian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Norwegian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Norwegian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Norwegian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,34 +1,217 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Norwegian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/no/)\n" +"Language-Team: Norwegian (http://www.transifex.com/projects/p/xbmc-main/language/no/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: no\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "VDR Hostname or IP" +msgstr "VDR Hostname eller IP" + +msgctxt "#30001" +msgid "VNSI Port" +msgstr "VNSI Port" + +msgctxt "#30002" +msgid "Priority" +msgstr "Prioritet" + +msgctxt "#30003" +msgid "Character Set Conversion" +msgstr "Konvertering av tegnsett" + +msgctxt "#30004" +msgid "Connect timeout (s)" +msgstr "Tidsavbrudd ved tilkobling (i s)" + +msgctxt "#30005" +msgid "Allow VDR Messages" +msgstr "Tillat VDR meldinger" + +msgctxt "#30006" +msgid "Read recordings from directory" +msgstr "Les opptak fra mappe" + +msgctxt "#30007" +msgid "VDR recordings directory" +msgstr "Mappe for VDR-opptak" + +msgctxt "#30008" +msgid "Channel search" +msgstr "Kanalsøk" + +msgctxt "#30009" +msgid "Channel search - Settings" +msgstr "Kanalsøk - innstillinger" + +msgctxt "#30010" +msgid "Start Channel search" +msgstr "Start kanalsøk" + +msgctxt "#30011" +msgid "Source Type" +msgstr "Kildetype" + +msgctxt "#30012" +msgid "TV channels" +msgstr "TV-kanaler" + +msgctxt "#30013" +msgid "Radio channels" +msgstr "Radio-kanaler" + +msgctxt "#30014" +msgid "FTA channels" +msgstr "FTA-kanaler" + +msgctxt "#30015" +msgid "Scrambled channels" +msgstr "Krypterte kanaler" + +msgctxt "#30016" +msgid "HD channels" +msgstr "HD-kanaler" + msgctxt "#30017" msgid "Country" msgstr "Land" +msgctxt "#30018" +msgid "Cable Inversion" +msgstr "Kabel-invertering" + +msgctxt "#30019" +msgid "Cable Symbolrate" +msgstr "Kabelens symbolhastighet" + +msgctxt "#30020" +msgid "Cable modulation" +msgstr "Kabelmodulasjon" + +msgctxt "#30021" +msgid "Terr Inversion" +msgstr "Terr-invertering" + +msgctxt "#30022" +msgid "Satellite" +msgstr "Satellitt" + +msgctxt "#30023" +msgid "ATSC Type" +msgstr "ATSC-type" + msgctxt "#30024" msgid "Back" msgstr "Tilbake" +msgctxt "#30025" +msgid "Channel search - running... %i %%" +msgstr "Kanalsøk - utfører... %i %%" + msgctxt "#30026" msgid "Type:" msgstr "Type:" +msgctxt "#30027" +msgid "Device:" +msgstr "Enhet:" + +msgctxt "#30028" +msgid "Scan: %i" +msgstr "Skann: %i" + +msgctxt "#30029" +msgid "Signal: %i %%" +msgstr "Signal: %i %%" + +msgctxt "#30030" +msgid "New channels: %i" +msgstr "Nye kanaler: %i" + +msgctxt "#30031" +msgid "All channels: %i" +msgstr "Alle kanaler: %i" + +msgctxt "#30032" +msgid "Analog TV" +msgstr "Analog TV" + +msgctxt "#30033" +msgid "Analog Radio" +msgstr "Analog Radio" + +msgctxt "#30034" +msgid "Transponder:" +msgstr "Transponder:" + +msgctxt "#30035" +msgid "New channels" +msgstr "Nye kanaler" + +msgctxt "#30036" +msgid "Channel search - Finished" +msgstr "Kanalsøk - fullført" + +msgctxt "#30037" +msgid "No device available - exiting" +msgstr "Ingen enhet tilgjengelig - avslutter" + +msgctxt "#30038" +msgid "No DVB-S2 device available - trying fallback to DVB-S" +msgstr "Ingen DVB-S2 enhet tilgjengelig - faller tilbake til DVB-S" + msgctxt "#30039" msgid "Running" msgstr "Kjører" + +msgctxt "#30040" +msgid "Stopped" +msgstr "Stoppet" + +msgctxt "#30041" +msgid "Finished" +msgstr "Fullført" + +msgctxt "#30042" +msgid "Channel search - Canceled" +msgstr "Kanalsøk - avbrutt" + +msgctxt "#30043" +msgid "Channel search - Error" +msgstr "Kanalsøk - mislyktes" + +msgctxt "#30044" +msgid "Lost connection to VDR Server" +msgstr "Mistet tilkoblingen til VDR-tjeneren" + +msgctxt "#30045" +msgid "Connection to VDR Server restored" +msgstr "Tilkobling til VDR-tjener gjenopprettet" + +msgctxt "#30046" +msgid "Create channel groups automatically on the server" +msgstr "Opprett automatisk kanalgrupper på tjeneren" + +msgctxt "#30101" +msgid "Setup" +msgstr "Konfigurasjon" + +msgctxt "#30108" +msgid "Channels" +msgstr "Kanaler" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Radio Channels" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Ossetic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Ossetic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Ossetic/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Ossetic/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Ossetic (http://www.transifex.com/projects/p/xbmc-main/language/os/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: os\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30026" +msgid "Type:" +msgstr "Хуыз:" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Persian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Persian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Persian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Persian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Persian (http://www.transifex.com/projects/p/xbmc-main/language/fa/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30026" +msgid "Type:" +msgstr "نوع:" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Persian (Iran)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Persian (Iran)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Persian (Iran)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Persian (Iran)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Persian (Iran) (http://www.transifex.com/projects/p/xbmc-main/language/fa_IR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa_IR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30017" +msgid "Country" +msgstr "کشور" + +msgctxt "#30026" +msgid "Type:" +msgstr "نوع:" + +msgctxt "#30101" +msgid "Setup" +msgstr "پیکربندی" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Polish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Polish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Polish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Polish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Polish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pl/)\n" +"Language-Team: Polish (http://www.transifex.com/projects/p/xbmc-main/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -204,3 +203,67 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Utwórz automatycznie grupy kanałów na serwerze" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Zapytaj o funkcję pauzowania" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "menu ekranowe VDR" + +msgctxt "#30101" +msgid "Setup" +msgstr "Setup" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Sterowanie OSD - aby wyjść naciśnij Info " + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Zaznacz aby mieć kontrolę OSD" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Tryb funkcji pauzowania" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Wielkość bufora funkcji pauzowania (RAM) x100 MB " + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Wielkość bufora funkcji pauzowania (Plik) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "Usługa VDR Admin " + +msgctxt "#30108" +msgid "Channels" +msgstr "Kanałów" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "Zaufani dostawcy " + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "Czarna lista kanałów " + +msgctxt "#30111" +msgid "Channel filters" +msgstr "Filtry kanałów " + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Kanały radiowe" + +msgctxt "#30113" +msgid "Save filters" +msgstr "Zapisz filtry" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "Dostawca nieznany" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Portuguese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Portuguese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Portuguese/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Portuguese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Portuguese (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pt/)\n" +"Language-Team: Portuguese (http://www.transifex.com/projects/p/xbmc-main/language/pt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -43,7 +42,7 @@ msgctxt "#30006" msgid "Read recordings from directory" -msgstr "Ler gravações a partir do directório" +msgstr "Ler gravações a partir da pasta" msgctxt "#30007" msgid "VDR recordings directory" @@ -204,3 +203,67 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Criar automaticamente grupos de canais no servidor" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Requisitar Ver Mais Tarde" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "Interface VDR" + +msgctxt "#30101" +msgid "Setup" +msgstr "Configuração" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Controlando interface - premir info para sair" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Seleccione para controlar a interface" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Modo de Ver Mais Tarde" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Buffer de Ver Mais Tarde (RAM) x100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Buffer de Ver Mais Tarde (Ficheiro) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "Admin VDR" + +msgctxt "#30108" +msgid "Channels" +msgstr "Canais" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "Lista de fornecedores permitidos" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "Canais interditos" + +msgctxt "#30111" +msgid "Channel filters" +msgstr "Filtros de canais" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Canais de Rádio" + +msgctxt "#30113" +msgid "Save filters" +msgstr "Guardar filtros" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "Fornecedor Desconhecido" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Portuguese (Brazil)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Portuguese (Brazil)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Portuguese (Brazil)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Portuguese (Brazil)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pt_BR/)\n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/xbmc-main/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -204,3 +203,67 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Criar grupos de canais automaticamente no servidor" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Solicitar gravação" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "OSD VDR" + +msgctxt "#30101" +msgid "Setup" +msgstr "Ajustes" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Controlando OSD - pressione info para sair" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Selecione para controlar OSD" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Modo de gravação" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Buffer de gravação (RAM) x100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Buffer de gravação (arquivo) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "Admin VDR" + +msgctxt "#30108" +msgid "Channels" +msgstr "Canais" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "Provedor Permitido" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "Lista Negra de Canais" + +msgctxt "#30111" +msgid "Channel filters" +msgstr "Filtros de Canais" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Canais de Rádio" + +msgctxt "#30113" +msgid "Save filters" +msgstr "Salvar filtros" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "Provedor desconhecido" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Romanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Romanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Romanian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Romanian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Romanian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ro/)\n" +"Language-Team: Romanian (http://www.transifex.com/projects/p/xbmc-main/language/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -204,3 +203,43 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Creează grupuri canale automat pe server" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Cere programarea timpului de inregistrare" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD" + +msgctxt "#30101" +msgid "Setup" +msgstr "Configurație" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Controlul OSD - apasa info ca pentru iesire" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Selecteaza ca sa controlezi OSD" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Modul de programare inregistrare" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Tamponul programarii temporare (RAM) x 100MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Tamponul programarii temporare (fisier) x 1GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "Programare VDR" + +msgctxt "#30108" +msgid "Channels" +msgstr "Canale" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Russian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Russian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Russian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Russian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Russian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ru/)\n" +"Language-Team: Russian (http://www.transifex.com/projects/p/xbmc-main/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -204,3 +203,67 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Автоматически создать на сервере группы каналов" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Запросить сдвиг времени" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "Экранное меню VDR" + +msgctxt "#30101" +msgid "Setup" +msgstr "Настройка" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Контролируется OSD - нажмите Информация для выхода" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Выберите для контроля OSD" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Режим сдвига времени" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Буфер сдвига времени (RAM) x100 МБ" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Буфер сдвига времени (Файл) x1 ГБ" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "Администратор VDR" + +msgctxt "#30108" +msgid "Channels" +msgstr "Каналы" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "Белый лист провайдеров" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "Черный список канала" + +msgctxt "#30111" +msgid "Channel filters" +msgstr "Фильтр канала" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Радиостанции" + +msgctxt "#30113" +msgid "Save filters" +msgstr "Сохранить фильтры" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "Неизвестный провайдер" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Serbian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Serbian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Serbian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Serbian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,25 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Serbian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sr/)\n" +"Language-Team: Serbian (http://www.transifex.com/projects/p/xbmc-main/language/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +msgctxt "#30004" +msgid "Connect timeout (s)" +msgstr "Истек времена за повезивање (с)" + msgctxt "#30017" msgid "Country" msgstr "Država" @@ -28,3 +31,7 @@ msgctxt "#30039" msgid "Running" msgstr "Pokretanje" + +msgctxt "#30101" +msgid "Setup" +msgstr "Konfiguracija" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Serbian (Cyrillic)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Serbian (Cyrillic)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Serbian (Cyrillic)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Serbian (Cyrillic)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Serbian (Cyrillic) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sr_RS/)\n" +"Language-Team: Serbian (Cyrillic) (http://www.transifex.com/projects/p/xbmc-main/language/sr_RS/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -28,3 +27,7 @@ msgctxt "#30039" msgid "Running" msgstr "Покретање" + +msgctxt "#30101" +msgid "Setup" +msgstr "Конфигурација" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Slovak/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Slovak/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Slovak/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Slovak/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Slovak (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sk/)\n" +"Language-Team: Slovak (http://www.transifex.com/projects/p/xbmc-main/language/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -204,3 +203,43 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Automaticky vytvárať skupiny kanálov na serveri" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Vyžadovať časový posun" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD" + +msgctxt "#30101" +msgid "Setup" +msgstr "Konfigurácia" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Ovládanie OSD - stlačte info pre ukončenie" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Vyberte ovládanie OSD" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Režim časového posunu" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Zásobník časového posunu (RAM) x100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Zásobník časového posunu (Súbor) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "VDR Admin" + +msgctxt "#30108" +msgid "Channels" +msgstr "Kanály" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Slovenian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Slovenian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Slovenian/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Slovenian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Slovenian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sl/)\n" +"Language-Team: Slovenian (http://www.transifex.com/projects/p/xbmc-main/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -35,7 +34,7 @@ msgctxt "#30004" msgid "Connect timeout (s)" -msgstr "Najdaljši dovoljeni čas povezave (s)" +msgstr "Časovni pretek povezave (s)" msgctxt "#30005" msgid "Allow VDR Messages" @@ -119,7 +118,7 @@ msgctxt "#30025" msgid "Channel search - running... %i %%" -msgstr "Iskanje programov - teče... %i %%" +msgstr "Iskanje programov - teče ... %i %%" msgctxt "#30026" msgid "Type:" @@ -195,12 +194,76 @@ msgctxt "#30044" msgid "Lost connection to VDR Server" -msgstr "Izgubljena povezava s strežnikom VDR" +msgstr "Povezava s strežnikom VDR je bila izgubljena" msgctxt "#30045" msgid "Connection to VDR Server restored" -msgstr "Obnovljena povezava s strežnikom VDR" +msgstr "Povezava s strežnikom VDR je obnovljena" msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Samodejno ustvari skupine programov na strežniku" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Zahtevaj časovni zamik" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD" + +msgctxt "#30101" +msgid "Setup" +msgstr "Nastavitve" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Upravljanje OSD - pritisnite info za izhod" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Izberite za upravljanje OSD" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Način časovnega zamika" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Medpomnenje časovnega zamika (RAM) x100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Medpomnenje časovnega zamika (datoteka) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "VDR Admin" + +msgctxt "#30108" +msgid "Channels" +msgstr "Programi" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "Dovoljeni ponudniki" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "Onemogočeni programi" + +msgctxt "#30111" +msgid "Channel filters" +msgstr "Filtri programov" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Radijski programi" + +msgctxt "#30113" +msgid "Save filters" +msgstr "Shrani filtre" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "Neznan ponudnik" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Spanish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Spanish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Spanish/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Spanish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es/)\n" +"Language-Team: Spanish (http://www.transifex.com/projects/p/xbmc-main/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -204,3 +203,67 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Crear grupos de canales de forma automática en el servidor" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Requerir TimeShift" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD" + +msgctxt "#30101" +msgid "Setup" +msgstr "Ajustes" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Controlando OSD, pulsa info para salir" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Seleccionar para controlar OSD" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Modo TimeShift" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Buffer Timeshift (RAM) x100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Buffer Timeshift Buffer (Archivo) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "Administrador VDR" + +msgctxt "#30108" +msgid "Channels" +msgstr "Canales" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "Lista blanca de proveedores" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "Lista negra de canales " + +msgctxt "#30111" +msgid "Channel filters" +msgstr "Filtro de canales" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Canales de radio" + +msgctxt "#30113" +msgid "Save filters" +msgstr "Filtros guardados" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "Proveedor Desconocido" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Spanish (Argentina)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Spanish (Argentina)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Spanish (Argentina)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Spanish (Argentina)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es_AR/)\n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/xbmc-main/language/es_AR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -204,3 +203,43 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Crear grupos de canales de forma automática en el servidor" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Solicitar Timeshift" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD" + +msgctxt "#30101" +msgid "Setup" +msgstr "Configuración" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Controlando OSC - presione info para salir" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Seleccionar para controlar OSD" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Modo Timeshift" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Buffer de Timeshift (RAM) x100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Buffer de Timeshift (Archivo) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "Administrar VDR" + +msgctxt "#30108" +msgid "Channels" +msgstr "Canales" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Spanish (Mexico)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Spanish (Mexico)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Spanish (Mexico)/strings.po 2013-02-16 21:46:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Spanish (Mexico)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es_MX/)\n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/xbmc-main/language/es_MX/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -40,3 +39,11 @@ msgctxt "#30039" msgid "Running" msgstr "Ejecutando" + +msgctxt "#30101" +msgid "Setup" +msgstr "Configuración" + +msgctxt "#30108" +msgid "Channels" +msgstr "Canales" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Swedish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Swedish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Swedish/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Swedish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Swedish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sv/)\n" +"Language-Team: Swedish (http://www.transifex.com/projects/p/xbmc-main/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -204,3 +203,67 @@ msgctxt "#30046" msgid "Create channel groups automatically on the server" msgstr "Skapa kanalgrupper automatiskt på servern" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Begär Timeshift" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD" + +msgctxt "#30101" +msgid "Setup" +msgstr "Installation" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Kontrollerar OSD - tryck info för att avsluta" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Välj för att kontrollera OSD" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Timeshift Läge" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Timeshift Buffert (RAM) x100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Timeshift Buffert (Fil) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "VDR Admin" + +msgctxt "#30108" +msgid "Channels" +msgstr "Kanaler" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "Vitlista för leverantörer" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "Svartlista för kanaler" + +msgctxt "#30111" +msgid "Channel filters" +msgstr "Kanalfilter" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Radiokanaler" + +msgctxt "#30113" +msgid "Save filters" +msgstr "Spara filter" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "Okänd leverantör" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Tajik/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Tajik/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Tajik/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Tajik/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,41 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Tajik (http://www.transifex.com/projects/p/xbmc-main/language/tg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30012" +msgid "TV channels" +msgstr "Шабакаҳои ТВ" + +msgctxt "#30013" +msgid "Radio channels" +msgstr "Мавҷҳои радиоӣ" + +msgctxt "#30017" +msgid "Country" +msgstr "Кишвар" + +msgctxt "#30026" +msgid "Type:" +msgstr "Навъ:" + +msgctxt "#30039" +msgid "Running" +msgstr "Иҷро шуда истодааст…" + +msgctxt "#30108" +msgid "Channels" +msgstr "Шабакаҳо" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Tamil (India)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Tamil (India)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Tamil (India)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Tamil (India)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,245 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Tamil (India) (http://www.transifex.com/projects/p/xbmc-main/language/ta_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "VDR Hostname or IP" +msgstr "VDR பின்தள புரவலன் பெயர் அல்லது ஐபி" + +msgctxt "#30001" +msgid "VNSI Port" +msgstr "VNSI துறை" + +msgctxt "#30002" +msgid "Priority" +msgstr "முதன்மை" + +msgctxt "#30003" +msgid "Character Set Conversion" +msgstr "எழுத்துக்கணம் மாற்றுதல்" + +msgctxt "#30004" +msgid "Connect timeout (s)" +msgstr "இணைப்பு காலாவதி (நொடி)" + +msgctxt "#30005" +msgid "Allow VDR Messages" +msgstr "VDR செய்திகள் அனுமதி" + +msgctxt "#30006" +msgid "Read recordings from directory" +msgstr "கோப்புறையில் இருந்து பதிவுகளை வாசி" + +msgctxt "#30007" +msgid "VDR recordings directory" +msgstr "VDR பதிவகள் கோப்புறை" + +msgctxt "#30008" +msgid "Channel search" +msgstr "சேனல் தேடுதல்" + +msgctxt "#30009" +msgid "Channel search - Settings" +msgstr "சேனல் தேடுதல் - அமைப்புகள்" + +msgctxt "#30010" +msgid "Start Channel search" +msgstr "சேனல் தேடுதல் ஆரம்பி" + +msgctxt "#30011" +msgid "Source Type" +msgstr "மூல வகை" + +msgctxt "#30012" +msgid "TV channels" +msgstr "TV சேனல்கள்" + +msgctxt "#30013" +msgid "Radio channels" +msgstr "வானொலி சேனல்கள்" + +msgctxt "#30014" +msgid "FTA channels" +msgstr "FTA சேனல்கள்" + +msgctxt "#30015" +msgid "Scrambled channels" +msgstr "சேனல்கள்" + +msgctxt "#30016" +msgid "HD channels" +msgstr "HD சேனல்கள்" + +msgctxt "#30017" +msgid "Country" +msgstr "நாடு" + +msgctxt "#30018" +msgid "Cable Inversion" +msgstr "எதிர்மறை கம்பி" + +msgctxt "#30019" +msgid "Cable Symbolrate" +msgstr "கம்பி குறியீட்டு விகிதம்" + +msgctxt "#30020" +msgid "Cable modulation" +msgstr "கம்பி குறிப்பேற்றம்" + +msgctxt "#30021" +msgid "Terr Inversion" +msgstr "எதிர்மறை Terr" + +msgctxt "#30022" +msgid "Satellite" +msgstr "துணைக்கோள்" + +msgctxt "#30023" +msgid "ATSC Type" +msgstr "ATSC வகை" + +msgctxt "#30024" +msgid "Back" +msgstr "பின்செல்" + +msgctxt "#30025" +msgid "Channel search - running... %i %%" +msgstr "சேனல் தேடுதல் - ஓடிக்கொண்டிருக்கிறது... %i %%" + +msgctxt "#30026" +msgid "Type:" +msgstr "வகை:" + +msgctxt "#30027" +msgid "Device:" +msgstr "சாதனம்:" + +msgctxt "#30028" +msgid "Scan: %i" +msgstr "தேடல்: %i" + +msgctxt "#30029" +msgid "Signal: %i %%" +msgstr "சமிக்கை: %i %%" + +msgctxt "#30030" +msgid "New channels: %i" +msgstr "புதிய சேனல்கள்: %i" + +msgctxt "#30031" +msgid "All channels: %i" +msgstr "அனைத்து சேனல்கள்: %i" + +msgctxt "#30032" +msgid "Analog TV" +msgstr "தொடர்முறை தொலைக்காட்சி" + +msgctxt "#30033" +msgid "Analog Radio" +msgstr "தொடர்முறை வானொலி" + +msgctxt "#30034" +msgid "Transponder:" +msgstr "அலைவாங்கி:" + +msgctxt "#30035" +msgid "New channels" +msgstr "புதிய சேனல்கள்" + +msgctxt "#30036" +msgid "Channel search - Finished" +msgstr "சேனல் தேடுதல் - முடிக்கப்பட்டது" + +msgctxt "#30037" +msgid "No device available - exiting" +msgstr "எந்த சாதனமும் கிடைக்கவில்லை - வெளியேறுகிறது" + +msgctxt "#30038" +msgid "No DVB-S2 device available - trying fallback to DVB-S" +msgstr "DVB-S2 சாதனம் இல்லை - DVB-S சாதனத்திருக்கு முயற்சி" + +msgctxt "#30039" +msgid "Running" +msgstr "ஓடிகொண்டிருக்கிறது" + +msgctxt "#30040" +msgid "Stopped" +msgstr "நிறுத்திவிட்டது" + +msgctxt "#30041" +msgid "Finished" +msgstr "முடித்துவிட்டது" + +msgctxt "#30042" +msgid "Channel search - Canceled" +msgstr "சேனல் தேடல் - ரத்து செய்யப்பட்டது" + +msgctxt "#30043" +msgid "Channel search - Error" +msgstr "சேனல் தேடல் - பிழை" + +msgctxt "#30044" +msgid "Lost connection to VDR Server" +msgstr "VDR சேவையகம் இடையே இணைப்பு துண்டிக்கப்பட்டது" + +msgctxt "#30045" +msgid "Connection to VDR Server restored" +msgstr "VDR சேவையகம் மீண்டும் இணைக்கப்பட்டுள்ளது" + +msgctxt "#30046" +msgid "Create channel groups automatically on the server" +msgstr "சேனல் குழுக்களை தானாகவே சேவையகத்தில் உருவாக்கு" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "நேரமாற்றம் கோரிக்கை" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD" + +msgctxt "#30101" +msgid "Setup" +msgstr "அமைப்பு" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "OSD கட்டுப்படுத்தும் - வெளியேற தகவல் பொத்தானை அழுத்தவும்" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "OSD கட்டுப்படுத்த தேர்வு பொத்தானை அழுத்தவும்" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "நேரமாற்றம் முறை" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "நேரமாற்றம் இடையகம் (RAM) x100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "நேரமாற்றம் இடையகம் (File) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "VDR நிர்வாகம்" + +msgctxt "#30108" +msgid "Channels" +msgstr "சேனல்கள்" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Telugu/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Telugu/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Telugu/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Telugu/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Telugu (http://www.transifex.com/projects/p/xbmc-main/language/te/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: te\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30017" +msgid "Country" +msgstr "దేశం" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Thai/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Thai/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Thai/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Thai/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Thai (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/th/)\n" +"Language-Team: Thai (http://www.transifex.com/projects/p/xbmc-main/language/th/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -40,3 +39,11 @@ msgctxt "#30039" msgid "Running" msgstr "กำลังดำเนินการ" + +msgctxt "#30101" +msgid "Setup" +msgstr "ตั้งค่า" + +msgctxt "#30108" +msgid "Channels" +msgstr "ช่องสัญญาณ" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Turkish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Turkish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Turkish/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Turkish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,53 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Turkish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/tr/)\n" +"Language-Team: Turkish (http://www.transifex.com/projects/p/xbmc-main/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=1; plural=0;\n" +msgctxt "#30001" +msgid "VNSI Port" +msgstr "VNSI Portu" + +msgctxt "#30002" +msgid "Priority" +msgstr "Öncelik" + +msgctxt "#30004" +msgid "Connect timeout (s)" +msgstr "Bağlantı süresi doldu (s)" + +msgctxt "#30005" +msgid "Allow VDR Messages" +msgstr "VDR İletilerine İzin Ver" + +msgctxt "#30007" +msgid "VDR recordings directory" +msgstr "VDR kayıtları dizini" + +msgctxt "#30008" +msgid "Channel search" +msgstr "Kanal arama" + +msgctxt "#30009" +msgid "Channel search - Settings" +msgstr "Kanal arama - Ayarlar" + +msgctxt "#30010" +msgid "Start Channel search" +msgstr "Kanal aramayı başlat" + msgctxt "#30012" msgid "TV channels" msgstr "TV kanalları" @@ -25,10 +56,26 @@ msgid "Radio channels" msgstr "Radyo kanalları" +msgctxt "#30014" +msgid "FTA channels" +msgstr "FTA kanalları" + +msgctxt "#30016" +msgid "HD channels" +msgstr "HD kanallar" + msgctxt "#30017" msgid "Country" msgstr "Ülke" +msgctxt "#30022" +msgid "Satellite" +msgstr "Uydu" + +msgctxt "#30023" +msgid "ATSC Type" +msgstr "ATSC Tipi" + msgctxt "#30024" msgid "Back" msgstr "Geri" @@ -37,6 +84,74 @@ msgid "Type:" msgstr "Tür:" +msgctxt "#30027" +msgid "Device:" +msgstr "Aygıt:" + +msgctxt "#30028" +msgid "Scan: %i" +msgstr "Tara: %i" + +msgctxt "#30029" +msgid "Signal: %i %%" +msgstr "Sinyal: %i %%" + +msgctxt "#30030" +msgid "New channels: %i" +msgstr "Yeni kanallar: %i" + +msgctxt "#30031" +msgid "All channels: %i" +msgstr "Tüm kanallar: %i" + +msgctxt "#30032" +msgid "Analog TV" +msgstr "Analog TV" + +msgctxt "#30033" +msgid "Analog Radio" +msgstr "Analog Radyo" + +msgctxt "#30035" +msgid "New channels" +msgstr "Yeni kanallar" + +msgctxt "#30036" +msgid "Channel search - Finished" +msgstr "Kanal araması - Tamamlandı" + msgctxt "#30039" msgid "Running" msgstr "Çalışıyor" + +msgctxt "#30040" +msgid "Stopped" +msgstr "Durduruldu" + +msgctxt "#30041" +msgid "Finished" +msgstr "Tamamlandı" + +msgctxt "#30042" +msgid "Channel search - Canceled" +msgstr "Kanal araması - İptal Edidi" + +msgctxt "#30043" +msgid "Channel search - Error" +msgstr "Kanal araması - Hata" + +msgctxt "#30044" +msgid "Lost connection to VDR Server" +msgstr "VDR Sunucusun bağlantısı kaybedildi" + +msgctxt "#30101" +msgid "Setup" +msgstr "Yapılandırma" + +msgctxt "#30108" +msgid "Channels" +msgstr "Kanallar" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Radyo Kanalları" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Ukrainian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Ukrainian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Ukrainian/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Ukrainian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,30 +1,225 @@ # XBMC Media Center language file # Addon Name: VDR VNSI Client # Addon id: pvr.vdr.vnsi -# Addon version: 1.6.4 # Addon Provider: FernetMenta, Team XBMC msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Ukrainian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/uk/)\n" +"Language-Team: Ukrainian (http://www.transifex.com/projects/p/xbmc-main/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +msgctxt "#30000" +msgid "VDR Hostname or IP" +msgstr "IP сервера VDR або його назва" + +msgctxt "#30001" +msgid "VNSI Port" +msgstr "Порт VNSI" + +msgctxt "#30002" +msgid "Priority" +msgstr "Пріоритет" + +msgctxt "#30003" +msgid "Character Set Conversion" +msgstr "Налаштування конвертування символів" + +msgctxt "#30004" +msgid "Connect timeout (s)" +msgstr "Затримка зв’язку (с) " + +msgctxt "#30005" +msgid "Allow VDR Messages" +msgstr "Дозволити повідомлення VDR" + +msgctxt "#30006" +msgid "Read recordings from directory" +msgstr "Читати записи з теки" + +msgctxt "#30007" +msgid "VDR recordings directory" +msgstr "Тека записів VDR" + +msgctxt "#30008" +msgid "Channel search" +msgstr "Пошук каналів" + +msgctxt "#30009" +msgid "Channel search - Settings" +msgstr "Пошук каналів - Налаштування" + +msgctxt "#30010" +msgid "Start Channel search" +msgstr "Почати пошук каналів" + +msgctxt "#30011" +msgid "Source Type" +msgstr "Тип джерела" + +msgctxt "#30012" +msgid "TV channels" +msgstr "Телевізійні канали" + +msgctxt "#30013" +msgid "Radio channels" +msgstr "Радіо канали" + +msgctxt "#30014" +msgid "FTA channels" +msgstr "Безплатні канали" + +msgctxt "#30015" +msgid "Scrambled channels" +msgstr "Зашифровані канали" + +msgctxt "#30016" +msgid "HD channels" +msgstr "HD канали" + msgctxt "#30017" msgid "Country" msgstr "Країна" +msgctxt "#30018" +msgid "Cable Inversion" +msgstr "Кабельне - Інверсія" + +msgctxt "#30019" +msgid "Cable Symbolrate" +msgstr "Кабельне - символьна швидкість" + +msgctxt "#30020" +msgid "Cable modulation" +msgstr "Кабельне - модуляція" + +msgctxt "#30021" +msgid "Terr Inversion" +msgstr "Наземне - інверсія " + +msgctxt "#30022" +msgid "Satellite" +msgstr "Супутник" + +msgctxt "#30023" +msgid "ATSC Type" +msgstr "Тип ATSC" + +msgctxt "#30024" +msgid "Back" +msgstr "Назад" + +msgctxt "#30025" +msgid "Channel search - running... %i %%" +msgstr "Пошук каналів - запущено... %i %%" + msgctxt "#30026" msgid "Type:" msgstr "Тип:" +msgctxt "#30027" +msgid "Device:" +msgstr "Пристрій:" + +msgctxt "#30028" +msgid "Scan: %i" +msgstr "Сканування: %i" + +msgctxt "#30029" +msgid "Signal: %i %%" +msgstr "Сигнал: %i %%" + +msgctxt "#30030" +msgid "New channels: %i" +msgstr "Нові канали: %i" + +msgctxt "#30031" +msgid "All channels: %i" +msgstr "Всі канали: %i" + +msgctxt "#30032" +msgid "Analog TV" +msgstr "Аналогове телебачення" + +msgctxt "#30033" +msgid "Analog Radio" +msgstr "Аналогове радіо" + +msgctxt "#30034" +msgid "Transponder:" +msgstr "Транспондер:" + +msgctxt "#30035" +msgid "New channels" +msgstr "Нові канали" + +msgctxt "#30036" +msgid "Channel search - Finished" +msgstr "Пошук каналів - Закінчено" + +msgctxt "#30037" +msgid "No device available - exiting" +msgstr "Немає доступного пристрою - вихід" + +msgctxt "#30038" +msgid "No DVB-S2 device available - trying fallback to DVB-S" +msgstr "Немає доступного пристрою DVB-S2 - намагаюся повернутися до DVB-S" + msgctxt "#30039" msgid "Running" msgstr "Запуск…" + +msgctxt "#30040" +msgid "Stopped" +msgstr "Зупинено" + +msgctxt "#30041" +msgid "Finished" +msgstr "Завершено" + +msgctxt "#30042" +msgid "Channel search - Canceled" +msgstr "Пошук каналів - Скасовано" + +msgctxt "#30043" +msgid "Channel search - Error" +msgstr "Пошук каналів - Помилка" + +msgctxt "#30044" +msgid "Lost connection to VDR Server" +msgstr "Втрачено зв’язок з сервером VDR" + +msgctxt "#30045" +msgid "Connection to VDR Server restored" +msgstr "Зв’язок з VDR сервером відновлено" + +msgctxt "#30046" +msgid "Create channel groups automatically on the server" +msgstr "Створити групи каналів автоматично на сервері" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr "VDR OSD" + +msgctxt "#30101" +msgid "Setup" +msgstr "Налаштування" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Контроль OSD - натисніть Info для виходу" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "VDR Admin" + +msgctxt "#30108" +msgid "Channels" +msgstr "Канали" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Uzbek/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Uzbek/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Uzbek/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Uzbek/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Uzbek (http://www.transifex.com/projects/p/xbmc-main/language/uz/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uz\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30017" +msgid "Country" +msgstr "Davlat" + +msgctxt "#30026" +msgid "Type:" +msgstr "Turi:" + +msgctxt "#30108" +msgid "Channels" +msgstr "Kanallar" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Vietnamese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Vietnamese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Vietnamese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Vietnamese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,209 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Vietnamese (http://www.transifex.com/projects/p/xbmc-main/language/vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "VDR Hostname or IP" +msgstr "Tên miền hoặc IP VDR" + +msgctxt "#30001" +msgid "VNSI Port" +msgstr "Cổng VNSI" + +msgctxt "#30002" +msgid "Priority" +msgstr "Mức quan trọng" + +msgctxt "#30003" +msgid "Character Set Conversion" +msgstr "Chuyển đổi bộ ký tự" + +msgctxt "#30004" +msgid "Connect timeout (s)" +msgstr "Thời gian chờ kết nối (s)" + +msgctxt "#30005" +msgid "Allow VDR Messages" +msgstr "Cho phép các thông điệp VDR" + +msgctxt "#30006" +msgid "Read recordings from directory" +msgstr "Đọc các bản thu từ thư mục" + +msgctxt "#30007" +msgid "VDR recordings directory" +msgstr "Thư mục lưu chương trình thu VDR" + +msgctxt "#30008" +msgid "Channel search" +msgstr "Tìm kênh" + +msgctxt "#30009" +msgid "Channel search - Settings" +msgstr "Dò kênh - Cài đặt" + +msgctxt "#30010" +msgid "Start Channel search" +msgstr "Bắt đầu dò kênh" + +msgctxt "#30011" +msgid "Source Type" +msgstr "Kiểu nguồn" + +msgctxt "#30012" +msgid "TV channels" +msgstr "Kênh TV" + +msgctxt "#30013" +msgid "Radio channels" +msgstr "Kênh Radio" + +msgctxt "#30014" +msgid "FTA channels" +msgstr "Kênh FTA" + +msgctxt "#30015" +msgid "Scrambled channels" +msgstr "Kênh mã hoá" + +msgctxt "#30016" +msgid "HD channels" +msgstr "Kênh HD" + +msgctxt "#30017" +msgid "Country" +msgstr "Quốc gia" + +msgctxt "#30018" +msgid "Cable Inversion" +msgstr "Đảo cáp" + +msgctxt "#30019" +msgid "Cable Symbolrate" +msgstr "Cable Symbolrate" + +msgctxt "#30020" +msgid "Cable modulation" +msgstr "Điều biến cáp" + +msgctxt "#30021" +msgid "Terr Inversion" +msgstr "Đảo Terr" + +msgctxt "#30022" +msgid "Satellite" +msgstr "Vệ tinh" + +msgctxt "#30023" +msgid "ATSC Type" +msgstr "Kiểu ATSC" + +msgctxt "#30024" +msgid "Back" +msgstr "Lùi" + +msgctxt "#30025" +msgid "Channel search - running... %i %%" +msgstr "Dò kênh - Đang chạy... %i %%" + +msgctxt "#30026" +msgid "Type:" +msgstr "Thể loại" + +msgctxt "#30027" +msgid "Device:" +msgstr "Thiết bị:" + +msgctxt "#30028" +msgid "Scan: %i" +msgstr "Quét: %i" + +msgctxt "#30029" +msgid "Signal: %i %%" +msgstr "Tín hiêu: %i %%" + +msgctxt "#30030" +msgid "New channels: %i" +msgstr "Kênh mới: %i" + +msgctxt "#30031" +msgid "All channels: %i" +msgstr "Tất cả kênh: %i" + +msgctxt "#30032" +msgid "Analog TV" +msgstr "TV analog" + +msgctxt "#30033" +msgid "Analog Radio" +msgstr "Radio analog" + +msgctxt "#30034" +msgid "Transponder:" +msgstr "Bộ tiếp sóng:" + +msgctxt "#30035" +msgid "New channels" +msgstr "Kênh mới" + +msgctxt "#30036" +msgid "Channel search - Finished" +msgstr "Dò kênh - Đã xong" + +msgctxt "#30037" +msgid "No device available - exiting" +msgstr "Thiết bị không dùng được hoặc không tồn tại" + +msgctxt "#30038" +msgid "No DVB-S2 device available - trying fallback to DVB-S" +msgstr "Không có thiết bị DVB-S2 - đang thử lại với DVB-S" + +msgctxt "#30039" +msgid "Running" +msgstr "Đang chạy" + +msgctxt "#30040" +msgid "Stopped" +msgstr "Đã dừng" + +msgctxt "#30041" +msgid "Finished" +msgstr "Đã xong" + +msgctxt "#30042" +msgid "Channel search - Canceled" +msgstr "Dò kênh - Đã hủy" + +msgctxt "#30043" +msgid "Channel search - Error" +msgstr "Dò kênh - Lỗi" + +msgctxt "#30044" +msgid "Lost connection to VDR Server" +msgstr "Mất kết nối tới máy chủ VDR" + +msgctxt "#30045" +msgid "Connection to VDR Server restored" +msgstr "Đã khôi phục lại kết nối tới máy chủ VDR" + +msgctxt "#30046" +msgid "Create channel groups automatically on the server" +msgstr "Tạo các nhóm kênh tự động trên máy chủ" + +msgctxt "#30108" +msgid "Channels" +msgstr "Kênh" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Vietnamese (Viet Nam)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Vietnamese (Viet Nam)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Vietnamese (Viet Nam)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Vietnamese (Viet Nam)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/projects/p/xbmc-main/language/vi_VN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi_VN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30024" +msgid "Back" +msgstr "Quay lại" + +msgctxt "#30026" +msgid "Type:" +msgstr "Loại:" + +msgctxt "#30108" +msgid "Channels" +msgstr "Kênh" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Welsh/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Welsh/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/language/Welsh/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/language/Welsh/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,269 @@ +# XBMC Media Center language file +# Addon Name: VDR VNSI Client +# Addon id: pvr.vdr.vnsi +# Addon Provider: FernetMenta, Team XBMC +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Welsh (http://www.transifex.com/projects/p/xbmc-main/language/cy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" + +msgctxt "#30000" +msgid "VDR Hostname or IP" +msgstr "Enw gwesteiwr neu gyfeiriad IP VDR" + +msgctxt "#30001" +msgid "VNSI Port" +msgstr "Porth VNSI" + +msgctxt "#30002" +msgid "Priority" +msgstr "Blaenoriaeth:" + +msgctxt "#30003" +msgid "Character Set Conversion" +msgstr "Trosi'r Set Nod" + +msgctxt "#30004" +msgid "Connect timeout (s)" +msgstr "Amser allan cysylltu (e)" + +msgctxt "#30005" +msgid "Allow VDR Messages" +msgstr "Caniatáu Negeseuon VDR" + +msgctxt "#30006" +msgid "Read recordings from directory" +msgstr "Darllen recordiadau o gyferiadur" + +msgctxt "#30007" +msgid "VDR recordings directory" +msgstr "Cyfeiriadur recordiadau VDR" + +msgctxt "#30008" +msgid "Channel search" +msgstr "Chwilio sianeli" + +msgctxt "#30009" +msgid "Channel search - Settings" +msgstr "Chwilio sianeli - Gosodiadau" + +msgctxt "#30010" +msgid "Start Channel search" +msgstr "Cychwyn chwilio Sianeli" + +msgctxt "#30011" +msgid "Source Type" +msgstr "Math Ffynhonnell" + +msgctxt "#30012" +msgid "TV channels" +msgstr "Sianeli teledu" + +msgctxt "#30013" +msgid "Radio channels" +msgstr "Sianeli radio" + +msgctxt "#30014" +msgid "FTA channels" +msgstr "Sianeli Rhydd" + +msgctxt "#30015" +msgid "Scrambled channels" +msgstr "Sianeli caeëdig" + +msgctxt "#30016" +msgid "HD channels" +msgstr "Sianeli Clir" + +msgctxt "#30017" +msgid "Country" +msgstr "Gwlad" + +msgctxt "#30018" +msgid "Cable Inversion" +msgstr "Gwrthdroad Cebl" + +msgctxt "#30019" +msgid "Cable Symbolrate" +msgstr "Graddfa Symbol Cebl" + +msgctxt "#30020" +msgid "Cable modulation" +msgstr "Modyliad cebl" + +msgctxt "#30021" +msgid "Terr Inversion" +msgstr "Gwthdroad Terr" + +msgctxt "#30022" +msgid "Satellite" +msgstr "Lloeren" + +msgctxt "#30023" +msgid "ATSC Type" +msgstr "Math ATSC" + +msgctxt "#30024" +msgid "Back" +msgstr "Nôl" + +msgctxt "#30025" +msgid "Channel search - running... %i %%" +msgstr "Chwilio sianeli - rhedeg %i %%" + +msgctxt "#30026" +msgid "Type:" +msgstr "Math:" + +msgctxt "#30027" +msgid "Device:" +msgstr "Dyfeisiau:" + +msgctxt "#30028" +msgid "Scan: %i" +msgstr "Sgan: %i" + +msgctxt "#30029" +msgid "Signal: %i %%" +msgstr "Signal: %i %%" + +msgctxt "#30030" +msgid "New channels: %i" +msgstr "Sianeli newydd: %i" + +msgctxt "#30031" +msgid "All channels: %i" +msgstr "Pob sianel: %i" + +msgctxt "#30032" +msgid "Analog TV" +msgstr "Teledu Analog" + +msgctxt "#30033" +msgid "Analog Radio" +msgstr "Radio Analog" + +msgctxt "#30034" +msgid "Transponder:" +msgstr "Trawspondydd:" + +msgctxt "#30035" +msgid "New channels" +msgstr "Sianeli newydd" + +msgctxt "#30036" +msgid "Channel search - Finished" +msgstr "Chwilio sianel - Wedi gorffen" + +msgctxt "#30037" +msgid "No device available - exiting" +msgstr "Dim dyfais ar gael - gadael" + +msgctxt "#30038" +msgid "No DVB-S2 device available - trying fallback to DVB-S" +msgstr "Dim dyfais DVB-S2 ar gael - ceisio mynd yn ôl i DVB-S" + +msgctxt "#30039" +msgid "Running" +msgstr "Rhedeg" + +msgctxt "#30040" +msgid "Stopped" +msgstr "Ataliwyd" + +msgctxt "#30041" +msgid "Finished" +msgstr "Gorffennwyd" + +msgctxt "#30042" +msgid "Channel search - Canceled" +msgstr "Chwilio sianeli - Diddymwyd" + +msgctxt "#30043" +msgid "Channel search - Error" +msgstr "Chwilio sianel - Gwall" + +msgctxt "#30044" +msgid "Lost connection to VDR Server" +msgstr "Collwyd y cysylltiad â'r Gweinydd VDR" + +msgctxt "#30045" +msgid "Connection to VDR Server restored" +msgstr "Cysylltiad â'r Gweinydd VDR wedi ei adfer" + +msgctxt "#30046" +msgid "Create channel groups automatically on the server" +msgstr "Creu grwpiau sianel yn awtomatig ar y gweinydd" + +msgctxt "#30047" +msgid "Request Timeshift" +msgstr "Gofyn am Sy,mud Amser" + +msgctxt "#30100" +msgid "VDR OSD" +msgstr " OSD VDR" + +msgctxt "#30101" +msgid "Setup" +msgstr "Gosod" + +msgctxt "#30102" +msgid "Controlling OSD - press info to exit" +msgstr "Rheoli OSD - pwyso gwyb i adael" + +msgctxt "#30103" +msgid "Select to control OSD" +msgstr "Dewis i reoli'r OSD" + +msgctxt "#30104" +msgid "Timeshift Mode" +msgstr "Modd Symud Amser" + +msgctxt "#30105" +msgid "Timeshift Buffer (RAM) x100 MB" +msgstr "Byffer Symud Amser(RAM) x100 MB" + +msgctxt "#30106" +msgid "Timeshift Buffer (File) x1 GB" +msgstr "Byffer Symud Amser (File) x1 GB" + +msgctxt "#30107" +msgid "VDR Admin" +msgstr "Gweinyddiaeth VDR" + +msgctxt "#30108" +msgid "Channels" +msgstr "Sianeli" + +msgctxt "#30109" +msgid "Provider whitelist" +msgstr "Rhestr wen darparwr" + +msgctxt "#30110" +msgid "Channel blacklist" +msgstr "Rhestr ddu sianel" + +msgctxt "#30111" +msgid "Channel filters" +msgstr "Hidlau sianel" + +msgctxt "#30112" +msgid "Radio Channels" +msgstr "Sianeli radio" + +msgctxt "#30113" +msgid "Save filters" +msgstr "Cadw hidlau" + +msgctxt "#30114" +msgid "Provider Unknown" +msgstr "Darparwr Anhysbys" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/settings.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/settings.xml --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/settings.xml 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/settings.xml 2014-01-04 10:28:12.000000000 +0000 @@ -2,7 +2,8 @@ - + + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/skins/Confluence/720p/ChannelScan.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/skins/Confluence/720p/ChannelScan.xml --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/skins/Confluence/720p/ChannelScan.xml 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/skins/Confluence/720p/ChannelScan.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,733 +0,0 @@ - - 5 - no - 2 - - CommonSettingsBackground - CommonMediaPlayingBackground - - 90 - 50 - - - - - - - - - - 0 - 0 - 1100 - 640 - DialogBack.png - - - LOGO - 30 - 15 - 220 - 80 - keep - Confluence_Logo.png - - - 268 - 10 - 790 - 618 - black-back2.png - - - 268 - 10 - 804 - 70 - stretch - GlassTitleBar.png - - - header label - 300 - 20 - 740 - 30 - font16caps - - left - center - white - black - - - Start/Stop Channel search - 10 - 90 - 260 - 60 - 13 - - font13_title - right - center - MenuItemNF.png - MenuItemFO.png - 2 - 10 - 6 - 6 - - - Cancel - 10 - 150 - 260 - 60 - 13 - - font13_title - right - center - MenuItemNF.png - MenuItemFO.png - 10 - 10 - 5 - 5 - IsEmpty(Window.Property(Scanning)) - - - IsEmpty(Window.Property(Scanning)) - - Source Type - 268 - 80 - 790 - 40 - font13 - grey2 - white - MenuItemFO.png - MenuItemNF.png - center - - 5 - 5 - 22 - 11 - - - Default RadioButton - 268 - 120 - 790 - 40 - font13 - grey2 - white - MenuItemFO.png - MenuItemNF.png - - 5 - 5 - 10 - 12 - Conditional - - - Default RadioButton - 268 - 160 - 790 - 40 - font13 - grey2 - white - MenuItemFO.png - MenuItemNF.png - - 5 - 5 - 11 - 13 - Conditional - Conditional - - - Default RadioButton - 268 - 200 - 790 - 40 - font13 - grey2 - white - MenuItemFO.png - MenuItemNF.png - - 5 - 5 - 12 - 14 - Conditional - Conditional - Conditional - - - Default RadioButton - 268 - 240 - 790 - 40 - font13 - grey2 - white - MenuItemFO.png - MenuItemNF.png - - 5 - 5 - 13 - 15 - Conditional - Conditional - Conditional - Conditional - - - Default RadioButton - 268 - 280 - 790 - 40 - font13 - grey2 - white - MenuItemFO.png - MenuItemNF.png - - 5 - 5 - 14 - 16 - Conditional - Conditional - Conditional - Conditional - Conditional - - - Country selection - 268 - 320 - 790 - 40 - font13 - grey2 - white - MenuItemFO.png - MenuItemNF.png - center - - 5 - 5 - 15 - 17 - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - - - Satellite selection - 268 - 360 - 790 - 40 - font13 - grey2 - white - MenuItemFO.png - MenuItemNF.png - center - - 5 - 5 - 16 - 18 - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - - - DVB-C Inversion - 268 - 400 - 790 - 40 - font13 - grey2 - white - MenuItemFO.png - MenuItemNF.png - center - - 5 - 5 - 17 - 29 - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - - - DVB-C Symbolrate - 268 - 440 - 790 - 40 - font13 - grey2 - white - MenuItemFO.png - MenuItemNF.png - center - - 5 - 5 - 18 - 20 - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - - - DVB-C QAM - 268 - 480 - 790 - 40 - font13 - grey2 - white - MenuItemFO.png - MenuItemNF.png - center - - 5 - 5 - 29 - 21 - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - - - DVB-T Inversion - 268 - 520 - 790 - 40 - font13 - grey2 - white - MenuItemFO.png - MenuItemNF.png - center - - 5 - 5 - 20 - 22 - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - - - ATSC Type - 268 - 560 - 790 - 40 - font13 - grey2 - white - MenuItemFO.png - MenuItemNF.png - center - - 5 - 5 - 21 - 10 - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - Conditional - - - - !IsEmpty(Window.Property(Scanning)) - - Progressbar - 275 - 60 - 780 - 14 - - - type label - 275 - 85 - 250 - 30 - font13 - - left - center - grey - black - - - type value - 1040 - 85 - 500 - 30 - font13 - - right - center - white - black - - - device label - 275 - 115 - 250 - 30 - font13 - - left - center - white - black - - - device value - 1040 - 115 - 500 - 30 - font13 - - right - center - white - black - - - transponder label - 275 - 145 - 250 - 30 - font13 - - left - center - white - black - - - transponder value - 1040 - 145 - 500 - 30 - font13 - - right - center - white - black - - - Progressbar - 30 - 160 - 220 - 50 - - - Signal label - 40 - 168 - 250 - 30 - font13 - - left - center - white - black - - - 215 - 170 - 30 - 30 - stretch - amt-overlay-watched.png - !IsEmpty(Window.Property(Locked)) - - - 290 - 180 - 750 - 400 - 2 - 2 - 10 - 60 - 60 - 200 - - - 0 - 0 - 750 - 40 - stretch - MenuItemNF.png - - - 710 - 5 - 40 - 30 - stretch - OverlayLocked.png - !IsEmpty(ListItem.Property(IsEncrypted)) - - - 690 - 7 - 60 - 25 - stretch - OverlayHD.png - Conditional - !IsEmpty(ListItem.Property(IsHD)) - - - 0 - 2 - 36 - 36 - stretch - DefaultVideoCover.png - IsEmpty(ListItem.Property(IsRadio)) - - - 0 - 2 - 36 - 36 - stretch - DefaultAlbumCover.png - !IsEmpty(ListItem.Property(IsRadio)) - - - 45 - 0 - 500 - 40 - font14 - left - center - grey2 - selected - ListItem.Label - - - - - 0 - 0 - 750 - 40 - stretch - MenuItemNF.png - !Control.HasFocus(2) - VisibleFadeEffect - - - 0 - 0 - 750 - 40 - stretch - MenuItemFO.png - Control.HasFocus(2) - VisibleFadeEffect - - - 710 - 5 - 40 - 30 - stretch - OverlayLocked.png - !IsEmpty(ListItem.Property(IsEncrypted)) - - - 690 - 7 - 60 - 25 - stretch - OverlayHD.png - Conditional - !IsEmpty(ListItem.Property(IsHD)) - - - 0 - 2 - 36 - 36 - stretch - DefaultVideoCover.png - IsEmpty(ListItem.Property(IsRadio)) - - - 0 - 2 - 36 - 36 - stretch - DefaultAlbumCover.png - !IsEmpty(ListItem.Property(IsRadio)) - - - 45 - 0 - 500 - 40 - font14 - left - center - grey2 - selected - ListItem.Label - - - - - 1060 - 180 - 25 - 410 - ScrollBarV.png - ScrollBarV_bar.png - ScrollBarV_bar_focus.png - ScrollBarNib.png - ScrollBarNib.png - 2 - 10 - true - vertical - - - Page Count Label - 1040 - 600 - 500 - 20 - font12 - grey - false - right - center - - - - Status Label - 275 - 590 - 500 - 20 - font14 - yellow - false - left - center - - - - - BehindDialogFadeOut - - 60 - 0 - WindowClose - WindowOpen - - 0 - 0 - 250 - 35 - header.png - - - WindowTitleCommons - 220 - - - - WindowTitleHomeButton - Clock - - diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/skins/skin.aeon.nox/1080i/Admin.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/skins/skin.aeon.nox/1080i/Admin.xml --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/skins/skin.aeon.nox/1080i/Admin.xml 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/skins/skin.aeon.nox/1080i/Admin.xml 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,391 @@ + + 10 + SetProperty(menu,osd) + no + 36 + AutoConfig + + + + + + + + + + + CommonSettingsBackground + CommonMediaPlayingBackground + Furniture_SettingsFloor + + + Conditional + Furniture_SettingsBackPanel + + 1 + 63 + 180 + 326 + 768 + 10 + 11 + 10 + 9000 + - + 300 + + + 334 + 74 + Font_Bold20 + grey2 + + + + + + 334 + 74 + views/tripanel/listselect_fo.png + Conditional + $VAR[FocusTextureColorVar] + + + 334 + 74 + Font_Bold20 + + + + + + + SetProperty(menu,osd) + + + + SetProperty(menu,setup) + + + + SetProperty(menu,channels) + + + + + 387 + 120 + + Background + 0 + 0 + 1469 + 741 + $INFO[Container(9000).ListItem.Icon] + + + Background Title + 0 + 0 + 1469 + 50 + stretch + GlassTitleBar.png + + + StringCompare(Window.Property(menu),osd) + + osd control label + 25 + 10 + 1400 + 30 + views/tripanel/listselect_fo.png + $VAR[FocusTextureColorVar] + - + + font16caps + grey + white2 + 10 + + + 5 + 50 + 1453 + 740 + + + + StringCompare(Window.Property(menu),setup) + 21 + + Source Type + 10 + 50 + 1400 + 40 + views/tripanel/listselect_fo.png + $VAR[FocusTextureColorVar] + - + Font_Bold20 + grey + white2 + center + + 10 + 22 + + + Source Type + 10 + 100 + 1400 + 40 + views/tripanel/listselect_fo.png + $VAR[FocusTextureColorVar] + - + Font_Bold20 + grey + white2 + center + + 10 + 21 + 23 + + + Source Type + 10 + 150 + 1400 + 40 + views/tripanel/listselect_fo.png + $VAR[FocusTextureColorVar] + - + Font_Bold20 + grey + white2 + center + + 10 + 22 + + + + StringCompare(Window.Property(menu),channels) + 33 + + Channels label + 25 + 10 + 1000 + 30 + font16caps + + posx + center + white + black + + + 1090 + 30 + 30 + 30 + stretch + FFCC0000 + views/scrollbarnub-focus.png + StringCompare(Window.Property(IsDirty),1) + + + 1090 + 30 + 30 + 30 + stretch + FF00FF00 + views/scrollbarnub-focus.png + !StringCompare(Window.Property(IsDirty),1) + + + Is Radio + 75 + 150 + 375 + 30 + font16caps + grey3 + white + views/tripanel/listselect_fo.png + $VAR[FocusTextureColorVar] + settings/settings_radiobuttonoff.png + + 10 + 33 + 36 + + + providers + 75 + 250 + 375 + 30 + views/tripanel/listselect_fo.png + settings/settings_radiobuttonoff.png + + font16caps + grey3 + 10 + 36 + 32 + 34 + + + channels + 75 + 350 + 375 + 30 + views/tripanel/listselect_fo.png + settings/settings_radiobuttonoff.png + + font16caps + grey3 + 10 + 36 + 33 + 35 + + + save + 75 + 450 + 375 + 30 + views/tripanel/listselect_fo.png + settings/settings_radiobuttonoff.png + + font16caps + grey3 + 10 + 36 + 34 + + + background image + 700 + 75 + 740 + 670 + $INFO[Container(9000).ListItem.Icon] + + + 720 + 95 + 650 + 630 + 33 + 37 + list + 37 + 200 + + + 2 + 2 + 18 + 18 + stretch + 7790EE90 + arrowright.png + ListItem.Property(IsWhitelist) + + + 2 + 2 + 18 + 18 + stretch + 77FF0000 + arrowright.png + ListItem.Property(IsBlacklist) + + + 40 + 0 + 550 + 20 + Font_Reg10 + posx + center + grey2 + selected + ListItem.Label + + + + + 0 + 0 + 650 + 20 + stretch + views/tripanel/listselect_fo.png + $VAR[FocusTextureColorVar] + Control.HasFocus(36) + + + 2 + 2 + 18 + 18 + stretch + 7790EE90 + arrowright.png + ListItem.Property(IsWhitelist) + + + 2 + 2 + 18 + 18 + stretch + 77FF0000 + arrowright.png + ListItem.Property(IsBlacklist) + + + 40 + 0 + 550 + 20 + Font_Reg10 + posx + center + grey2 + selected + ListItem.Label + + + + + 1400 + 75 + 25 + 630 + 36 + false + vertical + + + + + + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/skins/skin.aeon.nox.5/1080i/Admin.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/skins/skin.aeon.nox.5/1080i/Admin.xml --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/skins/skin.aeon.nox.5/1080i/Admin.xml 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/skins/skin.aeon.nox.5/1080i/Admin.xml 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,468 @@ + + 10 + SetProperty(menu,osd) + no + 36 + + CommonBackground + Topbar + + 1920 + 900 + 90 + font13_title + 15 + grey2 + right + top + -4 + + + StringCompare(Window.Property(menu),osd) + + ControlGroup(12).HasFocus() + + + 0 + 128 + Window_OpenClose_Animation + SystemLeftPanel + + 82 + 32 + 356 + 720 + 61 + 11 + 38 + 10 + 10 + 61 + 300 + + + 30 + 356 + 60 + separator2.png + + + 356 + 0 + 356 + 90 + font15 + 20 + grey2 + selected + right + center + + + + + + 30 + 356 + 60 + separator2.png + + + 0 + 0 + 356 + 90 + listselect_fo.png + Control.HasFocus(10) + VisibleFadeEffect + + + 356 + 0 + 356 + 90 + font15 + 20 + white + selected + right + center + + Conditional + + + + + + + SetProperty(menu,osd) + + + + SetProperty(menu,setup) + + + + SetProperty(menu,channels) + + + + + 68 + 32 + 8 + 720 + 11 + 10 + 61 + 61 + false + - + scrollbar/texturesliderbar2.png + scrollbar/texturesliderbar2.png + + + + LOGO + 82 + 752 + 356 + 120 + keep + aeon-nox-logo.png + + SystemRightPanel + + + control area + 522 + 32 + 1316 + 840 + 0 + 60 + 10 + 60 + 12 + 12 + StringCompare(Window.Property(menu),osd) + + osd control label + 1316 + 90 + font15 + grey2 + 30 + white + invalid + listselect_fo.png + separator5.png + + + + 0 + 90 + 1316 + 750 + center + center + + + + control area + 522 + 32 + 1316 + 840 + 0 + 60 + 10 + 60 + 20 + 20 + StringCompare(Window.Property(menu),setup) + SettingsFadeEffect + + Source Type + 0 + 0 + 1316 + 90 + font15 + grey2 + 30 + white + listselect_fo.png + + separator5.png + + center + yes + 10 + + + + Source Type + 0 + 0 + 1316 + 90 + font15 + grey2 + 30 + white + listselect_fo.png + + separator5.png + + center + yes + 10 + + + + Source Type + 0 + 0 + 1316 + 90 + font15 + grey2 + 30 + white + listselect_fo.png + + separator5.png + + center + yes + 10 + + + + + SettingsFadeEffect + StringCompare(Window.Property(menu),channels) + + Channels label + 522 + 32 + 658 + 90 + font15 + grey2 + 30 + white + listselect_fo.png + + separator5.png + + + StringCompare(Window.Property(IsDirty),1) + + + control area + 522 + 182 + 658 + 390 + 0 + 60 + 10 + 36 + 38 + 38 + + Is Radio + 658 + 90 + font15 + grey2 + 30 + white + listselect_fo.png + + separator5.png + + + + + providers + 658 + 90 + font15 + grey2 + 30 + white + listselect_fo.png + + separator5.png + + + + + channels + 658 + 90 + font15 + grey2 + 30 + white + listselect_fo.png + + separator5.png + + + + + save + 658 + 90 + font15 + grey2 + 30 + white + listselect_fo.png + + separator5.png + + + + + + 32 + 1178 + 2 + 840 + separator3.png + + + 1180 + 32 + 658 + 840 + 36 + 38 + 37 + 36 + 37 + 200 + + + + 658 + 60 + separator2.png + + + 658 + 60 + font14 + left + 15 + grey2 + grey2 + ListItem.Label + + + 594 + -2 + 64 + 64 + FF04B431 + android/btn_radio_on_holo_dark.png + ListItem.Property(IsWhitelist) + + + 594 + -2 + 64 + 64 + FFB20000 + android/btn_radio_on_holo_dark.png + ListItem.Property(IsBlacklist) + + + 594 + -2 + 64 + 64 + android/btn_radio_off_holo_dark.png + + + + + 1316 + 60 + separator2.png + + + 658 + 60 + listselect_fo.png + Control.HasFocus(36) + VisibleFadeEffect + + + 658 + 60 + font14 + left + white + 15 + white + ListItem.Label + Conditional + + + + 594 + -2 + 64 + 64 + FF04B431 + android/btn_radio_on_holo_dark.png + ListItem.Property(IsWhitelist) + + + 594 + -2 + 64 + 64 + FFB20000 + android/btn_radio_on_holo_dark.png + ListItem.Property(IsBlacklist) + + + 594 + -2 + 64 + 64 + android/btn_radio_off_holo_dark.png + + + + + 1841 + 32 + 8 + 840 + 36 + 10 + 37 + 37 + false + - + scrollbar/texturesliderbar2.png + scrollbar/texturesliderbar2.png + + + + + + BehindDialogFadeOut + + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/skins/skin.confluence/720p/Admin.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/skins/skin.confluence/720p/Admin.xml --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/skins/skin.confluence/720p/Admin.xml 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/skins/skin.confluence/720p/Admin.xml 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,466 @@ + + 10 + SetProperty(menu,osd) + no + 36 + + CommonBackground + + 0 + 100r + 1280 + 100 + floor.png + VisibleFadeEffect + + + 90 + 30 + + + + + + + + + + 5 + 5 + 1090 + 630 + ContentPanel.png + + + 5 + 625 + 1090 + 64 + ContentPanelMirror.png + + + Close Window button + 980 + 11 + 64 + 32 + + - + PreviousMenu + DialogCloseButton-focus.png + DialogCloseButton.png + 1 + 1 + 1 + 1 + system.getbool(input.enablemouse) + VisibleFadeEffect + + + LOGO + 30 + 15 + 220 + 80 + keep + Confluence_Logo.png + + + 1 + 10 + 90 + 260 + 481 + 10 + 11 + 10 + 9000 + - + 300 + + + 0 + 0 + 260 + 55 + MenuItemNF.png + + + 250 + 0 + 380 + 55 + font24_title + grey2 + right + center + + + + + + 0 + 0 + 260 + 55 + MenuItemFO.png + + + 250 + 0 + 380 + 55 + font24_title + white + right + center + + + + + + + SetProperty(menu,osd) + + + + SetProperty(menu,setup) + + + + SetProperty(menu,channels) + + + + + 268 + 10 + + Background + 0 + 0 + 790 + 620 + black-back2.png + + + Background Title + 0 + 0 + 790 + 50 + stretch + GlassTitleBar.png + + + StringCompare(Window.Property(menu),osd) + + osd control label + 25 + 20 + 765 + 30 + MenuItemFO.png + MenuItemNF.png + + font16caps + white + 10 + + + 5 + 50 + 780 + 515 + + + + StringCompare(Window.Property(menu),setup) + 21 + + Source Type + 10 + 50 + 770 + 40 + font13 + grey2 + white + MenuItemFO.png + MenuItemNF.png + center + + 10 + 22 + + + Source Type + 10 + 100 + 770 + 40 + font13 + grey2 + white + MenuItemFO.png + MenuItemNF.png + center + + 10 + 21 + 23 + + + Source Type + 10 + 150 + 770 + 40 + font13 + grey2 + white + MenuItemFO.png + MenuItemNF.png + center + + 10 + 22 + + + + StringCompare(Window.Property(menu),channels) + 33 + + Channels label + 30 + 20 + 500 + 30 + font16caps + + left + center + white + black + + + 730 + 20 + 30 + 30 + stretch + FFCC0000 + radiobutton-nofocus.png + StringCompare(Window.Property(IsDirty),1) + + + 730 + 20 + 30 + 30 + stretch + FF00FF00 + radiobutton-nofocus.png + !StringCompare(Window.Property(IsDirty),1) + + + Is Radio + 50 + 100 + 250 + 30 + font16caps + grey2 + white + MenuItemFO.png + MenuItemNF.png + + 10 + 33 + 36 + + + providers + 50 + 150 + 250 + 30 + MenuItemFO.png + MenuItemNF.png + + font16caps + grey2 + white + 10 + 36 + 32 + 34 + + + channels + 50 + 200 + 250 + 30 + MenuItemFO.png + MenuItemNF.png + + font16caps + grey2 + white + 10 + 36 + 33 + 35 + + + save + 50 + 250 + 250 + 30 + MenuItemFO.png + MenuItemNF.png + + font16caps + grey2 + white + 10 + 36 + 34 + + + background image + 320 + 50 + 440 + 540 + DialogBack2.png + + + 340 + 70 + 400 + 500 + 33 + 37 + list + 37 + 200 + + + 0 + 0 + 400 + 20 + stretch + MenuItemNF.png + + + 2 + 2 + 18 + 18 + stretch + 7790EE90 + arrow-big-right.png + ListItem.Property(IsWhitelist) + + + 2 + 2 + 18 + 18 + stretch + 77FF0000 + arrow-big-right.png + ListItem.Property(IsBlacklist) + + + 40 + 0 + 340 + 20 + font10 + left + center + grey2 + selected + ListItem.Label + + + + + 0 + 0 + 400 + 20 + stretch + MenuItemNF.png + !Control.HasFocus(36) + VisibleFadeEffect + + + 0 + 0 + 400 + 20 + stretch + MenuItemFO.png + Control.HasFocus(36) + VisibleFadeEffect + + + 2 + 2 + 18 + 18 + stretch + 7790EE90 + arrow-big-right.png + ListItem.Property(IsWhitelist) + + + 2 + 2 + 18 + 18 + stretch + 77FF0000 + arrow-big-right.png + ListItem.Property(IsBlacklist) + + + 40 + 0 + 340 + 20 + font10 + left + center + grey2 + selected + ListItem.Label + + + + + 760 + 50 + 25 + 540 + ScrollBarV.png + ScrollBarV_bar.png + ScrollBarV_bar_focus.png + ScrollBarNib.png + ScrollBarNib.png + 36 + false + vertical + + + + + Clock + + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/skins/skin.confluence/720p/ChannelScan.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/skins/skin.confluence/720p/ChannelScan.xml --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/addon/resources/skins/skin.confluence/720p/ChannelScan.xml 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/addon/resources/skins/skin.confluence/720p/ChannelScan.xml 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,733 @@ + + 5 + no + 2 + + CommonSettingsBackground + CommonMediaPlayingBackground + + 90 + 50 + + + + + + + + + + 0 + 0 + 1100 + 640 + DialogBack.png + + + LOGO + 30 + 15 + 220 + 80 + keep + Confluence_Logo.png + + + 268 + 10 + 790 + 618 + black-back2.png + + + 268 + 10 + 804 + 70 + stretch + GlassTitleBar.png + + + header label + 300 + 20 + 740 + 30 + font16caps + + left + center + white + black + + + Start/Stop Channel search + 10 + 90 + 260 + 60 + 13 + + font13_title + right + center + MenuItemNF.png + MenuItemFO.png + 2 + 10 + 6 + 6 + + + Cancel + 10 + 150 + 260 + 60 + 13 + + font13_title + right + center + MenuItemNF.png + MenuItemFO.png + 10 + 10 + 5 + 5 + IsEmpty(Window.Property(Scanning)) + + + IsEmpty(Window.Property(Scanning)) + + Source Type + 268 + 80 + 790 + 40 + font13 + grey2 + white + MenuItemFO.png + MenuItemNF.png + center + + 5 + 5 + 22 + 11 + + + Default RadioButton + 268 + 120 + 790 + 40 + font13 + grey2 + white + MenuItemFO.png + MenuItemNF.png + + 5 + 5 + 10 + 12 + Conditional + + + Default RadioButton + 268 + 160 + 790 + 40 + font13 + grey2 + white + MenuItemFO.png + MenuItemNF.png + + 5 + 5 + 11 + 13 + Conditional + Conditional + + + Default RadioButton + 268 + 200 + 790 + 40 + font13 + grey2 + white + MenuItemFO.png + MenuItemNF.png + + 5 + 5 + 12 + 14 + Conditional + Conditional + Conditional + + + Default RadioButton + 268 + 240 + 790 + 40 + font13 + grey2 + white + MenuItemFO.png + MenuItemNF.png + + 5 + 5 + 13 + 15 + Conditional + Conditional + Conditional + Conditional + + + Default RadioButton + 268 + 280 + 790 + 40 + font13 + grey2 + white + MenuItemFO.png + MenuItemNF.png + + 5 + 5 + 14 + 16 + Conditional + Conditional + Conditional + Conditional + Conditional + + + Country selection + 268 + 320 + 790 + 40 + font13 + grey2 + white + MenuItemFO.png + MenuItemNF.png + center + + 5 + 5 + 15 + 17 + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + + + Satellite selection + 268 + 360 + 790 + 40 + font13 + grey2 + white + MenuItemFO.png + MenuItemNF.png + center + + 5 + 5 + 16 + 18 + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + + + DVB-C Inversion + 268 + 400 + 790 + 40 + font13 + grey2 + white + MenuItemFO.png + MenuItemNF.png + center + + 5 + 5 + 17 + 29 + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + + + DVB-C Symbolrate + 268 + 440 + 790 + 40 + font13 + grey2 + white + MenuItemFO.png + MenuItemNF.png + center + + 5 + 5 + 18 + 20 + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + + + DVB-C QAM + 268 + 480 + 790 + 40 + font13 + grey2 + white + MenuItemFO.png + MenuItemNF.png + center + + 5 + 5 + 29 + 21 + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + + + DVB-T Inversion + 268 + 520 + 790 + 40 + font13 + grey2 + white + MenuItemFO.png + MenuItemNF.png + center + + 5 + 5 + 20 + 22 + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + + + ATSC Type + 268 + 560 + 790 + 40 + font13 + grey2 + white + MenuItemFO.png + MenuItemNF.png + center + + 5 + 5 + 21 + 10 + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + Conditional + + + + !IsEmpty(Window.Property(Scanning)) + + Progressbar + 275 + 60 + 780 + 14 + + + type label + 275 + 85 + 250 + 30 + font13 + + left + center + grey + black + + + type value + 1040 + 85 + 500 + 30 + font13 + + right + center + white + black + + + device label + 275 + 115 + 250 + 30 + font13 + + left + center + white + black + + + device value + 1040 + 115 + 500 + 30 + font13 + + right + center + white + black + + + transponder label + 275 + 145 + 250 + 30 + font13 + + left + center + white + black + + + transponder value + 1040 + 145 + 500 + 30 + font13 + + right + center + white + black + + + Progressbar + 30 + 160 + 220 + 50 + + + Signal label + 40 + 168 + 250 + 30 + font13 + + left + center + white + black + + + 215 + 170 + 30 + 30 + stretch + amt-overlay-watched.png + !IsEmpty(Window.Property(Locked)) + + + 290 + 180 + 750 + 400 + 2 + 2 + 10 + 60 + 60 + 200 + + + 0 + 0 + 750 + 40 + stretch + MenuItemNF.png + + + 710 + 5 + 40 + 30 + stretch + OverlayLocked.png + !IsEmpty(ListItem.Property(IsEncrypted)) + + + 690 + 7 + 60 + 25 + stretch + OverlayHD.png + Conditional + !IsEmpty(ListItem.Property(IsHD)) + + + 0 + 2 + 36 + 36 + stretch + DefaultVideoCover.png + IsEmpty(ListItem.Property(IsRadio)) + + + 0 + 2 + 36 + 36 + stretch + DefaultAlbumCover.png + !IsEmpty(ListItem.Property(IsRadio)) + + + 45 + 0 + 500 + 40 + font14 + left + center + grey2 + selected + ListItem.Label + + + + + 0 + 0 + 750 + 40 + stretch + MenuItemNF.png + !Control.HasFocus(2) + VisibleFadeEffect + + + 0 + 0 + 750 + 40 + stretch + MenuItemFO.png + Control.HasFocus(2) + VisibleFadeEffect + + + 710 + 5 + 40 + 30 + stretch + OverlayLocked.png + !IsEmpty(ListItem.Property(IsEncrypted)) + + + 690 + 7 + 60 + 25 + stretch + OverlayHD.png + Conditional + !IsEmpty(ListItem.Property(IsHD)) + + + 0 + 2 + 36 + 36 + stretch + DefaultVideoCover.png + IsEmpty(ListItem.Property(IsRadio)) + + + 0 + 2 + 36 + 36 + stretch + DefaultAlbumCover.png + !IsEmpty(ListItem.Property(IsRadio)) + + + 45 + 0 + 500 + 40 + font14 + left + center + grey2 + selected + ListItem.Label + + + + + 1060 + 180 + 25 + 410 + ScrollBarV.png + ScrollBarV_bar.png + ScrollBarV_bar_focus.png + ScrollBarNib.png + ScrollBarNib.png + 2 + 10 + true + vertical + + + Page Count Label + 1040 + 600 + 500 + 20 + font12 + grey + false + right + center + + + + Status Label + 275 + 590 + 500 + 20 + font14 + yellow + false + left + center + + + + + BehindDialogFadeOut + + 60 + 0 + WindowClose + WindowOpen + + 0 + 0 + 250 + 35 + header.png + + + WindowTitleCommons + 220 + + + + WindowTitleHomeButton + Clock + + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/Makefile.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/Makefile.am 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/Makefile.am 2014-01-04 10:28:12.000000000 +0000 @@ -18,7 +18,25 @@ src/VNSIDemux.cpp \ src/VNSIRecording.cpp \ src/VNSISession.cpp \ + src/VNSIAdmin.cpp \ + src/VNSIChannels.cpp \ src/requestpacket.cpp \ src/responsepacket.cpp \ src/tools.cpp + libvdrvnsi_addon_la_LDFLAGS = @TARGET_LDFLAGS@ + +if HAVE_GLES2 +libvdrvnsi_addon_la_SOURCES += src/EGLHelpers/VisGUIShader.cpp \ + src/EGLHelpers/VisShader.cpp \ + src/EGLHelpers/VisMatrixGLES.cpp + +if HOST_IS_OSX + libvdrvnsi_addon_la_LDFLAGS += -framework OpenGLES +else + libvdrvnsi_addon_la_LDFLAGS += -lGLESv2 +endif + +endif + + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/project/VS2010Express/pvrclient_vdr_vnsi.vcxproj xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/project/VS2010Express/pvrclient_vdr_vnsi.vcxproj --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/project/VS2010Express/pvrclient_vdr_vnsi.vcxproj 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/project/VS2010Express/pvrclient_vdr_vnsi.vcxproj 2014-01-04 10:28:19.000000000 +0000 @@ -42,6 +42,8 @@ XBMC_VDR_vnsi_win32 + $(DXSDK_DIR)Include;$(IncludePath) + $(DXSDK_DIR)Lib\x86;$(LibraryPath) ..\..\addon\ @@ -54,13 +56,14 @@ Level3 Disabled ..\..\..\..\xbmc;..\..\..\..\lib;..\..\..\..\lib\platform\windows - _WINDLL;_CRT_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;_WINSOCKAPI_;USE_DEMUX;%(PreprocessorDefinitions) + _WINDLL;TARGET_WINDOWS;_CRT_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;_WINSOCKAPI_;USE_DEMUX;HAS_DX;%(PreprocessorDefinitions) MultiThreadedDebug true - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies) + d3dx9.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies) + @@ -69,7 +72,7 @@ true true ..\..\..\..\xbmc;..\..\..\..\lib;..\..\..\..\lib\platform\windows - _WINDLL;_CRT_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;_WINSOCKAPI_;USE_DEMUX;%(PreprocessorDefinitions) + _WINDLL;TARGET_WINDOWS;_CRT_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;_WINSOCKAPI_;USE_DEMUX;%(PreprocessorDefinitions) MultiThreaded @@ -84,6 +87,8 @@ + + @@ -95,6 +100,7 @@ + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/project/VS2010Express/pvrclient_vdr_vnsi.vcxproj.filters xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/project/VS2010Express/pvrclient_vdr_vnsi.vcxproj.filters --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/project/VS2010Express/pvrclient_vdr_vnsi.vcxproj.filters 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/project/VS2010Express/pvrclient_vdr_vnsi.vcxproj.filters 2014-01-04 10:28:19.000000000 +0000 @@ -42,6 +42,12 @@ Source Files + + Source Files + + + Source Files + @@ -71,5 +77,8 @@ Header Files + + Header Files + \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/client.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/client.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/client.cpp 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/client.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -25,6 +25,7 @@ #include "VNSIRecording.h" #include "VNSIData.h" #include "VNSIChannelScan.h" +#include "VNSIAdmin.h" #include "platform/util/util.h" #include @@ -47,8 +48,10 @@ int g_iConnectTimeout = DEFAULT_TIMEOUT; ///< The Socket connection timeout int g_iPriority = DEFAULT_PRIORITY; ///< The Priority this client have in response to other clients bool g_bAutoChannelGroups = DEFAULT_AUTOGROUPS; +int g_iTimeshift = 1; CHelper_libXBMC_addon *XBMC = NULL; +CHelper_libXBMC_codec *CODEC = NULL; CHelper_libXBMC_gui *GUI = NULL; CHelper_libXBMC_pvr *PVR = NULL; @@ -82,10 +85,20 @@ return ADDON_STATUS_PERMANENT_FAILURE; } + CODEC = new CHelper_libXBMC_codec; + if (!CODEC->RegisterMe(hdl)) + { + SAFE_DELETE(CODEC); + SAFE_DELETE(GUI); + SAFE_DELETE(XBMC); + return ADDON_STATUS_PERMANENT_FAILURE; + } + PVR = new CHelper_libXBMC_pvr; if (!PVR->RegisterMe(hdl)) { SAFE_DELETE(PVR); + SAFE_DELETE(CODEC); SAFE_DELETE(GUI); SAFE_DELETE(XBMC); return ADDON_STATUS_PERMANENT_FAILURE; @@ -125,6 +138,14 @@ g_iPriority = DEFAULT_PRIORITY; } + /* Read setting "timeshift" from settings.xml */ + if (!XBMC->GetSetting("timeshift", &g_iTimeshift)) + { + /* If setting is unknown fallback to defaults */ + XBMC->Log(LOG_ERROR, "Couldn't get 'timeshift' setting, falling back to %i as default", 1); + g_iTimeshift = 1; + } + /* Read setting "convertchar" from settings.xml */ if (!XBMC->GetSetting("convertchar", &g_bCharsetConv)) { @@ -179,6 +200,12 @@ return m_CurStatus; } + PVR_MENUHOOK hook; + hook.iHookId = 1; + hook.category = PVR_MENUHOOK_SETTING; + hook.iLocalizedStringId = 30107; + PVR->AddMenuHook(&hook); + m_CurStatus = ADDON_STATUS_OK; return m_CurStatus; } @@ -190,6 +217,8 @@ void ADDON_Destroy() { + SAFE_DELETE(CODEC); + if (VNSIDemuxer) SAFE_DELETE(VNSIDemuxer); @@ -247,6 +276,11 @@ XBMC->Log(LOG_INFO, "Changed Setting 'priority' from %u to %u", g_iPriority, *(int*) settingValue); g_iPriority = *(int*) settingValue; } + else if (str == "timeshift") + { + XBMC->Log(LOG_INFO, "Changed Setting 'timeshift' from %u to %u", g_iTimeshift, *(int*) settingValue); + g_iPriority = *(int*) settingValue; + } else if (str == "convertchar") { XBMC->Log(LOG_INFO, "Changed Setting 'convertchar' from %u to %u", g_bCharsetConv, *(bool*) settingValue); @@ -285,6 +319,10 @@ } +void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ +} + /*********************************************************** * PVR Client AddOn specific public library functions ***********************************************************/ @@ -301,10 +339,23 @@ return strMinApiVersion; } +const char* GetGUIAPIVersion(void) +{ + static const char *strGuiApiVersion = XBMC_GUI_API_VERSION; + return strGuiApiVersion; +} + +const char* GetMininumGUIAPIVersion(void) +{ + static const char *strMinGuiApiVersion = XBMC_GUI_MIN_API_VERSION; + return strMinGuiApiVersion; +} + PVR_ERROR GetAddonCapabilities(PVR_ADDON_CAPABILITIES* pCapabilities) { pCapabilities->bSupportsEPG = true; pCapabilities->bSupportsRecordings = true; + pCapabilities->bSupportsRecordingEdl = true; pCapabilities->bSupportsTimers = true; pCapabilities->bSupportsTV = true; pCapabilities->bSupportsRadio = true; @@ -573,6 +624,56 @@ } +bool CanPauseStream(void) +{ + bool ret = false; + if (VNSIDemuxer) + ret = VNSIDemuxer->IsTimeshift(); + return ret; +} + +bool CanSeekStream(void) +{ + bool ret = false; + if (VNSIDemuxer) + ret = VNSIDemuxer->IsTimeshift(); + return ret; +} + +bool SeekTime(int time, bool backwards, double *startpts) +{ + bool ret = false; + if (VNSIDemuxer) + ret = VNSIDemuxer->SeekTime(time, backwards, startpts); + return ret; +} + +time_t GetPlayingTime() +{ + time_t time = 0; + if (VNSIDemuxer) + time = VNSIDemuxer->GetPlayingTime(); + return time; +} + +time_t GetBufferTimeStart() +{ + time_t time = 0; + if (VNSIDemuxer) + time = VNSIDemuxer->GetBufferTimeStart(); + return time; +} + +time_t GetBufferTimeEnd() +{ + time_t time = 0; + if (VNSIDemuxer) + time = VNSIDemuxer->GetBufferTimeEnd(); + return time; +} + +void SetSpeed(int) {}; +void PauseStream(bool bPaused) {} /*******************************************/ /** PVR Recording Stream Functions **/ @@ -630,8 +731,29 @@ return 0; } +PVR_ERROR GetRecordingEdl(const PVR_RECORDING& recinfo, PVR_EDL_ENTRY edl[], int *size) +{ + if(!VNSIData) + return PVR_ERROR_UNKNOWN; + + return VNSIData->GetRecordingEdl(recinfo, edl, size); +} + + +/*******************************************/ +/** PVR Menu Hook Functions **/ + +PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_MENUHOOK_DATA &item) +{ + if (menuhook.iHookId == 1) + { + cVNSIAdmin osd; + osd.Open(g_szHostname, g_iPort); + } + return PVR_ERROR_NO_ERROR; +} + /** UNUSED API FUNCTIONS */ -PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR DeleteChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR RenameChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR MoveChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } @@ -648,9 +770,4 @@ PVR_ERROR SetRecordingLastPlayedPosition(const PVR_RECORDING &recording, int lastplayedposition) { return PVR_ERROR_NOT_IMPLEMENTED; } int GetRecordingLastPlayedPosition(const PVR_RECORDING &recording) { return -1; } unsigned int GetChannelSwitchDelay(void) { return 0; } -void PauseStream(bool bPaused) {} -bool CanPauseStream(void) { return false; } -bool CanSeekStream(void) { return false; } -bool SeekTime(int,bool,double*) { return false; } -void SetSpeed(int) {}; } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/client.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/client.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/client.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/client.h 2014-01-04 10:28:12.000000000 +0000 @@ -21,8 +21,9 @@ */ #include "libXBMC_addon.h" -#include "libXBMC_gui.h" +#include "libXBMC_codec.h" #include "libXBMC_pvr.h" +#include "libXBMC_gui.h" #define DEFAULT_HOST "127.0.0.1" #define DEFAULT_PORT 34890 @@ -39,7 +40,9 @@ extern int g_iPriority; ///< The Priority this client have in response to other clients extern bool g_bCharsetConv; ///< Convert VDR's incoming strings to UTF8 character set extern bool g_bHandleMessages; ///< Send VDR's OSD status messages to XBMC OSD +extern int g_iTimeshift; extern ADDON::CHelper_libXBMC_addon *XBMC; +extern CHelper_libXBMC_codec *CODEC; extern CHelper_libXBMC_gui *GUI; extern CHelper_libXBMC_pvr *PVR; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/EGLHelpers/VisGUIShader.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/EGLHelpers/VisGUIShader.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/EGLHelpers/VisGUIShader.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/EGLHelpers/VisGUIShader.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,74 @@ +/* +* Copyright (C) 2005-2013 Team XBMC +* http://www.xbmc.org +* +* This Program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2, or (at your option) +* any later version. +* +* This Program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with XBMC; see the file COPYING. If not, see +* . +* +*/ + +#include "VisGUIShader.h" + +CVisGUIShader::CVisGUIShader(const char *vert, const char *frag ) : CVisGLSLShaderProgram(vert, frag) +{ + // Initialise values + m_hTex0 = 0; + m_hTex1 = 0; + m_hProj = 0; + m_hModel = 0; + m_hPos = 0; + m_hCol = 0; + m_hCord0 = 0; + m_hCord1 = 0; + + m_proj = NULL; + m_model = NULL; +} + +void CVisGUIShader::OnCompiledAndLinked() +{ + // This is called after CompileAndLink() + + // Variables passed directly to the Fragment shader + m_hTex0 = glGetUniformLocation(ProgramHandle(), "m_samp0"); + m_hTex1 = glGetUniformLocation(ProgramHandle(), "m_samp1"); + // Variables passed directly to the Vertex shader + m_hProj = glGetUniformLocation(ProgramHandle(), "m_proj"); + m_hModel = glGetUniformLocation(ProgramHandle(), "m_model"); + m_hPos = glGetAttribLocation(ProgramHandle(), "m_attrpos"); + m_hCol = glGetAttribLocation(ProgramHandle(), "m_attrcol"); + m_hCord0 = glGetAttribLocation(ProgramHandle(), "m_attrcord0"); + m_hCord1 = glGetAttribLocation(ProgramHandle(), "m_attrcord1"); + + // It's okay to do this only one time. Textures units never change. + glUseProgram( ProgramHandle() ); + glUniform1i(m_hTex0, 0); + glUniform1i(m_hTex1, 1); + glUseProgram( 0 ); +} + +bool CVisGUIShader::OnEnabled() +{ + // This is called after glUseProgram() + glUniformMatrix4fv(m_hProj, 1, GL_FALSE, GetMatrix(MM_PROJECTION)); + glUniformMatrix4fv(m_hModel, 1, GL_FALSE, GetMatrix(MM_MODELVIEW)); + + return true; +} + +void CVisGUIShader::Free() +{ + // Do Cleanup here + CVisShaderProgram::Free(); +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/EGLHelpers/VisGUIShader.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/EGLHelpers/VisGUIShader.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/EGLHelpers/VisGUIShader.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/EGLHelpers/VisGUIShader.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,51 @@ +#pragma once +/* +* Copyright (C) 2005-2013 Team XBMC +* http://www.xbmc.org +* +* This Program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2, or (at your option) +* any later version. +* +* This Program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with XBMC; see the file COPYING. If not, see +* . +* +*/ + +#include "VisShader.h" +#include "VisMatrixGLES.h" + +class CVisGUIShader : public CVisGLSLShaderProgram, public CVisMatrixGLES +{ +public: + CVisGUIShader(const char *vert, const char *frag); + + void OnCompiledAndLinked(); + bool OnEnabled(); + void Free(); + + GLint GetPosLoc() { return m_hPos; } + GLint GetColLoc() { return m_hCol; } + GLint GetCord0Loc() { return m_hCord0; } + GLint GetCord1Loc() { return m_hCord1; } + +protected: + GLint m_hTex0; + GLint m_hTex1; + GLint m_hProj; + GLint m_hModel; + GLint m_hPos; + GLint m_hCol; + GLint m_hCord0; + GLint m_hCord1; + + GLfloat *m_proj; + GLfloat *m_model; +}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/EGLHelpers/VisMatrixGLES.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/EGLHelpers/VisMatrixGLES.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/EGLHelpers/VisMatrixGLES.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/EGLHelpers/VisMatrixGLES.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,369 @@ +/* +* Copyright (C) 2005-2013 Team XBMC +* http://www.xbmc.org +* +* This Program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2, or (at your option) +* any later version. +* +* This Program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with XBMC; see the file COPYING. If not, see +* . +* +*/ + +#include "VisMatrixGLES.h" +#include + +#define MODE_WITHIN_RANGE(m) ((m >= 0) && (m < (int)MM_MATRIXSIZE)) + +CVisMatrixGLES::CVisMatrixGLES() +{ + for (unsigned int i=0; i < MM_MATRIXSIZE; i++) + { + m_matrices[i].push_back(MatrixWrapper()); + MatrixMode((EMATRIXMODE)i); + LoadIdentity(); + } + m_matrixMode = (EMATRIXMODE)-1; + m_pMatrix = NULL; +} + +CVisMatrixGLES::~CVisMatrixGLES() +{ +} + +GLfloat* CVisMatrixGLES::GetMatrix(EMATRIXMODE mode) +{ + if (MODE_WITHIN_RANGE(mode)) + { + if (!m_matrices[mode].empty()) + { + return m_matrices[mode].back(); + } + } + return NULL; +} + +void CVisMatrixGLES::MatrixMode(EMATRIXMODE mode) +{ + if (MODE_WITHIN_RANGE(mode)) + { + m_matrixMode = mode; + m_pMatrix = m_matrices[mode].back(); + } + else + { + m_matrixMode = (EMATRIXMODE)-1; + m_pMatrix = NULL; + } +} + +void CVisMatrixGLES::PushMatrix() +{ + if (m_pMatrix && MODE_WITHIN_RANGE(m_matrixMode)) + { + m_matrices[m_matrixMode].push_back(MatrixWrapper(m_pMatrix)); + m_pMatrix = m_matrices[m_matrixMode].back(); + } +} + +void CVisMatrixGLES::PopMatrix() +{ + if (MODE_WITHIN_RANGE(m_matrixMode)) + { + if (m_matrices[m_matrixMode].size() > 1) + { + m_matrices[m_matrixMode].pop_back(); + } + m_pMatrix = m_matrices[m_matrixMode].back(); + } +} + +void CVisMatrixGLES::LoadIdentity() +{ + if (m_pMatrix) + { + m_pMatrix[0] = 1.0f; m_pMatrix[4] = 0.0f; m_pMatrix[8] = 0.0f; m_pMatrix[12] = 0.0f; + m_pMatrix[1] = 0.0f; m_pMatrix[5] = 1.0f; m_pMatrix[9] = 0.0f; m_pMatrix[13] = 0.0f; + m_pMatrix[2] = 0.0f; m_pMatrix[6] = 0.0f; m_pMatrix[10] = 1.0f; m_pMatrix[14] = 0.0f; + m_pMatrix[3] = 0.0f; m_pMatrix[7] = 0.0f; m_pMatrix[11] = 0.0f; m_pMatrix[15] = 1.0f; + } +} + +void CVisMatrixGLES::Ortho(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f) +{ + GLfloat u = 2.0f / (r - l); + GLfloat v = 2.0f / (t - b); + GLfloat w = -2.0f / (f - n); + GLfloat x = - (r + l) / (r - l); + GLfloat y = - (t + b) / (t - b); + GLfloat z = - (f + n) / (f - n); + GLfloat matrix[16] = { u, 0.0f, 0.0f, 0.0f, + 0.0f, v, 0.0f, 0.0f, + 0.0f, 0.0f, w, 0.0f, + x, y, z, 1.0f}; + MultMatrixf(matrix); +} + +void CVisMatrixGLES::Ortho2D(GLfloat l, GLfloat r, GLfloat b, GLfloat t) +{ + GLfloat u = 2.0f / (r - l); + GLfloat v = 2.0f / (t - b); + GLfloat x = - (r + l) / (r - l); + GLfloat y = - (t + b) / (t - b); + GLfloat matrix[16] = { u, 0.0f, 0.0f, 0.0f, + 0.0f, v, 0.0f, 0.0f, + 0.0f, 0.0f,-1.0f, 0.0f, + x, y, 0.0f, 1.0f}; + MultMatrixf(matrix); +} + +void CVisMatrixGLES::Frustum(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f) +{ + GLfloat u = (2.0f * n) / (r - l); + GLfloat v = (2.0f * n) / (t - b); + GLfloat w = (r + l) / (r - l); + GLfloat x = (t + b) / (t - b); + GLfloat y = - (f + n) / (f - n); + GLfloat z = - (2.0f * f * n) / (f - n); + GLfloat matrix[16] = { u, 0.0f, 0.0f, 0.0f, + 0.0f, v, 0.0f, 0.0f, + w, x, y,-1.0f, + 0.0f, 0.0f, z, 0.0f}; + MultMatrixf(matrix); +} + +void CVisMatrixGLES::Translatef(GLfloat x, GLfloat y, GLfloat z) +{ + GLfloat matrix[16] = {1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + x, y, z, 1.0f}; + MultMatrixf(matrix); +} + +void CVisMatrixGLES::Scalef(GLfloat x, GLfloat y, GLfloat z) +{ + GLfloat matrix[16] = { x, 0.0f, 0.0f, 0.0f, + 0.0f, y, 0.0f, 0.0f, + 0.0f, 0.0f, z, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + MultMatrixf(matrix); +} + +void CVisMatrixGLES::Rotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) +{ + GLfloat modulous = sqrt((x*x)+(y*y)+(z*z)); + if (modulous != 0.0) + { + x /= modulous; + y /= modulous; + z /= modulous; + } + GLfloat cosine = cos(angle); + GLfloat sine = sin(angle); + GLfloat cos1 = 1 - cosine; + GLfloat a = (x*x*cos1) + cosine; + GLfloat b = (x*y*cos1) - (z*sine); + GLfloat c = (x*z*cos1) + (y*sine); + GLfloat d = (y*x*cos1) + (z*sine); + GLfloat e = (y*y*cos1) + cosine; + GLfloat f = (y*z*cos1) - (x*sine); + GLfloat g = (z*x*cos1) - (y*sine); + GLfloat h = (z*y*cos1) + (x*sine); + GLfloat i = (z*z*cos1) + cosine; + GLfloat matrix[16] = { a, d, g, 0.0f, + b, e, h, 0.0f, + c, f, i, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + MultMatrixf(matrix); +} + +#if defined(__ARM_NEON__) + +inline void Matrix4Mul(const float* src_mat_1, const float* src_mat_2, float* dst_mat) +{ + asm volatile ( + // Store A & B leaving room at top of registers for result (q0-q3) + "vldmia %1, { q4-q7 } \n\t" + "vldmia %2, { q8-q11 } \n\t" + + // result = first column of B x first row of A + "vmul.f32 q0, q8, d8[0]\n\t" + "vmul.f32 q1, q8, d10[0]\n\t" + "vmul.f32 q2, q8, d12[0]\n\t" + "vmul.f32 q3, q8, d14[0]\n\t" + + // result += second column of B x second row of A + "vmla.f32 q0, q9, d8[1]\n\t" + "vmla.f32 q1, q9, d10[1]\n\t" + "vmla.f32 q2, q9, d12[1]\n\t" + "vmla.f32 q3, q9, d14[1]\n\t" + + // result += third column of B x third row of A + "vmla.f32 q0, q10, d9[0]\n\t" + "vmla.f32 q1, q10, d11[0]\n\t" + "vmla.f32 q2, q10, d13[0]\n\t" + "vmla.f32 q3, q10, d15[0]\n\t" + + // result += last column of B x last row of A + "vmla.f32 q0, q11, d9[1]\n\t" + "vmla.f32 q1, q11, d11[1]\n\t" + "vmla.f32 q2, q11, d13[1]\n\t" + "vmla.f32 q3, q11, d15[1]\n\t" + + // output = result registers + "vstmia %2, { q0-q3 }" + : //no output + : "r" (dst_mat), "r" (src_mat_2), "r" (src_mat_1) // input - note *value* of pointer doesn't change + : "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10", "q11" //clobber + ); +} +void CVisMatrixGLES::MultMatrixf(const GLfloat *matrix) +{ + if (m_pMatrix) + { + GLfloat m[16]; + Matrix4Mul(m_pMatrix, matrix, m); + } +} + +#else +void CVisMatrixGLES::MultMatrixf(const GLfloat *matrix) +{ + if (m_pMatrix) + { + GLfloat a = (matrix[0] * m_pMatrix[0]) + (matrix[1] * m_pMatrix[4]) + (matrix[2] * m_pMatrix[8]) + (matrix[3] * m_pMatrix[12]); + GLfloat b = (matrix[0] * m_pMatrix[1]) + (matrix[1] * m_pMatrix[5]) + (matrix[2] * m_pMatrix[9]) + (matrix[3] * m_pMatrix[13]); + GLfloat c = (matrix[0] * m_pMatrix[2]) + (matrix[1] * m_pMatrix[6]) + (matrix[2] * m_pMatrix[10]) + (matrix[3] * m_pMatrix[14]); + GLfloat d = (matrix[0] * m_pMatrix[3]) + (matrix[1] * m_pMatrix[7]) + (matrix[2] * m_pMatrix[11]) + (matrix[3] * m_pMatrix[15]); + GLfloat e = (matrix[4] * m_pMatrix[0]) + (matrix[5] * m_pMatrix[4]) + (matrix[6] * m_pMatrix[8]) + (matrix[7] * m_pMatrix[12]); + GLfloat f = (matrix[4] * m_pMatrix[1]) + (matrix[5] * m_pMatrix[5]) + (matrix[6] * m_pMatrix[9]) + (matrix[7] * m_pMatrix[13]); + GLfloat g = (matrix[4] * m_pMatrix[2]) + (matrix[5] * m_pMatrix[6]) + (matrix[6] * m_pMatrix[10]) + (matrix[7] * m_pMatrix[14]); + GLfloat h = (matrix[4] * m_pMatrix[3]) + (matrix[5] * m_pMatrix[7]) + (matrix[6] * m_pMatrix[11]) + (matrix[7] * m_pMatrix[15]); + GLfloat i = (matrix[8] * m_pMatrix[0]) + (matrix[9] * m_pMatrix[4]) + (matrix[10] * m_pMatrix[8]) + (matrix[11] * m_pMatrix[12]); + GLfloat j = (matrix[8] * m_pMatrix[1]) + (matrix[9] * m_pMatrix[5]) + (matrix[10] * m_pMatrix[9]) + (matrix[11] * m_pMatrix[13]); + GLfloat k = (matrix[8] * m_pMatrix[2]) + (matrix[9] * m_pMatrix[6]) + (matrix[10] * m_pMatrix[10]) + (matrix[11] * m_pMatrix[14]); + GLfloat l = (matrix[8] * m_pMatrix[3]) + (matrix[9] * m_pMatrix[7]) + (matrix[10] * m_pMatrix[11]) + (matrix[11] * m_pMatrix[15]); + GLfloat m = (matrix[12] * m_pMatrix[0]) + (matrix[13] * m_pMatrix[4]) + (matrix[14] * m_pMatrix[8]) + (matrix[15] * m_pMatrix[12]); + GLfloat n = (matrix[12] * m_pMatrix[1]) + (matrix[13] * m_pMatrix[5]) + (matrix[14] * m_pMatrix[9]) + (matrix[15] * m_pMatrix[13]); + GLfloat o = (matrix[12] * m_pMatrix[2]) + (matrix[13] * m_pMatrix[6]) + (matrix[14] * m_pMatrix[10]) + (matrix[15] * m_pMatrix[14]); + GLfloat p = (matrix[12] * m_pMatrix[3]) + (matrix[13] * m_pMatrix[7]) + (matrix[14] * m_pMatrix[11]) + (matrix[15] * m_pMatrix[15]); + m_pMatrix[0] = a; m_pMatrix[4] = e; m_pMatrix[8] = i; m_pMatrix[12] = m; + m_pMatrix[1] = b; m_pMatrix[5] = f; m_pMatrix[9] = j; m_pMatrix[13] = n; + m_pMatrix[2] = c; m_pMatrix[6] = g; m_pMatrix[10] = k; m_pMatrix[14] = o; + m_pMatrix[3] = d; m_pMatrix[7] = h; m_pMatrix[11] = l; m_pMatrix[15] = p; + } +} +#endif + +// gluLookAt implementation taken from Mesa3D +void CVisMatrixGLES::LookAt(GLfloat eyex, GLfloat eyey, GLfloat eyez, GLfloat centerx, GLfloat centery, GLfloat centerz, GLfloat upx, GLfloat upy, GLfloat upz) +{ + GLfloat forward[3], side[3], up[3]; + GLfloat m[4][4]; + + forward[0] = centerx - eyex; + forward[1] = centery - eyey; + forward[2] = centerz - eyez; + + up[0] = upx; + up[1] = upy; + up[2] = upz; + + GLfloat tmp = sqrt(forward[0]*forward[0] + forward[1]*forward[1] + forward[2]*forward[2]); + if (tmp != 0.0) + { + forward[0] /= tmp; + forward[1] /= tmp; + forward[2] /= tmp; + } + + side[0] = forward[1]*up[2] - forward[2]*up[1]; + side[1] = forward[2]*up[0] - forward[0]*up[2]; + side[2] = forward[0]*up[1] - forward[1]*up[0]; + + tmp = sqrt(side[0]*side[0] + side[1]*side[1] + side[2]*side[2]); + if (tmp != 0.0) + { + side[0] /= tmp; + side[1] /= tmp; + side[2] /= tmp; + } + + up[0] = side[1]*forward[2] - side[2]*forward[1]; + up[1] = side[2]*forward[0] - side[0]*forward[2]; + up[2] = side[0]*forward[1] - side[1]*forward[0]; + + m[0][0] = 1.0f; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = 0.0f; + m[1][0] = 0.0f; m[1][1] = 1.0f; m[1][2] = 0.0f; m[1][3] = 0.0f; + m[2][0] = 0.0f; m[2][1] = 0.0f; m[2][2] = 1.0f; m[2][3] = 0.0f; + m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; + + m[0][0] = side[0]; + m[1][0] = side[1]; + m[2][0] = side[2]; + + m[0][1] = up[0]; + m[1][1] = up[1]; + m[2][1] = up[2]; + + m[0][2] = -forward[0]; + m[1][2] = -forward[1]; + m[2][2] = -forward[2]; + + MultMatrixf(&m[0][0]); + Translatef(-eyex, -eyey, -eyez); +} + +static void __gluMultMatrixVecf(const GLfloat matrix[16], const GLfloat in[4], GLfloat out[4]) +{ + int i; + + for (i=0; i<4; i++) + { + out[i] = in[0] * matrix[0*4+i] + + in[1] * matrix[1*4+i] + + in[2] * matrix[2*4+i] + + in[3] * matrix[3*4+i]; + } +} + +// gluProject implementation taken from Mesa3D +bool CVisMatrixGLES::Project(GLfloat objx, GLfloat objy, GLfloat objz, const GLfloat modelMatrix[16], const GLfloat projMatrix[16], const GLint viewport[4], GLfloat* winx, GLfloat* winy, GLfloat* winz) +{ + GLfloat in[4]; + GLfloat out[4]; + + in[0]=objx; + in[1]=objy; + in[2]=objz; + in[3]=1.0; + __gluMultMatrixVecf(modelMatrix, in, out); + __gluMultMatrixVecf(projMatrix, out, in); + if (in[3] == 0.0) + return false; + in[0] /= in[3]; + in[1] /= in[3]; + in[2] /= in[3]; + /* Map x, y and z to range 0-1 */ + in[0] = in[0] * 0.5 + 0.5; + in[1] = in[1] * 0.5 + 0.5; + in[2] = in[2] * 0.5 + 0.5; + + /* Map x,y to viewport */ + in[0] = in[0] * viewport[2] + viewport[0]; + in[1] = in[1] * viewport[3] + viewport[1]; + + *winx=in[0]; + *winy=in[1]; + *winz=in[2]; + return true; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/EGLHelpers/VisMatrixGLES.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/EGLHelpers/VisMatrixGLES.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/EGLHelpers/VisMatrixGLES.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/EGLHelpers/VisMatrixGLES.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,80 @@ +#pragma once +/* +* Copyright (C) 2005-2013 Team XBMC +* http://www.xbmc.org +* +* This Program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2, or (at your option) +* any later version. +* +* This Program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with XBMC; see the file COPYING. If not, see +* . +* +*/ + +#if defined(__APPLE__) + #include + #include +#else + #include + #include +#endif//__APPLE__ + +#include +#include + +enum EMATRIXMODE +{ + MM_PROJECTION = 0, + MM_MODELVIEW, + MM_TEXTURE, + MM_MATRIXSIZE // Must be last! used for size of matrices +}; + +class CVisMatrixGLES +{ +public: + CVisMatrixGLES(); + ~CVisMatrixGLES(); + + GLfloat* GetMatrix(EMATRIXMODE mode); + + void MatrixMode(EMATRIXMODE mode); + void PushMatrix(); + void PopMatrix(); + void LoadIdentity(); + void Ortho(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); + void Ortho2D(GLfloat l, GLfloat r, GLfloat b, GLfloat t); + void Frustum(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); + void Translatef(GLfloat x, GLfloat y, GLfloat z); + void Scalef(GLfloat x, GLfloat y, GLfloat z); + void Rotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); + void MultMatrixf(const GLfloat *matrix); + void LookAt(GLfloat eyex, GLfloat eyey, GLfloat eyez, GLfloat centerx, GLfloat centery, GLfloat centerz, GLfloat upx, GLfloat upy, GLfloat upz); + bool Project(GLfloat objx, GLfloat objy, GLfloat objz, const GLfloat modelMatrix[16], const GLfloat projMatrix[16], const GLint viewport[4], GLfloat* winx, GLfloat* winy, GLfloat* winz); + +protected: + + struct MatrixWrapper + { + MatrixWrapper(){}; + MatrixWrapper( const float values[16]) { memcpy(m_values,values,sizeof(m_values)); } + MatrixWrapper( const MatrixWrapper &rhs ) { memcpy(m_values, rhs.m_values, sizeof(m_values)); } + MatrixWrapper &operator=( const MatrixWrapper &rhs ) { memcpy(m_values, rhs.m_values, sizeof(m_values)); return *this;} + operator float*() { return m_values; } + operator const float*() const { return m_values; } + + float m_values[16]; + }; + + std::vector m_matrices[(int)MM_MATRIXSIZE]; + GLfloat *m_pMatrix; + EMATRIXMODE m_matrixMode; +}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/EGLHelpers/VisShader.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/EGLHelpers/VisShader.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/EGLHelpers/VisShader.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/EGLHelpers/VisShader.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,221 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "VisShader.h" +#include + +#define LOG_SIZE 1024 +#define GLchar char + +////////////////////////////////////////////////////////////////////// +// CShader +////////////////////////////////////////////////////////////////////// +bool CVisShader::LoadSource(const char *buffer) +{ + m_source = buffer; + return true; +} + +////////////////////////////////////////////////////////////////////// +// CVisGLSLVertexShader +////////////////////////////////////////////////////////////////////// + +bool CVisGLSLVertexShader::Compile() +{ + GLint params[4]; + + Free(); + + m_vertexShader = glCreateShader(GL_VERTEX_SHADER); + const char *ptr = m_source.c_str(); + glShaderSource(m_vertexShader, 1, &ptr, 0); + glCompileShader(m_vertexShader); + glGetShaderiv(m_vertexShader, GL_COMPILE_STATUS, params); + if (params[0]!=GL_TRUE) + { + GLchar log[LOG_SIZE]; + glGetShaderInfoLog(m_vertexShader, LOG_SIZE, NULL, log); + m_lastLog = log; + m_compiled = false; + } + else + { + GLchar log[LOG_SIZE]; + glGetShaderInfoLog(m_vertexShader, LOG_SIZE, NULL, log); + m_lastLog = log; + m_compiled = true; + } + return m_compiled; +} + +void CVisGLSLVertexShader::Free() +{ + if (m_vertexShader) + glDeleteShader(m_vertexShader); + m_vertexShader = 0; +} + +////////////////////////////////////////////////////////////////////// +// CVisGLSLPixelShader +////////////////////////////////////////////////////////////////////// +bool CVisGLSLPixelShader::Compile() +{ + GLint params[4]; + + Free(); + + // Pixel shaders are not mandatory. + if (m_source.length()==0) + return true; + + m_pixelShader = glCreateShader(GL_FRAGMENT_SHADER); + const char *ptr = m_source.c_str(); + glShaderSource(m_pixelShader, 1, &ptr, 0); + glCompileShader(m_pixelShader); + glGetShaderiv(m_pixelShader, GL_COMPILE_STATUS, params); + if (params[0]!=GL_TRUE) + { + GLchar log[LOG_SIZE]; + glGetShaderInfoLog(m_pixelShader, LOG_SIZE, NULL, log); + m_lastLog = log; + m_compiled = false; + } + else + { + GLchar log[LOG_SIZE]; + glGetShaderInfoLog(m_pixelShader, LOG_SIZE, NULL, log); + m_lastLog = log; + m_compiled = true; + } + return m_compiled; +} + +void CVisGLSLPixelShader::Free() +{ + if (m_pixelShader) + glDeleteShader(m_pixelShader); + m_pixelShader = 0; +} + +////////////////////////////////////////////////////////////////////// +// CVisGLSLShaderProgram +////////////////////////////////////////////////////////////////////// +void CVisGLSLShaderProgram::Free() +{ + m_pVP->Free(); + m_pFP->Free(); + if (m_shaderProgram) + glDeleteProgram(m_shaderProgram); + m_shaderProgram = 0; + m_ok = false; + m_lastProgram = 0; +} + +bool CVisGLSLShaderProgram::CompileAndLink() +{ + GLint params[4]; + + // free resources + Free(); + + // compiled vertex shader + if (!m_pVP->Compile()) + return false; + + // compile pixel shader + if (!m_pFP->Compile()) + { + m_pVP->Free(); + return false; + } + + // create program object + if (!(m_shaderProgram = glCreateProgram())) + goto error; + + // attach the vertex shader + glAttachShader(m_shaderProgram, m_pVP->Handle()); + + // if we have a pixel shader, attach it. If not, fixed pipeline + // will be used. + if (m_pFP->Handle()) + glAttachShader(m_shaderProgram, m_pFP->Handle()); + + // link the program + glLinkProgram(m_shaderProgram); + glGetProgramiv(m_shaderProgram, GL_LINK_STATUS, params); + if (params[0]!=GL_TRUE) + { + GLchar log[LOG_SIZE]; + glGetProgramInfoLog(m_shaderProgram, LOG_SIZE, NULL, log); + goto error; + } + + m_validated = false; + m_ok = true; + OnCompiledAndLinked(); + return true; + + error: + m_ok = false; + Free(); + return false; +} + +bool CVisGLSLShaderProgram::Enable() +{ + if (OK()) + { + glUseProgram(m_shaderProgram); + if (OnEnabled()) + { + if (!m_validated) + { + // validate the program + GLint params[4]; + glValidateProgram(m_shaderProgram); + glGetProgramiv(m_shaderProgram, GL_VALIDATE_STATUS, params); + if (params[0]!=GL_TRUE) + { + GLchar log[LOG_SIZE]; + glGetProgramInfoLog(m_shaderProgram, LOG_SIZE, NULL, log); + } + m_validated = true; + } + return true; + } + else + { + glUseProgram(0); + return false; + } + return true; + } + return false; +} + +void CVisGLSLShaderProgram::Disable() +{ + if (OK()) + { + glUseProgram(0); + OnDisabled(); + } +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/EGLHelpers/VisShader.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/EGLHelpers/VisShader.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/EGLHelpers/VisShader.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/EGLHelpers/VisShader.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,198 @@ +#pragma once +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#if defined(__APPLE__) +#include +#include +#else +#include +#include +#endif//__APPLE__ + +#include +#include + +////////////////////////////////////////////////////////////////////// +// CVisShader - base class +////////////////////////////////////////////////////////////////////// +class CVisShader +{ +public: + CVisShader() { m_compiled = false; } + virtual ~CVisShader() {} + virtual bool Compile() = 0; + virtual void Free() = 0; + virtual GLuint Handle() = 0; + virtual void SetSource(const char *src) { m_source = src; } + virtual bool LoadSource(const char *buffer); + bool OK() { return m_compiled; } + +protected: + std::string m_source; + std::string m_lastLog; + std::vector m_attr; + bool m_compiled; + +}; + + +////////////////////////////////////////////////////////////////////// +// CVisVertexShader - vertex shader class +////////////////////////////////////////////////////////////////////// +class CVisVertexShader : public CVisShader +{ +public: + CVisVertexShader() { m_vertexShader = 0; } + virtual ~CVisVertexShader() { Free(); } + virtual void Free() {} + virtual GLuint Handle() { return m_vertexShader; } + +protected: + GLuint m_vertexShader; +}; + +class CVisGLSLVertexShader : public CVisVertexShader +{ +public: + virtual void Free(); + virtual bool Compile(); +}; + +////////////////////////////////////////////////////////////////////// +// CVisPixelShader - abstract pixel shader class +////////////////////////////////////////////////////////////////////// +class CVisPixelShader : public CVisShader +{ +public: + CVisPixelShader() { m_pixelShader = 0; } + virtual ~CVisPixelShader() { Free(); } + virtual void Free() {} + virtual GLuint Handle() { return m_pixelShader; } + +protected: + GLuint m_pixelShader; +}; + + +class CVisGLSLPixelShader : public CVisPixelShader +{ +public: + virtual void Free(); + virtual bool Compile(); +}; + +////////////////////////////////////////////////////////////////////// +// CShaderProgram - the complete shader consisting of both the vertex +// and pixel programs. (abstract) +////////////////////////////////////////////////////////////////////// +class CVisShaderProgram +{ +public: + CVisShaderProgram() + { + m_ok = false; + m_shaderProgram = 0; + m_pFP = NULL; + m_pVP = NULL; + } + + virtual ~CVisShaderProgram() + { + Free(); + delete m_pFP; + delete m_pVP; + } + + // enable the shader + virtual bool Enable() = 0; + + // disable the shader + virtual void Disable() = 0; + + // returns true if shader is compiled and linked + bool OK() { return m_ok; } + + // free resources + virtual void Free() {} + + // return the vertex shader object + CVisVertexShader* VertexShader() { return m_pVP; } + + // return the pixel shader object + CVisPixelShader* PixelShader() { return m_pFP; } + + // compile and link the shaders + virtual bool CompileAndLink() = 0; + + // override to to perform custom tasks on successfull compilation + // and linkage. E.g. obtaining handles to shader attributes. + virtual void OnCompiledAndLinked() {} + + // override to to perform custom tasks before shader is enabled + // and after it is disabled. Return false in OnDisabled() to + // disable shader. + // E.g. setting attributes, disabling texture unites, etc + virtual bool OnEnabled() { return true; } + virtual void OnDisabled() { } + + virtual GLuint ProgramHandle() { return m_shaderProgram; } + +protected: + CVisVertexShader* m_pVP; + CVisPixelShader* m_pFP; + GLuint m_shaderProgram; + bool m_ok; +}; + + +class CVisGLSLShaderProgram + : virtual public CVisShaderProgram +{ +public: + CVisGLSLShaderProgram() + { + m_pFP = new CVisGLSLPixelShader(); + m_pVP = new CVisGLSLVertexShader(); + } + CVisGLSLShaderProgram(const char *vert, const char *frag) + { + m_pFP = new CVisGLSLPixelShader(); + m_pFP->LoadSource(frag); + m_pVP = new CVisGLSLVertexShader(); + m_pVP->LoadSource(vert); + } + + // enable the shader + virtual bool Enable(); + + // disable the shader + virtual void Disable(); + + // free resources + virtual void Free(); + + // compile and link the shaders + virtual bool CompileAndLink(); + +protected: + GLint m_lastProgram; + bool m_validated; +}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/requestpacket.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/requestpacket.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/requestpacket.cpp 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/requestpacket.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -153,6 +153,20 @@ return true; } +bool cRequestPacket::add_S64(int64_t ll) +{ + if (!checkExtend(sizeof(int64_t))) return false; + int64_t tmp = htonll(ll); + memcpy(&buffer[bufUsed], &tmp, sizeof(int64_t)); + bufUsed += sizeof(int64_t); + if (!lengthSet) + { + uint32_t tmp = htonl(bufUsed - headerLength); + memcpy(&buffer[userDataLenPos], &tmp, sizeof(uint32_t)); + } + return true; +} + bool cRequestPacket::checkExtend(uint32_t by) { if (lengthSet) return true; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/requestpacket.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/requestpacket.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/requestpacket.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/requestpacket.h 2014-01-04 10:28:12.000000000 +0000 @@ -34,6 +34,7 @@ bool add_U32(uint32_t ul); bool add_S32(int32_t l); bool add_U64(uint64_t ull); + bool add_S64(int64_t ll); uint8_t* getPtr() { return buffer; } uint32_t getLen() { return bufUsed; } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/responsepacket.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/responsepacket.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/responsepacket.cpp 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/responsepacket.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -28,7 +28,6 @@ #include "client.h" #include "../../../lib/platform/sockets/tcp.h" - cResponsePacket::cResponsePacket() { userDataLength = 0; @@ -53,6 +52,16 @@ } } +void cResponsePacket::getOSDData(uint32_t &wnd, uint32_t &color, uint32_t &x0, uint32_t &y0, uint32_t &x1, uint32_t &y1) +{ + wnd = osdWnd; + color = osdColor; + x0 = osdX0; + y0 = osdY0; + x1 = osdX1; + y1 = osdY1; +} + void cResponsePacket::setResponse(uint8_t* tuserData, uint32_t tuserDataLength) { channelID = VNSI_CHANNEL_REQUEST_RESPONSE; @@ -78,6 +87,15 @@ packetPos = 0; } +void cResponsePacket::setOSD(uint8_t* tuserData, uint32_t tuserDataLength) +{ + channelID = VNSI_CHANNEL_OSD; + // set pointer to user data + userData = tuserData; + userDataLength = tuserDataLength; + packetPos = 0; +} + void cResponsePacket::extractHeader() { // set data pointers to header first @@ -105,11 +123,32 @@ duration = extract_U32(); pts = extract_U64(); dts = extract_U64(); + muxSerial= extract_U32(); + userDataLength = extract_U32(); userData = NULL; } +void cResponsePacket::extractOSDHeader() +{ + channelID = VNSI_CHANNEL_OSD; + + // set data pointers to header first + userData = header; + userDataLength = sizeof(header); + packetPos = 0; + + opcodeID = extract_U32(); + osdWnd = extract_S32(); + osdColor = extract_S32(); + osdX0 = extract_S32(); + osdY0 = extract_S32(); + osdX1 = extract_S32(); + osdY1 = extract_S32(); + userDataLength = extract_U32(); +} + bool cResponsePacket::end() { return (packetPos >= userDataLength); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/responsepacket.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/responsepacket.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/responsepacket.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/responsepacket.h 2014-01-04 10:28:12.000000000 +0000 @@ -32,9 +32,11 @@ void setResponse(uint8_t* packet, uint32_t packetLength); void setStatus(uint8_t* packet, uint32_t packetLength); void setStream(uint8_t* packet, uint32_t packetLength); + void setOSD(uint8_t* packet, uint32_t packetLength); void extractHeader(); void extractStreamHeader(); + void extractOSDHeader(); bool noResponse() { return (userData == NULL); }; int serverError(); @@ -47,6 +49,8 @@ uint32_t getDuration() { return duration; } int64_t getDTS() { return dts; } int64_t getPTS() { return pts; } + uint32_t getMuxSerial() { return muxSerial; } + void getOSDData(uint32_t &wnd, uint32_t &color, uint32_t &x0, uint32_t &y0, uint32_t &x1, uint32_t &y1); uint32_t getPacketPos() { return packetPos; } @@ -64,11 +68,12 @@ uint8_t* getUserData(); uint8_t* getHeader() { return header; }; - unsigned int getStreamHeaderLength() { return 32; }; + unsigned int getStreamHeaderLength() { return 36; }; unsigned int getHeaderLength() { return 8; }; + unsigned int getOSDHeaderLength() { return 32; } ; private: - uint8_t header[36]; + uint8_t header[40]; uint8_t* userData; uint32_t userDataLength; uint32_t packetPos; @@ -81,6 +86,11 @@ uint32_t duration; int64_t dts; int64_t pts; + uint32_t muxSerial; + + int32_t osdWnd; + int32_t osdColor; + int32_t osdX0,osdY0,osdX1,osdY1; bool ownBlock; }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/tools.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/tools.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/tools.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/tools.h 2014-01-04 10:28:19.000000000 +0000 @@ -21,6 +21,10 @@ */ #include +#include "client.h" uint64_t ntohll(uint64_t a); -uint64_t htonll(uint64_t a); \ No newline at end of file +uint64_t htonll(uint64_t a); + +#include "libXBMC_codec.h" +#include "xbmc_codec_descriptor.hpp" \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIAdmin.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIAdmin.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIAdmin.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIAdmin.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,1664 @@ +/* + * Copyright (C) 2005-2012 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "VNSIAdmin.h" +#include "responsepacket.h" +#include "requestpacket.h" +#include "vnsicommand.h" +#include +#include + +#if defined(HAVE_GL) +#include +#undef HAVE_GLES2 +#elif defined(HAS_DX) +#include "D3D9.h" +#include "D3DX9.h" +#elif defined(HAVE_GLES2) +#include "EGLHelpers/VisGUIShader.h" + +#ifndef M_PI +#define M_PI 3.141592654f +#endif +#define DEG2RAD(d) ( (d) * M_PI/180.0f ) + +//OpenGL wrapper - allows us to use same code of functions draw_bars and render +#define GL_PROJECTION MM_PROJECTION +#define GL_MODELVIEW MM_MODELVIEW + +#define glPushMatrix() vis_shader->PushMatrix() +#define glPopMatrix() vis_shader->PopMatrix() +#define glTranslatef(x,y,z) vis_shader->Translatef(x,y,z) +#define glRotatef(a,x,y,z) vis_shader->Rotatef(DEG2RAD(a),x,y,z) +#define glPolygonMode(a,b) ; +#define glBegin(a) vis_shader->Enable() +#define glEnd() vis_shader->Disable() +#define glMatrixMode(a) vis_shader->MatrixMode(a) +#define glLoadIdentity() vis_shader->LoadIdentity() +#define glFrustum(a,b,c,d,e,f) vis_shader->Frustum(a,b,c,d,e,f) + +GLenum g_mode = GL_TRIANGLES; +float g_fWaveform[2][512]; +const char *frag = "precision mediump float; \n" + "uniform sampler2D m_samp0; \n" + "varying vec4 m_cord0; \n" + "varying lowp vec4 m_colour; \n" + "void main () \n" + "{ \n" + " gl_FragColor.rgba = vec4(texture2D(m_samp0, m_cord0.xy).rgba * m_colour); \n" + "}\n"; + +const char *vert = "attribute vec4 m_attrpos;\n" + "attribute vec4 m_attrcol;\n" + "attribute vec4 m_attrcord0;\n" + "attribute vec4 m_attrcord1;\n" + "varying vec4 m_cord0;\n" + "varying vec4 m_cord1;\n" + "varying lowp vec4 m_colour;\n" + "uniform mat4 m_proj;\n" + "uniform mat4 m_model;\n" + "void main ()\n" + "{\n" + " mat4 mvp = m_proj * m_model;\n" + " gl_Position = mvp * m_attrpos;\n" + " m_colour = m_attrcol;\n" + " m_cord0 = m_attrcord0;\n" + " m_cord1 = m_attrcord1;\n" + "}\n"; + +CVisGUIShader *vis_shader = NULL; +#endif + +#if !defined(GL_UNPACK_ROW_LENGTH) +#undef HAVE_GLES2 +#endif + +#define CONTROL_RENDER_ADDON 9 +#define CONTROL_MENU 10 +#define CONTROL_OSD_BUTTON 13 +#define CONTROL_SPIN_TIMESHIFT_MODE 21 +#define CONTROL_SPIN_TIMESHIFT_BUFFER_RAM 22 +#define CONTROL_SPIN_TIMESHIFT_BUFFER_FILE 23 +#define CONTROL_LABEL_FILTERS 31 +#define CONTROL_RADIO_ISRADIO 32 +#define CONTROL_PROVIDERS_BUTTON 33 +#define CONTROL_CHANNELS_BUTTON 34 +#define CONTROL_FILTERSAVE_BUTTON 35 +#define CONTROL_ITEM_LIST 36 + +#define ACTION_NONE 0 +#define ACTION_MOVE_LEFT 1 +#define ACTION_MOVE_RIGHT 2 +#define ACTION_MOVE_UP 3 +#define ACTION_MOVE_DOWN 4 +#define ACTION_SELECT_ITEM 7 +#define ACTION_PREVIOUS_MENU 10 +#define ACTION_SHOW_INFO 11 + +#define REMOTE_0 58 // remote keys 0-9. are used by multiple windows +#define REMOTE_1 59 // for example in videoFullScreen.xml window id=2005 you can +#define REMOTE_2 60 // enter time (mmss) to jump to particular point in the movie +#define REMOTE_3 61 +#define REMOTE_4 62 // with spincontrols you can enter 3digit number to quickly set +#define REMOTE_5 63 // spincontrol to desired value +#define REMOTE_6 64 +#define REMOTE_7 65 +#define REMOTE_8 66 +#define REMOTE_9 67 +#define ACTION_NAV_BACK 92 + +#define ACTION_TELETEXT_RED 215 // Teletext Color buttons to control TopText +#define ACTION_TELETEXT_GREEN 216 // " " " " " " +#define ACTION_TELETEXT_YELLOW 217 // " " " " " " +#define ACTION_TELETEXT_BLUE 218 // " " " " " " + + +using namespace ADDON; + + +class cOSDTexture +{ +public: + cOSDTexture(int bpp, int x0, int y0, int x1, int y1); + virtual ~cOSDTexture(); + void SetPalette(int numColors, uint32_t *colors); + void SetBlock(int x0, int y0, int x1, int y1, int stride, void *data, int len); + void Clear(); + void GetSize(int &width, int &height); + void GetOrigin(int &x0, int &y0) { x0 = m_x0; y0 = m_y0;}; + bool IsDirty(int &x0, int &y0, int &x1, int &y1); + void *GetBuffer() {return (void*)m_buffer;}; +protected: + int m_x0, m_x1, m_y0, m_y1; + int m_dirtyX0, m_dirtyX1, m_dirtyY0, m_dirtyY1; + int m_bpp; + int m_numColors; + uint32_t m_palette[256]; + uint8_t *m_buffer; + bool m_dirty; +}; + +cOSDTexture::cOSDTexture(int bpp, int x0, int y0, int x1, int y1) +{ + m_bpp = bpp; + m_x0 = x0; + m_x1 = x1; + m_y0 = y0; + m_y1 = y1; + m_buffer = new uint8_t[(x1-x0+1)*(y1-y0+1)*sizeof(uint32_t)]; + memset(m_buffer,0, (x1-x0+1)*(y1-y0+1)*sizeof(uint32_t)); + m_dirtyX0 = m_dirtyY0 = 0; + m_dirtyX1 = x1 - x0; + m_dirtyY1 = y1 - y0; + m_dirty = false; +} + +cOSDTexture::~cOSDTexture() +{ + if (m_buffer) + { + delete [] m_buffer; + m_buffer = 0; + } +} + +void cOSDTexture::Clear() +{ + memset(m_buffer,0, (m_x1-m_x0+1)*(m_y1-m_y0+1)*sizeof(uint32_t)); + m_dirtyX0 = m_dirtyY0 = 0; + m_dirtyX1 = m_x1 - m_x0; + m_dirtyY1 = m_y1 - m_y0; + m_dirty = false; +} + +void cOSDTexture::SetBlock(int x0, int y0, int x1, int y1, int stride, void *data, int len) +{ + int line = y0; + int col; + int color; + int width = m_x1 - m_x0 + 1; + uint8_t *dataPtr = (uint8_t*)data; + int pos = 0; + uint32_t *buffer = (uint32_t*)m_buffer; + while (line <= y1) + { + int lastPos = pos; + col = x0; + int offset = line*width; + while (col <= x1) + { + if (pos >= len) + { + XBMC->Log(LOG_ERROR, "cOSDTexture::SetBlock: reached unexpected end of buffer"); + return; + } + color = dataPtr[pos]; + if (m_bpp == 8) + { + buffer[offset+col] = m_palette[color]; + } + else if (m_bpp == 4) + { + buffer[offset+col] = m_palette[color & 0x0F]; + } + else if (m_bpp == 2) + { + buffer[offset+col] = m_palette[color & 0x03]; + } + else if (m_bpp == 1) + { + buffer[offset+col] = m_palette[color & 0x01]; + } + pos++; + col++; + } + line++; + pos = lastPos + stride; + } + if (x0 < m_dirtyX0) m_dirtyX0 = x0; + if (x1 > m_dirtyX1) m_dirtyX1 = x1; + if (y0 < m_dirtyY0) m_dirtyY0 = y0; + if (y1 > m_dirtyY1) m_dirtyY1 = y1; + m_dirty = true; +} + +void cOSDTexture::SetPalette(int numColors, uint32_t *colors) +{ + m_numColors = numColors; + for (int i=0; i> 16) | ((colors[i] & 0x0000FF00)) | ((colors[i] & 0x000000FF) << 16); + } +} + +void cOSDTexture::GetSize(int &width, int &height) +{ + width = m_x1 - m_x0 + 1; + height = m_y1 - m_y0 + 1; +} + +bool cOSDTexture::IsDirty(int &x0, int &y0, int &x1, int &y1) +{ + bool ret = m_dirty; + x0 = m_dirtyX0; + x1 = m_dirtyX1; + y0 = m_dirtyY0; + y1 = m_dirtyY1; + m_dirty = false; + return ret; +} +//----------------------------------------------------------------------------- +#define MAX_TEXTURES 16 + +class cOSDRender +{ +public: + cOSDRender(); + virtual ~cOSDRender(); + void SetOSDSize(int width, int height) {m_osdWidth = width; m_osdHeight = height;}; + void SetControlSize(int width, int height) {m_controlWidth = width; m_controlHeight = height;}; + void AddTexture(int wndId, int bpp, int x0, int y0, int x1, int y1, int reset); + void SetPalette(int wndId, int numColors, uint32_t *colors); + void SetBlock(int wndId, int x0, int y0, int x1, int y1, int stride, void *data, int len); + void Clear(int wndId); + virtual void DisposeTexture(int wndId); + virtual void FreeResources(); + virtual void Render() {}; + virtual void SetDevice(void *device) {}; + virtual bool Init() { return true; }; +protected: + cOSDTexture *m_osdTextures[MAX_TEXTURES]; + std::queue m_disposedTextures; + int m_osdWidth, m_osdHeight; + int m_controlWidth, m_controlHeight; +}; + +cOSDRender::cOSDRender() +{ + for (int i = 0; i < MAX_TEXTURES; i++) + m_osdTextures[i] = 0; +} + +cOSDRender::~cOSDRender() +{ + for (int i = 0; i < MAX_TEXTURES; i++) + { + DisposeTexture(i); + } + FreeResources(); +} + +void cOSDRender::DisposeTexture(int wndId) +{ + if (m_osdTextures[wndId]) + { + m_disposedTextures.push(m_osdTextures[wndId]); + m_osdTextures[wndId] = 0; + } +} + +void cOSDRender::FreeResources() +{ + while (!m_disposedTextures.empty()) + { + delete m_disposedTextures.front(); + m_disposedTextures.pop(); + } +} + +void cOSDRender::AddTexture(int wndId, int bpp, int x0, int y0, int x1, int y1, int reset) +{ + if (reset) + DisposeTexture(wndId); + if (!m_osdTextures[wndId]) + m_osdTextures[wndId] = new cOSDTexture(bpp, x0, y0, x1, y1); +} + +void cOSDRender::Clear(int wndId) +{ + if (m_osdTextures[wndId]) + m_osdTextures[wndId]->Clear(); +} + +void cOSDRender::SetPalette(int wndId, int numColors, uint32_t *colors) +{ + if (m_osdTextures[wndId]) + m_osdTextures[wndId]->SetPalette(numColors, colors); +} + +void cOSDRender::SetBlock(int wndId, int x0, int y0, int x1, int y1, int stride, void *data, int len) +{ + if (m_osdTextures[wndId]) + m_osdTextures[wndId]->SetBlock(x0, y0, x1, y1, stride, data, len); +} + +#if defined(HAVE_GL) || defined(HAVE_GLES2) +class cOSDRenderGL : public cOSDRender +{ +public: + cOSDRenderGL(); + virtual ~cOSDRenderGL(); + virtual void DisposeTexture(int wndId); + virtual void FreeResources(); + virtual void Render(); + virtual bool Init(); +protected: + GLuint m_hwTextures[MAX_TEXTURES]; + std::queue m_disposedHwTextures; +}; + +cOSDRenderGL::cOSDRenderGL() +{ + for (int i = 0; i < MAX_TEXTURES; i++) + m_hwTextures[i] = 0; +} + +cOSDRenderGL::~cOSDRenderGL() +{ + for (int i = 0; i < MAX_TEXTURES; i++) + { + DisposeTexture(i); + } + FreeResources(); +#if defined(HAVE_GLES2) + if (vis_shader) + { + delete vis_shader; + vis_shader = NULL; + } +#endif +} + +bool cOSDRenderGL::Init() +{ +#if defined(HAVE_GLES2) + vis_shader = new CVisGUIShader(vert, frag); + + if(!vis_shader) + return false; + + if(!vis_shader->CompileAndLink()) + { + delete vis_shader; + return false; + } +#endif + return true; +} + +void cOSDRenderGL::DisposeTexture(int wndId) +{ + if (m_hwTextures[wndId]) + { + m_disposedHwTextures.push(m_hwTextures[wndId]); + m_hwTextures[wndId] = 0; + } + cOSDRender::DisposeTexture(wndId); +} + +void cOSDRenderGL::FreeResources() +{ + while (!m_disposedHwTextures.empty()) + { + if (glIsTexture(m_disposedHwTextures.front())) + { + glFinish(); + glDeleteTextures(1, &m_disposedHwTextures.front()); + m_disposedHwTextures.pop(); + } + } + cOSDRender::FreeResources(); +} + +void cOSDRenderGL::Render() +{ + glMatrixMode (GL_MODELVIEW); + glPushMatrix (); + glLoadIdentity (); + glMatrixMode (GL_PROJECTION); + glPushMatrix (); + glLoadIdentity (); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +#if defined(HAVE_GL) + glColor4f(1.0f, 1.0f, 1.0f, 0.75f); +#endif + + for (int i = 0; i < MAX_TEXTURES; i++) + { + int width, height, offsetX, offsetY; + int x0,x1,y0,y1; + bool dirty; + + if (m_osdTextures[i] == 0) + continue; + + m_osdTextures[i]->GetSize(width, height); + m_osdTextures[i]->GetOrigin(offsetX, offsetY); + dirty = m_osdTextures[i]->IsDirty(x0,y0,x1,y1); + + // create gl texture + if (dirty && !glIsTexture(m_hwTextures[i])) + { +#if defined(HAVE_GL) + glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT); +#endif + glEnable(GL_TEXTURE_2D); + glGenTextures(1, &m_hwTextures[i]); + glBindTexture(GL_TEXTURE_2D, m_hwTextures[i]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glPixelStorei(GL_UNPACK_ROW_LENGTH, width); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_osdTextures[i]->GetBuffer()); +#if defined(HAVE_GL) + glPopClientAttrib(); +#endif + } + // update texture + else if (dirty) + { +#if defined(HAVE_GL) + glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT); +#endif + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, m_hwTextures[i]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glPixelStorei(GL_UNPACK_ROW_LENGTH, width); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, x0); + glPixelStorei(GL_UNPACK_SKIP_ROWS, y0); + glTexSubImage2D(GL_TEXTURE_2D, 0, x0, y0, x1-x0+1, y1-y0+1, GL_RGBA, GL_UNSIGNED_BYTE, m_osdTextures[i]->GetBuffer()); +#if defined(HAVE_GL) + glPopClientAttrib(); +#endif + } + + // render texture + + // calculate ndc for OSD texture + float destX0 = (float)offsetX*2/m_osdWidth -1; + float destX1 = (float)(offsetX+width)*2/m_osdWidth -1; + float destY0 = (float)offsetY*2/m_osdHeight -1; + float destY1 = (float)(offsetY+height)*2/m_osdHeight -1; + float aspectControl = (float)m_controlWidth/m_controlHeight; + float aspectOSD = (float)m_osdWidth/m_osdHeight; + if (aspectOSD > aspectControl) + { + destY0 *= aspectControl/aspectOSD; + destY1 *= aspectControl/aspectOSD; + } + else if (aspectOSD < aspectControl) + { + destX0 *= aspectOSD/aspectControl; + destX1 *= aspectOSD/aspectControl; + } + + // y inveted + destY0 *= -1; + destY1 *= -1; + + glEnable(GL_TEXTURE_2D); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, m_hwTextures[i]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + +#if defined(HAVE_GL) + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glBegin(GL_QUADS); + glTexCoord2f(0.0, 0.0); glVertex2f(destX0, destY0); + glTexCoord2f(1.0, 0.0); glVertex2f(destX1, destY0); + glTexCoord2f(1.0, 1.0); glVertex2f(destX1, destY1); + glTexCoord2f(0.0, 1.0); glVertex2f(destX0, destY1); + glEnd(); + +#elif defined(HAVE_GLES2) + + GLubyte idx[4] = {0, 1, 3, 2}; //determines order of triangle strip + GLfloat ver[4][4]; + GLfloat tex[4][2]; + float col[4][3]; + + for (int index = 0;index < 4;++index) + { + col[index][0] = col[index][1] = col[index][2] = 1.0; + } + + glBegin(); + + GLint posLoc = vis_shader->GetPosLoc(); + GLint texLoc = vis_shader->GetCord0Loc(); + GLint colLoc = vis_shader->GetColLoc(); + + glVertexAttribPointer(posLoc, 4, GL_FLOAT, 0, 0, ver); + glVertexAttribPointer(texLoc, 2, GL_FLOAT, 0, 0, tex); + glVertexAttribPointer(colLoc, 3, GL_FLOAT, 0, 0, col); + + glEnableVertexAttribArray(posLoc); + glEnableVertexAttribArray(texLoc); + glEnableVertexAttribArray(colLoc); + + // Set vertex coordinates + for(int i = 0; i < 4; i++) + { + ver[i][2] = 0.0f;// set z to 0 + ver[i][3] = 1.0f; + } + ver[0][0] = ver[3][0] = destX0; + ver[0][1] = ver[1][1] = destY0; + ver[1][0] = ver[2][0] = destX1; + ver[2][1] = ver[3][1] = destY1; + + // Set texture coordinates + tex[0][0] = tex[3][0] = 0; + tex[0][1] = tex[1][1] = 0; + tex[1][0] = tex[2][0] = 1; + tex[2][1] = tex[3][1] = 1; + + glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, idx); + + glDisableVertexAttribArray(posLoc); + glDisableVertexAttribArray(texLoc); + glDisableVertexAttribArray(colLoc); + + glEnd(); +#endif + + glBindTexture (GL_TEXTURE_2D, 0); + glDisable(GL_TEXTURE_2D); + } + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); +} +#endif + +#if defined(HAS_DX) +class cOSDRenderDX : public cOSDRender +{ +public: + cOSDRenderDX(); + virtual ~cOSDRenderDX(); + virtual void DisposeTexture(int wndId); + virtual void FreeResources(); + virtual void Render(); + virtual void SetDevice(void *device) { m_device = (LPDIRECT3DDEVICE9)device; }; +protected: + LPDIRECT3DDEVICE9 m_device; + LPDIRECT3DTEXTURE9 m_hwTextures[MAX_TEXTURES]; + std::queue m_disposedHwTextures; +}; + +cOSDRenderDX::cOSDRenderDX() +{ + for (int i = 0; i < MAX_TEXTURES; i++) + m_hwTextures[i] = 0; +} + +cOSDRenderDX::~cOSDRenderDX() +{ + for (int i = 0; i < MAX_TEXTURES; i++) + { + DisposeTexture(i); + } + FreeResources(); +} + +void cOSDRenderDX::DisposeTexture(int wndId) +{ + if (m_hwTextures[wndId]) + { + m_disposedHwTextures.push(m_hwTextures[wndId]); + m_hwTextures[wndId] = 0; + } + cOSDRender::DisposeTexture(wndId); +} + +void cOSDRenderDX::FreeResources() +{ + while (!m_disposedHwTextures.empty()) + { + if (m_disposedHwTextures.front()) + { + m_disposedHwTextures.front()->Release(); + m_disposedHwTextures.pop(); + } + } + cOSDRender::FreeResources(); +} + +void cOSDRenderDX::Render() +{ + m_device->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DXCOLOR(0.0f, 0.0f, 0.0f, 0.0f), 1.0f, 0); + + D3DXMATRIX matProjection; + D3DXMatrixIdentity(&matProjection); + m_device->SetTransform(D3DTS_PROJECTION, &matProjection); + + D3DXMATRIX matView; + D3DXMatrixIdentity(&matView); + m_device->SetTransform(D3DTS_VIEW, &matView); + + D3DXMATRIX matWorld; + D3DXMatrixIdentity(&matWorld); + m_device->SetTransform(D3DTS_WORLD, &matWorld); + + for (int i = 0; i < MAX_TEXTURES; i++) + { + int width, height, offsetX, offsetY; + int x0,x1,y0,y1; + bool dirty; + + if (m_osdTextures[i] == 0) + continue; + + m_osdTextures[i]->GetSize(width, height); + m_osdTextures[i]->GetOrigin(offsetX, offsetY); + dirty = m_osdTextures[i]->IsDirty(x0,y0,x1,y1); + + // create texture + if (dirty && !m_hwTextures[i]) + { + HRESULT hr = m_device->CreateTexture(width, height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_hwTextures[i], NULL); + if (hr != D3D_OK) + { + XBMC->Log(LOG_ERROR,"%s - failed to create texture", __FUNCTION__); + continue; + } + } + // update texture + if (dirty) + { + D3DLOCKED_RECT lockedRect; + RECT dirtyRect; + dirtyRect.bottom = y1; + dirtyRect.left = x0; + dirtyRect.top = y0; + dirtyRect.right = x1; + HRESULT hr = m_hwTextures[i]->LockRect(0, &lockedRect, &dirtyRect, 0); + if (hr != D3D_OK) + { + XBMC->Log(LOG_ERROR,"%s - failed to lock texture", __FUNCTION__); + continue; + } + uint8_t *source = (uint8_t*)m_osdTextures[i]->GetBuffer(); + uint8_t *dest = (uint8_t*)lockedRect.pBits; + for(int y=y0; y<=y1; y++) + { + for(int x=x0; x<=x1; x++) + { + dest[y*lockedRect.Pitch+x*4] = source[y*width*4+x*4+2]; // blue + dest[y*lockedRect.Pitch+x*4+1] = source[y*width*4+x*4+1]; // green + dest[y*lockedRect.Pitch+x*4+2] = source[y*width*4+x*4]; // red + dest[y*lockedRect.Pitch+x*4+3] = source[y*width*4+x*4+3]; // alpha + } + } + m_hwTextures[i]->UnlockRect(0); + if (hr != D3D_OK) + { + XBMC->Log(LOG_ERROR,"%s - failed to unlock texture", __FUNCTION__); + continue; + } + } + + // render texture + + // calculate ndc for OSD texture + float destX0 = (float)offsetX*2/m_osdWidth -1; + float destX1 = (float)(offsetX+width)*2/m_osdWidth -1; + float destY0 = (float)offsetY*2/m_osdHeight -1; + float destY1 = (float)(offsetY+height)*2/m_osdHeight -1; + float aspectControl = (float)m_controlWidth/m_controlHeight; + float aspectOSD = (float)m_osdWidth/m_osdHeight; + if (aspectOSD > aspectControl) + { + destY0 *= aspectControl/aspectOSD; + destY1 *= aspectControl/aspectOSD; + } + else if (aspectOSD < aspectControl) + { + destX0 *= aspectOSD/aspectControl; + destX1 *= aspectOSD/aspectControl; + } + + // y inveted + destY0 *= -1; + destY1 *= -1; + + struct VERTEX + { + FLOAT x,y,z; + DWORD color; + FLOAT tu, tv; + }; + + VERTEX vertex[] = + { + { destX0, destY0, 0.0f, 0xffffffff, 0.0f, 0.0f }, + { destX0, destY1, 0.0f, 0xffffffff, 0.0f, 1.0f }, + { destX1, destY1, 0.0f, 0xffffffff, 1.0f, 1.0f }, + { destX1, destY0, 0.0f, 0xffffffff, 1.0f, 0.0f }, + }; + + m_device->SetTexture(0, m_hwTextures[i]); + HRESULT hr; + hr = m_device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); + hr = m_device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + hr = m_device->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); + hr = m_device->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + hr = m_device->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); + hr = m_device->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); + + hr = m_device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); + hr = m_device->SetRenderState(D3DRS_LIGHTING, FALSE); + hr = m_device->SetRenderState(D3DRS_ZENABLE, FALSE); + hr = m_device->SetRenderState(D3DRS_STENCILENABLE, FALSE); + hr = m_device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + hr = m_device->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); + hr = m_device->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); + hr = m_device->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA|D3DCOLORWRITEENABLE_BLUE|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_RED); + + hr = m_device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP); + hr = m_device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP); + + hr = m_device->SetPixelShader(NULL); + + hr = m_device->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1); + hr = m_device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, vertex, sizeof(VERTEX)); + if (hr != D3D_OK) + { + XBMC->Log(LOG_ERROR,"%s - failed to render texture", __FUNCTION__); + } + m_device->SetTexture(0, NULL); + } +} +#endif + + +//----------------------------------------------------------------------------- +cVNSIAdmin::cVNSIAdmin() +{ +} + +cVNSIAdmin::~cVNSIAdmin() +{ + +} + +bool cVNSIAdmin::Open(const std::string& hostname, int port, const char* name) +{ + + if(!cVNSIData::Open(hostname, port, name)) + return false; + + if(!cVNSIData::Login()) + return false; + + m_bIsOsdControl = false; +#if defined(HAVE_GL) || defined(HAVE_GLES2) + m_osdRender = new cOSDRenderGL(); +#elif defined(HAS_DX) + m_osdRender = new cOSDRenderDX(); +#else + m_osdRender = new cOSDRender(); +#endif + + if(!m_osdRender->Init()) + { + delete m_osdRender; + return false; + } + + if (!ConnectOSD()) + return false; + + // Load the Window as Dialog + m_window = GUI->Window_create("Admin.xml", "skin.confluence", false, true); + m_window->m_cbhdl = this; + m_window->CBOnInit = OnInitCB; + m_window->CBOnFocus = OnFocusCB; + m_window->CBOnClick = OnClickCB; + m_window->CBOnAction= OnActionCB; + + m_window->DoModal(); + + ClearListItems(); + m_window->ClearProperties(); + +#if defined(XBMC_GUI_API_VERSION) + GUI->Control_releaseRendering(m_renderControl); +#endif + + GUI->Control_releaseSpin(m_spinTimeshiftMode); + GUI->Control_releaseSpin(m_spinTimeshiftBufferRam); + GUI->Control_releaseSpin(m_spinTimeshiftBufferFile); + GUI->Control_releaseRadioButton(m_ratioIsRadio); + GUI->Window_destroy(m_window); + StopThread(); + Close(); + + if (m_osdRender) + { + delete m_osdRender; + } + + return true; +} + +bool cVNSIAdmin::OnClick(int controlId) +{ + if (controlId == CONTROL_SPIN_TIMESHIFT_MODE) + { + int value = m_spinTimeshiftMode->GetValue(); + cRequestPacket vrp; + if (!vrp.init(VNSI_STORESETUP) || + !vrp.add_String(CONFNAME_TIMESHIFT) || + !vrp.add_U32(value) || + ReadSuccess(&vrp)) + { + XBMC->Log(LOG_ERROR, "%s - failed to set timeshift mode", __FUNCTION__); + } + return true; + } + else if (controlId == CONTROL_SPIN_TIMESHIFT_BUFFER_RAM) + { + int value = m_spinTimeshiftBufferRam->GetValue(); + cRequestPacket vrp; + if (!vrp.init(VNSI_STORESETUP) || + !vrp.add_String(CONFNAME_TIMESHIFTBUFFERSIZE) || + !vrp.add_U32(value) || + ReadSuccess(&vrp)) + { + XBMC->Log(LOG_ERROR, "%s - failed to set timeshift buffer", __FUNCTION__); + } + return true; + } + else if (controlId == CONTROL_SPIN_TIMESHIFT_BUFFER_FILE) + { + int value = m_spinTimeshiftBufferFile->GetValue(); + cRequestPacket vrp; + if (!vrp.init(VNSI_STORESETUP) || + !vrp.add_String(CONFNAME_TIMESHIFTBUFFERFILESIZE) || + !vrp.add_U32(value) || + ReadSuccess(&vrp)) + { + XBMC->Log(LOG_ERROR, "%s - failed to set timeshift buffer file", __FUNCTION__); + } + return true; + } + else if (controlId == CONTROL_PROVIDERS_BUTTON) + { + if(!m_channels.m_loaded || m_ratioIsRadio->IsSelected() != m_channels.m_radio) + { + ReadChannelList(m_ratioIsRadio->IsSelected()); + ReadChannelWhitelist(m_ratioIsRadio->IsSelected()); + ReadChannelBlacklist(m_ratioIsRadio->IsSelected()); + m_channels.CreateProviders(); + m_channels.LoadProviderWhitelist(); + m_channels.LoadChannelBlacklist(); + m_channels.m_loaded = true; + m_channels.m_radio = m_ratioIsRadio->IsSelected(); + m_window->SetProperty("IsDirty", "0"); + } + LoadListItemsProviders(); + m_channels.m_mode = CVNSIChannels::PROVIDER; + } + else if (controlId == CONTROL_CHANNELS_BUTTON) + { + if(!m_channels.m_loaded || m_ratioIsRadio->IsSelected() != m_channels.m_radio) + { + ReadChannelList(m_ratioIsRadio->IsSelected()); + ReadChannelWhitelist(m_ratioIsRadio->IsSelected()); + ReadChannelBlacklist(m_ratioIsRadio->IsSelected()); + m_channels.CreateProviders(); + m_channels.LoadProviderWhitelist(); + m_channels.LoadChannelBlacklist(); + m_channels.m_loaded = true; + m_channels.m_radio = m_ratioIsRadio->IsSelected(); + m_window->SetProperty("IsDirty", "0"); + } + LoadListItemsChannels(); + m_channels.m_mode = CVNSIChannels::CHANNEL; + } + else if (controlId == CONTROL_FILTERSAVE_BUTTON) + { + if(m_channels.m_loaded) + { + SaveChannelWhitelist(m_ratioIsRadio->IsSelected()); + SaveChannelBlacklist(m_ratioIsRadio->IsSelected()); + m_window->SetProperty("IsDirty", "0"); + } + } + else if (controlId == CONTROL_ITEM_LIST) + { + if(m_channels.m_mode == CVNSIChannels::PROVIDER) + { + int pos = m_window->GetCurrentListPosition(); + GUIHANDLE hdl = m_window->GetListItem(pos); + int idx = m_listItemsMap[hdl]; + CAddonListItem *item = m_listItems[idx]; + if (m_channels.m_providers[idx].m_whitelist) + { + item->SetProperty("IsWhitelist", "false"); + m_channels.m_providers[idx].m_whitelist = false; + } + else + { + item->SetProperty("IsWhitelist", "true"); + m_channels.m_providers[idx].m_whitelist = true; + } + m_window->SetProperty("IsDirty", "1"); + } + else if(m_channels.m_mode == CVNSIChannels::CHANNEL) + { + int pos = m_window->GetCurrentListPosition(); + GUIHANDLE hdl = m_window->GetListItem(pos); + int idx = m_listItemsMap[hdl]; + CAddonListItem *item = m_listItems[idx]; + int channelidx = m_listItemsChannelsMap[hdl]; + if (m_channels.m_channels[channelidx].m_blacklist) + { + item->SetProperty("IsBlacklist", "false"); + m_channels.m_channels[channelidx].m_blacklist = false; + } + else + { + item->SetProperty("IsBlacklist", "true"); + m_channels.m_channels[channelidx].m_blacklist = true; + } + m_window->SetProperty("IsDirty", "1"); + } + } + return false; +} + +bool cVNSIAdmin::OnFocus(int controlId) +{ +#if defined(XBMC_GUI_API_VERSION) + if (controlId == CONTROL_OSD_BUTTON) + { + m_window->SetControlLabel(CONTROL_OSD_BUTTON, XBMC->GetLocalizedString(30102)); + m_window->MarkDirtyRegion(); + m_bIsOsdControl = true; + return true; + } + else if (m_bIsOsdControl) + { + m_window->SetControlLabel(CONTROL_OSD_BUTTON, XBMC->GetLocalizedString(30103)); + m_window->MarkDirtyRegion(); + m_bIsOsdControl = false; + return true; + } +#endif + return false; +} + +bool cVNSIAdmin::OnInit() +{ +#if defined(XBMC_GUI_API_VERSION) + m_renderControl = GUI->Control_getRendering(m_window, CONTROL_RENDER_ADDON); + m_renderControl->m_cbhdl = this; + m_renderControl->CBCreate = CreateCB; + m_renderControl->CBRender = RenderCB; + m_renderControl->CBStop = StopCB; + m_renderControl->CBDirty = DirtyCB; + m_renderControl->Init(); + + cRequestPacket vrp; + if (!vrp.init(VNSI_OSD_HITKEY)) + { + XBMC->Log(LOG_ERROR, "%s - Can't init cRequestPacket", __FUNCTION__); + return false; + } + vrp.add_U32(0); + cVNSISession::TransmitMessage(&vrp); +#endif + + // setup parameters + m_spinTimeshiftMode = GUI->Control_getSpin(m_window, CONTROL_SPIN_TIMESHIFT_MODE); + m_spinTimeshiftMode->Clear(); + m_spinTimeshiftMode->AddLabel("OFF", 0); + m_spinTimeshiftMode->AddLabel("RAM", 1); + m_spinTimeshiftMode->AddLabel("FILE", 2); + + { + cRequestPacket vrp; + if (!vrp.init(VNSI_GETSETUP) || !vrp.add_String(CONFNAME_TIMESHIFT)) + { + XBMC->Log(LOG_ERROR, "%s - failed to get timeshift mode", __FUNCTION__); + return false; + } + cResponsePacket *resp = ReadResult(&vrp); + if (!resp) + { + XBMC->Log(LOG_ERROR, "%s - failed to get timeshift mode", __FUNCTION__); + return false; + } + int mode = resp->extract_U32(); + m_spinTimeshiftMode->SetValue(mode); + delete resp; + } + + m_spinTimeshiftBufferRam = GUI->Control_getSpin(m_window, CONTROL_SPIN_TIMESHIFT_BUFFER_RAM); + m_spinTimeshiftBufferRam->Clear(); + char buffer[8]; + for (int i = 1; i <= 40; i++) + { + sprintf(buffer, "%d", i); + m_spinTimeshiftBufferRam->AddLabel(buffer, i); + } + + { + cRequestPacket vrp; + if (!vrp.init(VNSI_GETSETUP) || !vrp.add_String(CONFNAME_TIMESHIFTBUFFERSIZE)) + { + XBMC->Log(LOG_ERROR, "%s - failed to get timeshift buffer size", __FUNCTION__); + return false; + } + cResponsePacket *resp = ReadResult(&vrp); + if (!resp) + { + XBMC->Log(LOG_ERROR, "%s - failed to get timeshift buffer size", __FUNCTION__); + return false; + } + int mode = resp->extract_U32(); + m_spinTimeshiftBufferRam->SetValue(mode); + delete resp; + } + m_spinTimeshiftBufferFile = GUI->Control_getSpin(m_window, CONTROL_SPIN_TIMESHIFT_BUFFER_FILE); + m_spinTimeshiftBufferFile->Clear(); + for (int i = 1; i <= 20; i++) + { + sprintf(buffer, "%d", i); + m_spinTimeshiftBufferFile->AddLabel(buffer, i); + } + + { + cRequestPacket vrp; + if (!vrp.init(VNSI_GETSETUP) || !vrp.add_String(CONFNAME_TIMESHIFTBUFFERFILESIZE)) + { + XBMC->Log(LOG_ERROR, "%s - failed to get timeshift buffer (file) size", __FUNCTION__); + return false; + } + cResponsePacket *resp = ReadResult(&vrp); + if (!resp) + { + XBMC->Log(LOG_ERROR, "%s - failed to get timeshift buffer (file) size", __FUNCTION__); + return false; + } + int mode = resp->extract_U32(); + m_spinTimeshiftBufferFile->SetValue(mode); + delete resp; + } + + // channel filters + m_ratioIsRadio = GUI->Control_getRadioButton(m_window, CONTROL_RADIO_ISRADIO); + + return true; +} + +bool cVNSIAdmin::OnAction(int actionId) +{ + if (m_window->GetFocusId() != CONTROL_OSD_BUTTON && m_bIsOsdControl) + { + m_bIsOsdControl = false; + m_window->SetControlLabel(CONTROL_OSD_BUTTON, XBMC->GetLocalizedString(30103)); +#if defined(XBMC_GUI_API_VERSION) + m_window->MarkDirtyRegion(); +#endif + } + else if (m_window->GetFocusId() == CONTROL_OSD_BUTTON) + { + if (actionId == ACTION_SHOW_INFO) + { + m_window->SetFocusId(CONTROL_MENU); + return true; + } + else if(IsVdrAction(actionId)) + { + // send all actions to vdr + cRequestPacket vrp; + if (!vrp.init(VNSI_OSD_HITKEY)) + { + XBMC->Log(LOG_ERROR, "%s - Can't init cRequestPacket", __FUNCTION__); + return false; + } + vrp.add_U32(actionId); + cVNSISession::TransmitMessage(&vrp); + return true; + } + } + + if (actionId == ADDON_ACTION_CLOSE_DIALOG || + actionId == ADDON_ACTION_PREVIOUS_MENU || + actionId == ACTION_NAV_BACK) + { + m_window->Close(); + return true; + } + + if (actionId == ACTION_SELECT_ITEM) + { + if (m_window->GetFocusId() == CONTROL_MENU) + { + const char *tmp = m_window->GetProperty("menu"); + //if (strncmp(m_window->GetProperty("menu"), "osd", 3) == 0) + if (strncmp(tmp, "osd", 3) == 0) + { +#if defined(XBMC_GUI_API_VERSION) + m_window->MarkDirtyRegion(); +#endif + } + } + } + + return false; +} + +bool cVNSIAdmin::IsVdrAction(int action) +{ + if (action == ACTION_MOVE_LEFT || + action == ACTION_MOVE_RIGHT || + action == ACTION_MOVE_UP || + action == ACTION_MOVE_DOWN || + action == ACTION_SELECT_ITEM || + action == ACTION_PREVIOUS_MENU || + action == REMOTE_0 || + action == REMOTE_1 || + action == REMOTE_2 || + action == REMOTE_3 || + action == REMOTE_4 || + action == REMOTE_5 || + action == REMOTE_6 || + action == REMOTE_7 || + action == REMOTE_8 || + action == REMOTE_9 || + action == ACTION_NAV_BACK || + action == ACTION_TELETEXT_RED || + action == ACTION_TELETEXT_GREEN || + action == ACTION_TELETEXT_YELLOW || + action == ACTION_TELETEXT_BLUE) + return true; + else + return false; +} + +bool cVNSIAdmin::Create(int x, int y, int w, int h, void* device) +{ + if (m_osdRender) + { + m_osdRender->SetControlSize(w,h); + m_osdRender->SetDevice(device); + } + return true; +} + +void cVNSIAdmin::Render() +{ + m_osdMutex.Lock(); + if (m_osdRender) + { + m_osdRender->Render(); + m_osdRender->FreeResources(); + } + m_bIsOsdDirty = false; + m_osdMutex.Unlock(); +} + +void cVNSIAdmin::Stop() +{ + m_osdMutex.Lock(); + if (m_osdRender) + { + delete m_osdRender; + m_osdRender = NULL; + } + m_osdMutex.Unlock(); +} + +bool cVNSIAdmin::Dirty() +{ + return m_bIsOsdDirty; +} + +bool cVNSIAdmin::OnInitCB(GUIHANDLE cbhdl) +{ + cVNSIAdmin* osd = static_cast(cbhdl); + return osd->OnInit(); +} + +bool cVNSIAdmin::OnClickCB(GUIHANDLE cbhdl, int controlId) +{ + cVNSIAdmin* osd = static_cast(cbhdl); + return osd->OnClick(controlId); +} + +bool cVNSIAdmin::OnFocusCB(GUIHANDLE cbhdl, int controlId) +{ + cVNSIAdmin* osd = static_cast(cbhdl); + return osd->OnFocus(controlId); +} + +bool cVNSIAdmin::OnActionCB(GUIHANDLE cbhdl, int actionId) +{ + cVNSIAdmin* osd = static_cast(cbhdl); + return osd->OnAction(actionId); +} + +bool cVNSIAdmin::CreateCB(GUIHANDLE cbhdl, int x, int y, int w, int h, void *device) +{ + cVNSIAdmin* osd = static_cast(cbhdl); + return osd->Create(x, y, w, h, device); +} + +void cVNSIAdmin::RenderCB(GUIHANDLE cbhdl) +{ + cVNSIAdmin* osd = static_cast(cbhdl); + osd->Render(); +} + +void cVNSIAdmin::StopCB(GUIHANDLE cbhdl) +{ + cVNSIAdmin* osd = static_cast(cbhdl); + osd->Stop(); +} + +bool cVNSIAdmin::DirtyCB(GUIHANDLE cbhdl) +{ + cVNSIAdmin* osd = static_cast(cbhdl); + return osd->Dirty(); +} + +bool cVNSIAdmin::OnResponsePacket(cResponsePacket* resp) +{ + if (resp->getChannelID() == VNSI_CHANNEL_OSD) + { + uint32_t wnd, color, x0, y0, x1, y1, len; + uint8_t *data; + resp->getOSDData(wnd, color, x0, y0, x1, y1); + if (wnd >= MAX_TEXTURES) + { + XBMC->Log(LOG_ERROR, "cVNSIAdmin::OnResponsePacket - invalid wndId: %s", wnd); + return true; + } + if (resp->getOpCodeID() == VNSI_OSD_OPEN) + { + data = resp->getUserData(); + len = resp->getUserDataLength(); + m_osdMutex.Lock(); + if (m_osdRender) + m_osdRender->AddTexture(wnd, color, x0, y0, x1, y1, data[0]); + m_osdMutex.Unlock(); + free(data); + } + else if (resp->getOpCodeID() == VNSI_OSD_SETPALETTE) + { + data = resp->getUserData(); + len = resp->getUserDataLength(); + m_osdMutex.Lock(); + if (m_osdRender) + m_osdRender->SetPalette(wnd, x0, (uint32_t*)data); + m_osdMutex.Unlock(); + free(data); + } + else if (resp->getOpCodeID() == VNSI_OSD_SETBLOCK) + { + data = resp->getUserData(); + len = resp->getUserDataLength(); + m_osdMutex.Lock(); + if (m_osdRender) + { + m_osdRender->SetBlock(wnd, x0, y0, x1, y1, color, data, len); + m_bIsOsdDirty = true; + } + m_osdMutex.Unlock(); + free(data); + } + else if (resp->getOpCodeID() == VNSI_OSD_CLEAR) + { + m_osdMutex.Lock(); + if (m_osdRender) + m_osdRender->Clear(wnd); + m_bIsOsdDirty = true; + m_osdMutex.Unlock(); + } + else if (resp->getOpCodeID() == VNSI_OSD_CLOSE) + { + m_osdMutex.Lock(); + if (m_osdRender) + m_osdRender->DisposeTexture(wnd); + m_bIsOsdDirty = true; + m_osdMutex.Unlock(); + } + else if (resp->getOpCodeID() == VNSI_OSD_MOVEWINDOW) + { + } + else + return false; + } + else + return false; + + return true; +} + +bool cVNSIAdmin::ConnectOSD() +{ + cRequestPacket vrp; + if (!vrp.init(VNSI_OSD_CONNECT)) + return false; + + cResponsePacket* vresp = ReadResult(&vrp); + if (vresp == NULL || vresp->noResponse()) + { + delete vresp; + return false; + } + uint32_t osdWidth = vresp->extract_U32(); + uint32_t osdHeight = vresp->extract_U32(); + if (m_osdRender) + m_osdRender->SetOSDSize(osdWidth, osdHeight); + delete vresp; + + return true; +} + +bool cVNSIAdmin::ReadChannelList(bool radio) +{ + cRequestPacket vrp; + if (!vrp.init(VNSI_CHANNELS_GETCHANNELS)) + { + XBMC->Log(LOG_ERROR, "%s - Can't init cRequestPacket", __FUNCTION__); + return false; + } + if (!vrp.add_U32(radio)) + { + XBMC->Log(LOG_ERROR, "%s - Can't add parameter to cRequestPacket", __FUNCTION__); + return false; + } + if (!vrp.add_U8(0)) // apply no filter + { + XBMC->Log(LOG_ERROR, "%s - Can't add parameter to cRequestPacket", __FUNCTION__); + return false; + } + + cResponsePacket* vresp = ReadResult(&vrp); + if (!vresp) + { + XBMC->Log(LOG_ERROR, "%s - Can't get response packed", __FUNCTION__); + return false; + } + + m_channels.m_channels.clear(); + m_channels.m_channelsMap.clear(); + while (!vresp->end()) + { + CChannel channel; + channel.m_blacklist = false; + + channel.m_number = vresp->extract_U32(); + char *strChannelName = vresp->extract_String(); + channel.m_name = strChannelName; + char *strProviderName = vresp->extract_String(); + channel.m_provider = strProviderName; + channel.m_id = vresp->extract_U32(); + vresp->extract_U32(); // first caid + char *strCaids = vresp->extract_String(); + channel.SetCaids(strCaids); + channel.m_radio = radio; + + delete[] strChannelName; + delete[] strProviderName; + delete[] strCaids; + m_channels.m_channels.push_back(channel); + m_channels.m_channelsMap[channel.m_id] = m_channels.m_channels.size() - 1; + } + delete vresp; + + return true; +} + +bool cVNSIAdmin::ReadChannelWhitelist(bool radio) +{ + cRequestPacket vrp; + if (!vrp.init(VNSI_CHANNELS_GETWHITELIST)) + { + XBMC->Log(LOG_ERROR, "%s - Can't init cRequestPacket", __FUNCTION__); + return false; + } + if (!vrp.add_U8(radio)) + { + XBMC->Log(LOG_ERROR, "%s - Can't add parameter to cRequestPacket", __FUNCTION__); + return false; + } + + cResponsePacket* vresp = ReadResult(&vrp); + if (!vresp) + { + XBMC->Log(LOG_ERROR, "%s - Can't get response packed", __FUNCTION__); + return false; + } + + m_channels.m_providerWhitelist.clear(); + CProvider provider; + while (!vresp->end()) + { + char *strProviderName = vresp->extract_String(); + provider.m_name = strProviderName; + provider.m_caid = vresp->extract_U32(); + m_channels.m_providerWhitelist.push_back(provider); + delete [] strProviderName; + } + delete vresp; + + return true; +} + +bool cVNSIAdmin::SaveChannelWhitelist(bool radio) +{ + m_channels.ExtractProviderWhitelist(); + + cRequestPacket vrp; + if (!vrp.init(VNSI_CHANNELS_SETWHITELIST)) + { + XBMC->Log(LOG_ERROR, "%s - Can't init cRequestPacket", __FUNCTION__); + return false; + } + if (!vrp.add_U8(radio)) + { + XBMC->Log(LOG_ERROR, "%s - Can't add parameter to cRequestPacket", __FUNCTION__); + return false; + } + + for(unsigned int i=0; iLog(LOG_ERROR, "%s - Can't get response packed", __FUNCTION__); + return false; + } + + return true; +} + +bool cVNSIAdmin::ReadChannelBlacklist(bool radio) +{ + cRequestPacket vrp; + if (!vrp.init(VNSI_CHANNELS_GETBLACKLIST)) + { + XBMC->Log(LOG_ERROR, "%s - Can't init cRequestPacket", __FUNCTION__); + return false; + } + if (!vrp.add_U8(radio)) + { + XBMC->Log(LOG_ERROR, "%s - Can't add parameter to cRequestPacket", __FUNCTION__); + return false; + } + + cResponsePacket* vresp = ReadResult(&vrp); + if (!vresp) + { + XBMC->Log(LOG_ERROR, "%s - Can't get response packed", __FUNCTION__); + return false; + } + + m_channels.m_channelBlacklist.clear(); + while (!vresp->end()) + { + int id = vresp->extract_U32(); + m_channels.m_channelBlacklist.push_back(id); + } + delete vresp; + + return true; +} + +bool cVNSIAdmin::SaveChannelBlacklist(bool radio) +{ + m_channels.ExtractChannelBlacklist(); + + cRequestPacket vrp; + if (!vrp.init(VNSI_CHANNELS_SETBLACKLIST)) + { + XBMC->Log(LOG_ERROR, "%s - Can't init cRequestPacket", __FUNCTION__); + return false; + } + if (!vrp.add_U8(radio)) + { + XBMC->Log(LOG_ERROR, "%s - Can't add parameter to cRequestPacket", __FUNCTION__); + return false; + } + + for(unsigned int i=0; iLog(LOG_ERROR, "%s - Can't get response packed", __FUNCTION__); + return false; + } + + return true; +} + +void cVNSIAdmin::ClearListItems() +{ + m_window->ClearList(); + std::vector::iterator it; + for(it=m_listItems.begin(); it!=m_listItems.end(); ++it) + { + GUI->ListItem_destroy(*it); + } + m_listItems.clear(); + m_listItemsMap.clear(); + m_listItemsChannelsMap.clear(); +} + +void cVNSIAdmin::LoadListItemsProviders() +{ + ClearListItems(); + + std::vector::iterator it; + int count = 0; + for(it=m_channels.m_providers.begin(); it!=m_channels.m_providers.end(); ++it) + { + std::string tmp; + if(!it->m_name.empty()) + tmp = it->m_name; + else + tmp = XBMC->GetLocalizedString(30114); + if (it->m_caid == 0) + { + tmp += " - FTA"; + } + else + { + tmp += " - CAID: "; + char buf[16]; + sprintf(buf, "%04x", it->m_caid); + tmp += buf; + } + + CAddonListItem *item = GUI->ListItem_create(tmp.c_str(), NULL, NULL, NULL, NULL); + m_window->AddItem(item, count); + GUIHANDLE hdl = m_window->GetListItem(count); + m_listItems.push_back(item); + m_listItemsMap[hdl] = count; + + if (it->m_whitelist) + item->SetProperty("IsWhitelist", "true"); + else + item->SetProperty("IsWhitelist", "false"); + + count++; + } +} + +void cVNSIAdmin::LoadListItemsChannels() +{ + ClearListItems(); + + int count = 0; + std::string tmp; + for(unsigned int i=0; iGetLocalizedString(30114); + tmp += ")"; + CAddonListItem *item = GUI->ListItem_create(tmp.c_str(), NULL, NULL, NULL, NULL); + m_window->AddItem(item, count); + GUIHANDLE hdl = m_window->GetListItem(count); + m_listItems.push_back(item); + m_listItemsMap[hdl] = count; + m_listItemsChannelsMap[hdl] = i; + + if (m_channels.m_channels[i].m_blacklist) + item->SetProperty("IsBlacklist", "true"); + else + item->SetProperty("IsBlacklist", "false"); + + count++; + } +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIAdmin.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIAdmin.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIAdmin.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIAdmin.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,93 @@ +#pragma once + +/* + * Copyright (C) 2005-2012 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "VNSIData.h" +#include "VNSIChannels.h" +#include "client.h" + +class cOSDRender; + +class cVNSIAdmin : public cVNSIData +{ +public: + + cVNSIAdmin(); + ~cVNSIAdmin(); + + bool Open(const std::string& hostname, int port, const char* name = "XBMC osd client"); + + bool OnClick(int controlId); + bool OnFocus(int controlId); + bool OnInit(); + bool OnAction(int actionId); + + bool Create(int x, int y, int w, int h, void* device); + void Render(); + void Stop(); + bool Dirty(); + + static bool OnClickCB(GUIHANDLE cbhdl, int controlId); + static bool OnFocusCB(GUIHANDLE cbhdl, int controlId); + static bool OnInitCB(GUIHANDLE cbhdl); + static bool OnActionCB(GUIHANDLE cbhdl, int actionId); + + static bool CreateCB(GUIHANDLE cbhdl, int x, int y, int w, int h, void *device); + static void RenderCB(GUIHANDLE cbhdl); + static void StopCB(GUIHANDLE cbhdl); + static bool DirtyCB(GUIHANDLE cbhdl); + +protected: + virtual bool OnResponsePacket(cResponsePacket* resp); + virtual void OnDisconnect() {}; + virtual void OnReconnect() {}; + bool ConnectOSD(); + bool IsVdrAction(int action); + bool ReadChannelList(bool radio); + bool ReadChannelWhitelist(bool radio); + bool ReadChannelBlacklist(bool radio); + bool SaveChannelWhitelist(bool radio); + bool SaveChannelBlacklist(bool radio); + void ClearListItems(); + void LoadListItemsProviders(); + void LoadListItemsChannels(); + +private: + + CAddonGUIWindow *m_window; +#if defined(XBMC_GUI_API_VERSION) + CAddonGUIRenderingControl *m_renderControl; +#endif + CAddonGUISpinControl *m_spinTimeshiftMode; + CAddonGUISpinControl *m_spinTimeshiftBufferRam; + CAddonGUISpinControl *m_spinTimeshiftBufferFile; + CAddonGUIRadioButton *m_ratioIsRadio; + std::vector m_listItems; + std::map m_listItemsMap; + std::map m_listItemsChannelsMap; + CVNSIChannels m_channels; + bool m_bIsOsdControl; + bool m_bIsOsdDirty; + int m_width, m_height; + int m_osdWidth, m_osdHeight; + cOSDRender *m_osdRender; + PLATFORM::CMutex m_osdMutex; +}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIChannelScan.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIChannelScan.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIChannelScan.cpp 2012-11-15 21:18:19.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIChannelScan.cpp 2014-01-04 10:28:19.000000000 +0000 @@ -507,7 +507,7 @@ if (requestID == VNSI_SCANNER_PERCENTAGE) { uint32_t percent = resp->extract_U32(); - if (percent >= 0 && percent <= 100) + if (percent <= 100) SetProgress(percent); } else if (requestID == VNSI_SCANNER_SIGNAL) diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIChannels.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIChannels.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIChannels.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIChannels.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,195 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "VNSIChannels.h" +#include + +CProvider::CProvider() + :m_name(""), m_caid(0), m_whitelist(false) +{ + +} + +CProvider::CProvider(std::string name, int caid) + :m_name(name), m_caid(caid), m_whitelist(false) +{ +}; + +bool CProvider::operator==(const CProvider &rhs) +{ + if (rhs.m_caid != m_caid) + return false; + if (rhs.m_name.compare(m_name) != 0) + return false; + return true; +} + +void CChannel::SetCaids(char *caids) +{ + m_caids.clear(); + std::string strCaids = caids; + size_t pos = strCaids.find("caids:"); + if(pos == strCaids.npos) + return; + + strCaids.erase(0,6); + std::string token; + int caid; + char *pend; + while ((pos = strCaids.find(";")) != strCaids.npos) + { + token = strCaids.substr(0, pos); + caid = strtol(token.c_str(), &pend, 10); + m_caids.push_back(caid); + strCaids.erase(0, pos+1); + } + if (strCaids.length() > 1) + { + caid = strtol(strCaids.c_str(), &pend, 10); + m_caids.push_back(caid); + } +} + +CVNSIChannels::CVNSIChannels() +{ + m_loaded = false; + m_mode = NONE; + m_radio = false; +} + +void CVNSIChannels::CreateProviders() +{ + std::vector::iterator c_it; + std::vector::iterator p_it; + CProvider provider; + m_providers.clear(); + for (c_it=m_channels.begin(); c_it!=m_channels.end(); ++c_it) + { + provider.m_name = c_it->m_provider; + for(unsigned int i=0; im_caids.size(); i++) + { + provider.m_caid = c_it->m_caids[i]; + p_it = std::find(m_providers.begin(), m_providers.end(), provider); + if (p_it == m_providers.end()) + { + m_providers.push_back(provider); + } + } + if (c_it->m_caids.size() == 0) + { + provider.m_caid = 0; + p_it = std::find(m_providers.begin(), m_providers.end(), provider); + if (p_it == m_providers.end()) + { + m_providers.push_back(provider); + } + } + } +} + +void CVNSIChannels::LoadProviderWhitelist() +{ + std::vector::iterator p_it; + + bool select = m_providerWhitelist.empty(); + for(p_it=m_providers.begin(); p_it!=m_providers.end(); ++p_it) + { + p_it->m_whitelist = select; + } + + std::vector::iterator w_it; + for(w_it=m_providerWhitelist.begin(); w_it!=m_providerWhitelist.end(); ++w_it) + { + p_it = std::find(m_providers.begin(), m_providers.end(), *w_it); + if(p_it != m_providers.end()) + { + p_it->m_whitelist = true; + } + } +} + +void CVNSIChannels::LoadChannelBlacklist() +{ + std::map::iterator it; + for(unsigned int i=0; isecond; + m_channels[idx].m_blacklist = true; + } + } +} + +void CVNSIChannels::ExtractProviderWhitelist() +{ + std::vector::iterator it; + m_providerWhitelist.clear(); + for(it=m_providers.begin(); it!=m_providers.end(); ++it) + { + if(it->m_whitelist) + m_providerWhitelist.push_back(*it); + } + if(m_providerWhitelist.size() == m_providers.size()) + { + m_providerWhitelist.clear(); + } + else if (m_providerWhitelist.size() == 0) + { + m_providerWhitelist.clear(); + CProvider provider; + provider.m_name = "no whitelist"; + provider.m_caid = 0; + m_providerWhitelist.push_back(provider); + } +} + +void CVNSIChannels::ExtractChannelBlacklist() +{ + m_channelBlacklist.clear(); + for(unsigned int i=0; i::iterator p_it; + provider.m_name = channel.m_provider; + if (channel.m_caids.empty()) + { + provider.m_caid = 0; + p_it = std::find(m_providers.begin(), m_providers.end(), provider); + if(p_it!=m_providers.end() && p_it->m_whitelist) + return true; + } + for(unsigned int i=0; im_whitelist) + return true; + } + return false; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIChannels.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIChannels.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIChannels.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIChannels.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,73 @@ +#pragma once + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "VNSIData.h" + +class CProvider +{ +public: + CProvider(); + CProvider(std::string name, int caid); + bool operator==(const CProvider &rhs); + std::string m_name; + int m_caid; + bool m_whitelist; +}; + +class CChannel +{ +public: + void SetCaids(char *caids); + unsigned int m_id; + unsigned int m_number; + std::string m_name; + std::string m_provider; + bool m_radio; + std::vector m_caids; + bool m_blacklist; +}; + +class CVNSIChannels +{ +public: + CVNSIChannels(); + void CreateProviders(); + void LoadProviderWhitelist(); + void LoadChannelBlacklist(); + void ExtractProviderWhitelist(); + void ExtractChannelBlacklist(); + bool IsWhitelist(CChannel &channel); + std::vector m_channels; + std::map m_channelsMap; + std::vector m_providers; + std::vector m_providerWhitelist; + std::vector m_channelBlacklist; + bool m_loaded; + bool m_radio; + + enum + { + NONE, + PROVIDER, + CHANNEL + }m_mode; +}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/vnsicommand.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/vnsicommand.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/vnsicommand.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/vnsicommand.h 2014-01-28 20:43:50.000000000 +0000 @@ -23,27 +23,36 @@ #define VNSI_COMMAND_H /** Current VNSI Protocol Version number */ -#define VNSIPROTOCOLVERSION 3 - +#define VNSI_PROTOCOLVERSION 5 /** Packet types */ #define VNSI_CHANNEL_REQUEST_RESPONSE 1 #define VNSI_CHANNEL_STREAM 2 +#define VNSI_CHANNEL_KEEPALIVE 3 +#define VNSI_CHANNEL_NETLOG 4 #define VNSI_CHANNEL_STATUS 5 #define VNSI_CHANNEL_SCAN 6 - +#define VNSI_CHANNEL_OSD 7 /** Response packets operation codes */ +#define CONFNAME_PMTTIMEOUT "PmtTimeout" +#define CONFNAME_TIMESHIFT "Timeshift" +#define CONFNAME_TIMESHIFTBUFFERSIZE "TimeshiftBufferSize" +#define CONFNAME_TIMESHIFTBUFFERFILESIZE "TimeshiftBufferFileSize" + /* OPCODE 1 - 19: VNSI network functions for general purpose */ #define VNSI_LOGIN 1 #define VNSI_GETTIME 2 #define VNSI_ENABLESTATUSINTERFACE 3 #define VNSI_PING 7 +#define VNSI_GETSETUP 8 +#define VNSI_STORESETUP 9 /* OPCODE 20 - 39: VNSI network functions for live streaming */ -#define VNSI_CHANNELSTREAM_OPEN 20 -#define VNSI_CHANNELSTREAM_CLOSE 21 +#define VNSI_CHANNELSTREAM_OPEN 20 +#define VNSI_CHANNELSTREAM_CLOSE 21 +#define VNSI_CHANNELSTREAM_SEEK 22 /* OPCODE 40 - 59: VNSI network functions for recording streaming */ #define VNSI_RECSTREAM_OPEN 40 @@ -52,6 +61,7 @@ #define VNSI_RECSTREAM_POSTOFRAME 43 #define VNSI_RECSTREAM_FRAMETOPOS 44 #define VNSI_RECSTREAM_GETIFRAME 45 +#define VNSI_RECSTREAM_GETLENGTH 46 /* OPCODE 60 - 79: VNSI network functions for channel access */ #define VNSI_CHANNELS_GETCOUNT 61 @@ -59,6 +69,11 @@ #define VNSI_CHANNELGROUP_GETCOUNT 65 #define VNSI_CHANNELGROUP_LIST 66 #define VNSI_CHANNELGROUP_MEMBERS 67 +#define VNSI_CHANNELS_GETCAIDS 68 +#define VNSI_CHANNELS_GETWHITELIST 69 +#define VNSI_CHANNELS_GETBLACKLIST 70 +#define VNSI_CHANNELS_SETWHITELIST 71 +#define VNSI_CHANNELS_SETBLACKLIST 72 /* OPCODE 80 - 99: VNSI network functions for timer access */ #define VNSI_TIMER_GETCOUNT 80 @@ -74,6 +89,7 @@ #define VNSI_RECORDINGS_GETLIST 102 #define VNSI_RECORDINGS_RENAME 103 #define VNSI_RECORDINGS_DELETE 104 +#define VNSI_RECORDINGS_GETEDL 105 /* OPCODE 120 - 139: VNSI network functions for epg access and manipulating */ #define VNSI_EPG_GETFORCHANNEL 120 @@ -85,6 +101,10 @@ #define VNSI_SCAN_START 143 #define VNSI_SCAN_STOP 144 +/* OPCODE 160 - 179: VNSI network functions for channel scanning */ +#define VNSI_OSD_CONNECT 160 +#define VNSI_OSD_DISCONNECT 161 +#define VNSI_OSD_HITKEY 162 /** Stream packet types (server -> client) */ #define VNSI_STREAM_CHANGE 1 @@ -93,6 +113,8 @@ #define VNSI_STREAM_MUXPKT 4 #define VNSI_STREAM_SIGNALINFO 5 #define VNSI_STREAM_CONTENTINFO 6 +#define VNSI_STREAM_BUFFERSTATS 7 +#define VNSI_STREAM_REFTIME 8 /** Scan packet types (server -> client) */ #define VNSI_SCANNER_PERCENTAGE 1 @@ -103,12 +125,21 @@ #define VNSI_SCANNER_FINISHED 6 #define VNSI_SCANNER_STATUS 7 +/** OSD packet types (server -> client) */ +#define VNSI_OSD_MOVEWINDOW 1 +#define VNSI_OSD_CLEAR 2 +#define VNSI_OSD_OPEN 3 +#define VNSI_OSD_CLOSE 4 +#define VNSI_OSD_SETPALETTE 5 +#define VNSI_OSD_SETBLOCK 6 + /** Status packet types (server -> client) */ #define VNSI_STATUS_TIMERCHANGE 1 #define VNSI_STATUS_RECORDING 2 #define VNSI_STATUS_MESSAGE 3 #define VNSI_STATUS_CHANNELCHANGE 4 #define VNSI_STATUS_RECORDINGSCHANGE 5 +#define VNSI_STATUS_EPGCHANGE 6 /** Packet return codes */ #define VNSI_RET_OK 0 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIData.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIData.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIData.cpp 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIData.cpp 2014-01-04 10:28:19.000000000 +0000 @@ -210,6 +210,11 @@ XBMC->Log(LOG_ERROR, "%s - Can't add parameter to cRequestPacket", __FUNCTION__); return false; } + if (!vrp.add_U8(1)) // apply filter + { + XBMC->Log(LOG_ERROR, "%s - Can't add parameter to cRequestPacket", __FUNCTION__); + return false; + } cResponsePacket* vresp = ReadResult(&vrp); if (!vresp) @@ -224,16 +229,18 @@ memset(&tag, 0 , sizeof(tag)); tag.iChannelNumber = vresp->extract_U32(); - char *strChannelName = vresp->extract_String(); + char *strChannelName = vresp->extract_String(); strncpy(tag.strChannelName, strChannelName, sizeof(tag.strChannelName) - 1); + char *strProviderName = vresp->extract_String(); tag.iUniqueId = vresp->extract_U32(); - vresp->extract_U32(); // still here for compatibility tag.iEncryptionSystem = vresp->extract_U32(); - vresp->extract_U32(); // uint32_t vtype - currently unused + char *strCaids = vresp->extract_String(); tag.bIsRadio = radio; PVR->TransferChannelEntry(handle, &tag); delete[] strChannelName; + delete[] strProviderName; + delete[] strCaids; } delete vresp; @@ -456,10 +463,6 @@ } } - if(strlen(timerinfo.strTitle) > 0) { - path += timerinfo.strTitle; - } - // replace directory separators for(std::size_t i=0; i 0) { + path += timerinfo.strTitle; + } + if(path.empty()) { XBMC->Log(LOG_ERROR, "%s - Empty filename !", __FUNCTION__); return PVR_ERROR_UNKNOWN; @@ -744,32 +751,46 @@ return PVR_ERROR_NO_ERROR; } -bool cVNSIData::OnResponsePacket(cResponsePacket* pkt) +PVR_ERROR cVNSIData::GetRecordingEdl(const PVR_RECORDING& recinfo, PVR_EDL_ENTRY edl[], int *size) { - return false; -} - -bool cVNSIData::SendPing() -{ - XBMC->Log(LOG_DEBUG, "%s", __FUNCTION__); - cRequestPacket vrp; - if (!vrp.init(VNSI_PING)) + if (!vrp.init(VNSI_RECORDINGS_GETEDL)) { XBMC->Log(LOG_ERROR, "%s - Can't init cRequestPacket", __FUNCTION__); - return false; + return PVR_ERROR_UNKNOWN; + } + + if (!vrp.add_U32(atoi(recinfo.strRecordingId))) + return PVR_ERROR_UNKNOWN; + + cResponsePacket* vresp = ReadResult(&vrp); + if (vresp == NULL || vresp->noResponse()) + { + delete vresp; + return PVR_ERROR_UNKNOWN; + } + + *size = 0; + while (!vresp->end() && *size < PVR_ADDON_EDL_LENGTH) + { + edl[*size].start = vresp->extract_S64(); + edl[*size].end = vresp->extract_S64(); + edl[*size].type = (PVR_EDL_TYPE)vresp->extract_S32(); + (*size)++; } - cResponsePacket* vresp = cVNSISession::ReadResult(&vrp); delete vresp; - return (vresp != NULL); + return PVR_ERROR_NO_ERROR; } -void *cVNSIData::Process() +bool cVNSIData::OnResponsePacket(cResponsePacket* pkt) { - uint32_t lastPing = 0; + return false; +} +void *cVNSIData::Process() +{ cResponsePacket* vresp; while (!IsStopped()) @@ -788,21 +809,7 @@ continue; } - // check if the connection is still up - if (vresp == NULL) - { - if(time(NULL) - lastPing > 5) - { - lastPing = time(NULL); - -// if(!SendPing()) -// SignalConnectionLost(); - } - continue; - } - // CHANNEL_REQUEST_RESPONSE - if (vresp->getChannelID() == VNSI_CHANNEL_REQUEST_RESPONSE) { CLockObject lock(m_mutex); @@ -847,11 +854,11 @@ else if (vresp->getRequestID() == VNSI_STATUS_RECORDING) { vresp->extract_U32(); // device currently unused - uint32_t on = vresp->extract_U32(); + vresp->extract_U32(); // on (not used) char* str1 = vresp->extract_String(); char* str2 = vresp->extract_String(); - PVR->Recording(str1, str2, on!=0?true:false); +// PVR->Recording(str1, str2, on!=0?true:false); PVR->TriggerTimerUpdate(); delete[] str1; @@ -872,6 +879,12 @@ XBMC->Log(LOG_DEBUG, "Server requested recordings update"); PVR->TriggerRecordingUpdate(); } + else if (vresp->getRequestID() == VNSI_STATUS_EPGCHANGE) + { + uint32_t channel = vresp->extract_U32(); + XBMC->Log(LOG_DEBUG, "Server requested Epg update for channel: %d", channel); + PVR->TriggerEpgUpdate(channel); + } delete vresp; } @@ -961,6 +974,7 @@ vrp.add_String(group.strGroupName); vrp.add_U8(group.bIsRadio); + vrp.add_U8(1); // filter channels cResponsePacket* vresp = ReadResult(&vrp); if (vresp == NULL || vresp->noResponse()) diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIData.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIData.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIData.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIData.h 2014-01-04 10:28:12.000000000 +0000 @@ -63,6 +63,7 @@ PVR_ERROR GetRecordingsList(ADDON_HANDLE handle); PVR_ERROR RenameRecording(const PVR_RECORDING& recinfo, const char* newname); PVR_ERROR DeleteRecording(const PVR_RECORDING& recinfo); + PVR_ERROR GetRecordingEdl(const PVR_RECORDING& recinfo, PVR_EDL_ENTRY edl[], int *size); cResponsePacket* ReadResult(cRequestPacket* vrp); @@ -71,13 +72,11 @@ virtual void *Process(void); virtual bool OnResponsePacket(cResponsePacket *pkt); - void OnDisconnect(); - void OnReconnect(); + virtual void OnDisconnect(); + virtual void OnReconnect(); private: - bool SendPing(); - struct SMessage { PLATFORM::CEvent *event; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIDemux.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIDemux.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIDemux.cpp 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIDemux.cpp 2014-01-04 10:28:19.000000000 +0000 @@ -22,20 +22,16 @@ #include #include #include -#include "avcodec.h" // For codec id's #include "VNSIDemux.h" #include "responsepacket.h" #include "requestpacket.h" #include "vnsicommand.h" +#include "tools.h" using namespace ADDON; cVNSIDemux::cVNSIDemux() { - for (unsigned int i = 0; i < PVR_STREAM_MAX_STREAMS; i++) - m_Streams.stream[i].iCodecType = AVMEDIA_TYPE_UNKNOWN; - m_Streams.iStreamCount = 0; - m_StreamIndex.clear(); } cVNSIDemux::~cVNSIDemux() @@ -56,39 +52,12 @@ bool cVNSIDemux::GetStreamProperties(PVR_STREAM_PROPERTIES* props) { - props->iStreamCount = m_Streams.iStreamCount; - for (unsigned int i = 0; i < m_Streams.iStreamCount; i++) - { - props->stream[i].iPhysicalId = m_Streams.stream[i].iPhysicalId; - props->stream[i].iCodecType = m_Streams.stream[i].iCodecType; - props->stream[i].iCodecId = m_Streams.stream[i].iCodecId; - props->stream[i].strLanguage[0] = m_Streams.stream[i].strLanguage[0]; - props->stream[i].strLanguage[1] = m_Streams.stream[i].strLanguage[1]; - props->stream[i].strLanguage[2] = m_Streams.stream[i].strLanguage[2]; - props->stream[i].strLanguage[3] = m_Streams.stream[i].strLanguage[3]; - props->stream[i].iIdentifier = m_Streams.stream[i].iIdentifier; - props->stream[i].iFPSScale = m_Streams.stream[i].iFPSScale; - props->stream[i].iFPSRate = m_Streams.stream[i].iFPSRate; - props->stream[i].iHeight = m_Streams.stream[i].iHeight; - props->stream[i].iWidth = m_Streams.stream[i].iWidth; - props->stream[i].fAspect = m_Streams.stream[i].fAspect; - props->stream[i].iChannels = m_Streams.stream[i].iChannels; - props->stream[i].iSampleRate = m_Streams.stream[i].iSampleRate; - props->stream[i].iBlockAlign = m_Streams.stream[i].iBlockAlign; - props->stream[i].iBitRate = m_Streams.stream[i].iBitRate; - props->stream[i].iBitsPerSample = m_Streams.stream[i].iBitsPerSample; - - - } - return (props->iStreamCount > 0); + return m_streams.GetProperties(props); } void cVNSIDemux::Abort() { - for (unsigned int i = 0; i < PVR_STREAM_MAX_STREAMS; i++) - m_Streams.stream[i].iCodecType = AVMEDIA_TYPE_UNKNOWN; - m_Streams.iStreamCount = 0; - m_StreamIndex.clear(); + m_streams.Clear(); } DemuxPacket* cVNSIDemux::Read() @@ -98,7 +67,7 @@ return NULL; } - cResponsePacket *resp = ReadMessage(1000,1000); + cResponsePacket *resp = ReadMessage(1000, g_iConnectTimeout * 1000); if(resp == NULL) return PVR->AllocateDemuxPacket(0); @@ -139,13 +108,10 @@ else if (resp->getOpCodeID() == VNSI_STREAM_MUXPKT) { // figure out the stream id for this packet - int iStreamId = -1; - std::map::iterator it = m_StreamIndex.find(resp->getStreamID()); - if (it != m_StreamIndex.end()) - iStreamId = it->second; + int iStreamId = m_streams.GetStreamId(resp->getStreamID()); // stream found ? - if(iStreamId != -1) + if(iStreamId != -1 && resp->getMuxSerial() == m_MuxPacketSerial) { DemuxPacket* p = (DemuxPacket*)resp->getUserData(); p->iSize = resp->getUserDataLength(); @@ -154,31 +120,110 @@ p->pts = (double)resp->getPTS() * DVD_TIME_BASE / 1000000; p->iStreamId = iStreamId; delete resp; + + if (p->dts != DVD_NOPTS_VALUE) + m_CurrentDTS = p->dts; + else if (p->pts != DVD_NOPTS_VALUE) + m_CurrentDTS = p->pts; return p; } + else if (iStreamId != -1 && resp->getMuxSerial() != m_MuxPacketSerial) + { + // ignore silently, may happen after a seek + XBMC->Log(LOG_DEBUG, "-------------------- serial: %d", resp->getMuxSerial()); + } else { XBMC->Log(LOG_DEBUG, "stream id %i not found", resp->getStreamID()); } } + else if (resp->getOpCodeID() == VNSI_STREAM_BUFFERSTATS) + { + m_bTimeshift = resp->extract_U8(); + m_BufferTimeStart = resp->extract_U32(); + m_BufferTimeEnd = resp->extract_U32(); + } + else if (resp->getOpCodeID() == VNSI_STREAM_REFTIME) + { + m_ReferenceTime = resp->extract_U32(); + m_ReferenceDTS = (double)resp->extract_U64() * DVD_TIME_BASE / 1000000; + } delete resp; return PVR->AllocateDemuxPacket(0); } +bool cVNSIDemux::SeekTime(int time, bool backwards, double *startpts) +{ + cRequestPacket vrp; + + int64_t seek_pts = (int64_t)time * 1000; + if (startpts) + *startpts = seek_pts; + + if (!vrp.init(VNSI_CHANNELSTREAM_SEEK) || + !vrp.add_S64(seek_pts) || + !vrp.add_U8(backwards)) + { + XBMC->Log(LOG_ERROR, "%s - failed to seek1", __FUNCTION__); + return false; + } + cResponsePacket *resp = ReadResult(&vrp); + if (!resp) + { + XBMC->Log(LOG_ERROR, "%s - failed to seek2", __FUNCTION__); + return false; + } + uint32_t retCode = resp->extract_U32(); + uint32_t serial = resp->extract_U32(); + delete resp; + + if (retCode == VNSI_RET_OK) + { + m_MuxPacketSerial = serial; + return true; + } + else + return false; +} + bool cVNSIDemux::SwitchChannel(const PVR_CHANNEL &channelinfo) { XBMC->Log(LOG_DEBUG, "changing to channel %d", channelinfo.iChannelNumber); - cRequestPacket vrp; - if (!vrp.init(VNSI_CHANNELSTREAM_OPEN) || !vrp.add_U32(channelinfo.iUniqueId) || !ReadSuccess(&vrp)) + cRequestPacket vrp1; + + if (!vrp1.init(VNSI_GETSETUP) || !vrp1.add_String(CONFNAME_TIMESHIFT)) + { + XBMC->Log(LOG_ERROR, "%s - failed to get timeshift mode", __FUNCTION__); + return false; + } + cResponsePacket *resp = ReadResult(&vrp1); + if (!resp) + { + XBMC->Log(LOG_ERROR, "%s - failed to get timeshift mode", __FUNCTION__); + return false; + } + m_bTimeshift = resp->extract_U32(); + delete resp; + + cRequestPacket vrp2; + if (!vrp2.init(VNSI_CHANNELSTREAM_OPEN) || + !vrp2.add_U32(channelinfo.iUniqueId) || + !vrp2.add_S32(g_iPriority) || + !vrp2.add_U8(1) || + !ReadSuccess(&vrp2)) { XBMC->Log(LOG_ERROR, "%s - failed to set channel", __FUNCTION__); return false; } m_channelinfo = channelinfo; - m_Streams.iStreamCount = 0; + m_streams.Clear(); + m_MuxPacketSerial = 0; + m_ReferenceTime = 0; + m_BufferTimeStart = 0; + m_BufferTimeEnd = 0; return true; } @@ -201,237 +246,105 @@ return true; } +time_t cVNSIDemux::GetPlayingTime() +{ + time_t ret; + ret = m_ReferenceTime + (m_CurrentDTS - m_ReferenceDTS) / DVD_TIME_BASE; + return ret; +} + +time_t cVNSIDemux::GetBufferTimeStart() +{ + return m_BufferTimeStart; +} + +time_t cVNSIDemux::GetBufferTimeEnd() +{ + return m_BufferTimeEnd; +} + void cVNSIDemux::StreamChange(cResponsePacket *resp) { - PVR_STREAM_PROPERTIES streams; - streams.iStreamCount = 0; - std::map streamIndex; + std::vector newStreams; while (!resp->end()) { uint32_t pid = resp->extract_U32(); const char* type = resp->extract_String(); - streamIndex[pid] = streams.iStreamCount; - - streams.stream[streams.iStreamCount].iFPSScale = 0; - streams.stream[streams.iStreamCount].iFPSRate = 0; - streams.stream[streams.iStreamCount].iHeight = 0; - streams.stream[streams.iStreamCount].iWidth = 0; - streams.stream[streams.iStreamCount].fAspect = 0.0; - - streams.stream[streams.iStreamCount].iChannels = 0; - streams.stream[streams.iStreamCount].iSampleRate = 0; - streams.stream[streams.iStreamCount].iBlockAlign = 0; - streams.stream[streams.iStreamCount].iBitRate = 0; - streams.stream[streams.iStreamCount].iBitsPerSample = 0; + XbmcPvrStream newStream; + m_streams.GetStreamData(pid, &newStream); - std::map::iterator it = m_StreamIndex.find(pid); - if (it != m_StreamIndex.end()) - { - memcpy((void*)&streams.stream[streams.iStreamCount], (void*)&m_Streams.stream[m_StreamIndex[pid]], - sizeof(PVR_STREAM_PROPERTIES::PVR_STREAM)); - } - - if(!strcmp(type, "AC3")) - { - streams.stream[streams.iStreamCount].iPhysicalId = pid; - streams.stream[streams.iStreamCount].iCodecType = AVMEDIA_TYPE_AUDIO; - streams.stream[streams.iStreamCount].iCodecId = CODEC_ID_AC3; - } - else if(!strcmp(type, "MPEG2AUDIO")) - { - streams.stream[streams.iStreamCount].iPhysicalId = pid; - streams.stream[streams.iStreamCount].iCodecType = AVMEDIA_TYPE_AUDIO; - streams.stream[streams.iStreamCount].iCodecId = CODEC_ID_MP2; - } - else if(!strcmp(type, "AAC")) + CodecDescriptor codecId = CodecDescriptor::GetCodecByName(type); + if (codecId.Codec().codec_type != XBMC_CODEC_TYPE_UNKNOWN) { - streams.stream[streams.iStreamCount].iPhysicalId = pid; - streams.stream[streams.iStreamCount].iCodecType = AVMEDIA_TYPE_AUDIO; - streams.stream[streams.iStreamCount].iCodecId = CODEC_ID_AAC; - } - else if(!strcmp(type, "AACLATM")) - { - streams.stream[streams.iStreamCount].iPhysicalId = pid; - streams.stream[streams.iStreamCount].iCodecType = AVMEDIA_TYPE_AUDIO; - streams.stream[streams.iStreamCount].iCodecId = CODEC_ID_AAC_LATM; - } - else if(!strcmp(type, "DTS")) - { - streams.stream[streams.iStreamCount].iPhysicalId = pid; - streams.stream[streams.iStreamCount].iCodecType = AVMEDIA_TYPE_AUDIO; - streams.stream[streams.iStreamCount].iCodecId = CODEC_ID_DTS; - } - else if(!strcmp(type, "EAC3")) - { - streams.stream[streams.iStreamCount].iPhysicalId = pid; - streams.stream[streams.iStreamCount].iCodecType = AVMEDIA_TYPE_AUDIO; - streams.stream[streams.iStreamCount].iCodecId = CODEC_ID_EAC3; - } - else if(!strcmp(type, "MPEG2VIDEO")) - { - streams.stream[streams.iStreamCount].iPhysicalId = pid; - streams.stream[streams.iStreamCount].iCodecType = AVMEDIA_TYPE_VIDEO; - streams.stream[streams.iStreamCount].iCodecId = CODEC_ID_MPEG2VIDEO; - } - else if(!strcmp(type, "H264")) - { - streams.stream[streams.iStreamCount].iPhysicalId = pid; - streams.stream[streams.iStreamCount].iCodecType = AVMEDIA_TYPE_VIDEO; - streams.stream[streams.iStreamCount].iCodecId = CODEC_ID_H264; - } - else if(!strcmp(type, "DVBSUB")) - { - streams.stream[streams.iStreamCount].iPhysicalId = pid; - streams.stream[streams.iStreamCount].iCodecType = AVMEDIA_TYPE_SUBTITLE; - streams.stream[streams.iStreamCount].iCodecId = CODEC_ID_DVB_SUBTITLE; - } - else if(!strcmp(type, "TEXTSUB")) - { - streams.stream[streams.iStreamCount].iPhysicalId = pid; - streams.stream[streams.iStreamCount].iCodecType = AVMEDIA_TYPE_SUBTITLE; - streams.stream[streams.iStreamCount].iCodecId = CODEC_ID_TEXT; - } - else if(!strcmp(type, "TELETEXT")) - { - streams.stream[streams.iStreamCount].iPhysicalId = pid; - streams.stream[streams.iStreamCount].iCodecType = AVMEDIA_TYPE_SUBTITLE; - streams.stream[streams.iStreamCount].iCodecId = CODEC_ID_DVB_TELETEXT; + newStream.iPhysicalId = pid; + newStream.iCodecType = codecId.Codec().codec_type; + newStream.iCodecId = codecId.Codec().codec_id; } else { - m_Streams.iStreamCount = 0; return; } - if (streams.stream[streams.iStreamCount].iCodecType == AVMEDIA_TYPE_AUDIO) + if (codecId.Codec().codec_type == XBMC_CODEC_TYPE_AUDIO) { const char *language = resp->extract_String(); - streams.stream[streams.iStreamCount].iChannels = resp->extract_U32(); - streams.stream[streams.iStreamCount].iSampleRate = resp->extract_U32(); - streams.stream[streams.iStreamCount].iBlockAlign = resp->extract_U32(); - streams.stream[streams.iStreamCount].iBitRate = resp->extract_U32(); - streams.stream[streams.iStreamCount].iBitsPerSample = resp->extract_U32(); - streams.stream[streams.iStreamCount].strLanguage[0] = language[0]; - streams.stream[streams.iStreamCount].strLanguage[1] = language[1]; - streams.stream[streams.iStreamCount].strLanguage[2] = language[2]; - streams.stream[streams.iStreamCount].strLanguage[3] = 0; - streams.stream[streams.iStreamCount].iIdentifier = -1; - streams.iStreamCount++; + newStream.iChannels = resp->extract_U32(); + newStream.iSampleRate = resp->extract_U32(); + newStream.iBlockAlign = resp->extract_U32(); + newStream.iBitRate = resp->extract_U32(); + newStream.iBitsPerSample = resp->extract_U32(); + newStream.strLanguage[0] = language[0]; + newStream.strLanguage[1] = language[1]; + newStream.strLanguage[2] = language[2]; + newStream.strLanguage[3] = 0; + newStream.iIdentifier = -1; + + newStreams.push_back(newStream); + } + else if (codecId.Codec().codec_type == XBMC_CODEC_TYPE_VIDEO) + { + newStream.iFPSScale = resp->extract_U32(); + newStream.iFPSRate = resp->extract_U32(); + newStream.iHeight = resp->extract_U32(); + newStream.iWidth = resp->extract_U32(); + newStream.fAspect = (float)resp->extract_Double(); + newStream.strLanguage[0] = 0; + newStream.strLanguage[1] = 0; + newStream.strLanguage[2] = 0; + newStream.strLanguage[3] = 0; + newStream.iIdentifier = -1; - delete[] language; + newStreams.push_back(newStream); } - else if (streams.stream[streams.iStreamCount].iCodecType == AVMEDIA_TYPE_VIDEO) - { - streams.stream[streams.iStreamCount].iFPSScale = resp->extract_U32(); - streams.stream[streams.iStreamCount].iFPSRate = resp->extract_U32(); - streams.stream[streams.iStreamCount].iHeight = resp->extract_U32(); - streams.stream[streams.iStreamCount].iWidth = resp->extract_U32(); - streams.stream[streams.iStreamCount].fAspect = (float)resp->extract_Double(); - streams.stream[streams.iStreamCount].strLanguage[0] = 0; - streams.stream[streams.iStreamCount].strLanguage[1] = 0; - streams.stream[streams.iStreamCount].strLanguage[2] = 0; - streams.stream[streams.iStreamCount].strLanguage[3] = 0; - streams.stream[streams.iStreamCount].iIdentifier = -1; - streams.iStreamCount++; - - } - else if (streams.stream[streams.iStreamCount].iCodecType == AVMEDIA_TYPE_SUBTITLE) + else if (codecId.Codec().codec_type == XBMC_CODEC_TYPE_SUBTITLE) { const char *language = resp->extract_String(); uint32_t composition_id = resp->extract_U32(); uint32_t ancillary_id = resp->extract_U32(); - streams.stream[streams.iStreamCount].strLanguage[0] = language[0]; - streams.stream[streams.iStreamCount].strLanguage[1] = language[1]; - streams.stream[streams.iStreamCount].strLanguage[2] = language[2]; - streams.stream[streams.iStreamCount].strLanguage[3] = 0; - streams.stream[streams.iStreamCount].iIdentifier = (composition_id & 0xffff) | ((ancillary_id & 0xffff) << 16); - streams.iStreamCount++; + newStream.strLanguage[0] = language[0]; + newStream.strLanguage[1] = language[1]; + newStream.strLanguage[2] = language[2]; + newStream.strLanguage[3] = 0; + newStream.iIdentifier = (composition_id & 0xffff) | ((ancillary_id & 0xffff) << 16); + + newStreams.push_back(newStream); delete[] language; } else { - m_Streams.iStreamCount = 0; + m_streams.Clear(); + delete[] type; return; } delete[] type; - - if (streams.iStreamCount >= PVR_STREAM_MAX_STREAMS) - { - XBMC->Log(LOG_ERROR, "%s - max amount of streams reached", __FUNCTION__); - break; - } } - std::map::iterator itl, itr; - // delete streams we don't have in streams - itl = m_StreamIndex.begin(); - while (itl != m_StreamIndex.end()) - { - itr = streamIndex.find(itl->first); - if (itr == streamIndex.end()) - { - m_Streams.stream[itl->second].iCodecType = AVMEDIA_TYPE_UNKNOWN; - m_Streams.stream[itl->second].iCodecId = CODEC_ID_NONE; - m_StreamIndex.erase(itl); - itl = m_StreamIndex.begin(); - } - else - ++itl; - } - // copy known streams - for (itl = m_StreamIndex.begin(); itl != m_StreamIndex.end(); ++itl) - { - itr = streamIndex.find(itl->first); - memcpy((void*)&m_Streams.stream[itl->second], (void*)&streams.stream[itr->second], - sizeof(PVR_STREAM_PROPERTIES::PVR_STREAM)); - streamIndex.erase(itr); - } - - // place video stream at pos 0 - for (itr = streamIndex.begin(); itr != streamIndex.end(); ++itr) - { - if (streams.stream[itr->second].iCodecType == AVMEDIA_TYPE_VIDEO) - break; - } - if (itr != streamIndex.end()) - { - m_StreamIndex[itr->first] = 0; - memcpy((void*)&m_Streams.stream[0], (void*)&streams.stream[itr->second], - sizeof(PVR_STREAM_PROPERTIES::PVR_STREAM)); - streamIndex.erase(itr); - } - - // fill the gaps or append after highest index - while (!streamIndex.empty()) - { - // find first unused index - unsigned int i; - for (i = 0; i < PVR_STREAM_MAX_STREAMS; i++) - { - if (m_Streams.stream[i].iCodecType == (unsigned)AVMEDIA_TYPE_UNKNOWN) - break; - } - itr = streamIndex.begin(); - m_StreamIndex[itr->first] = i; - memcpy((void*)&m_Streams.stream[i], (void*)&streams.stream[itr->second], - sizeof(PVR_STREAM_PROPERTIES::PVR_STREAM)); - streamIndex.erase(itr); - } - - // set streamCount - m_Streams.iStreamCount = 0; - for (itl = m_StreamIndex.begin(); itl != m_StreamIndex.end(); ++itl) - { - if (itl->second > m_Streams.iStreamCount) - m_Streams.iStreamCount = itl->second; - } - if (!m_StreamIndex.empty()) - m_Streams.iStreamCount++; + m_streams.UpdateStreams(newStreams); } void cVNSIDemux::StreamStatus(cResponsePacket *resp) @@ -463,64 +376,58 @@ bool cVNSIDemux::StreamContentInfo(cResponsePacket *resp) { - PVR_STREAM_PROPERTIES old = m_Streams; - + ADDON::XbmcStreamProperties streams = m_streams; while (!resp->end()) { uint32_t pid = resp->extract_U32(); - unsigned int i; - for (i = 0; i < m_Streams.iStreamCount; i++) + PVR_STREAM_PROPERTIES::PVR_STREAM* props = streams.GetStreamById(pid); + if (props) { - if (pid == m_Streams.stream[i].iPhysicalId) + if (props->iCodecType == XBMC_CODEC_TYPE_AUDIO) { - if (m_Streams.stream[i].iCodecType == AVMEDIA_TYPE_AUDIO) - { - const char *language = resp->extract_String(); - - m_Streams.stream[i].iChannels = resp->extract_U32(); - m_Streams.stream[i].iSampleRate = resp->extract_U32(); - m_Streams.stream[i].iBlockAlign = resp->extract_U32(); - m_Streams.stream[i].iBitRate = resp->extract_U32(); - m_Streams.stream[i].iBitsPerSample = resp->extract_U32(); - m_Streams.stream[i].strLanguage[0] = language[0]; - m_Streams.stream[i].strLanguage[1] = language[1]; - m_Streams.stream[i].strLanguage[2] = language[2]; - m_Streams.stream[i].strLanguage[3] = 0; + const char *language = resp->extract_String(); - delete[] language; - } - else if (m_Streams.stream[i].iCodecType == AVMEDIA_TYPE_VIDEO) - { - m_Streams.stream[i].iFPSScale = resp->extract_U32(); - m_Streams.stream[i].iFPSRate = resp->extract_U32(); - m_Streams.stream[i].iHeight = resp->extract_U32(); - m_Streams.stream[i].iWidth = resp->extract_U32(); - m_Streams.stream[i].fAspect = (float)resp->extract_Double(); - } - else if (m_Streams.stream[i].iCodecType == AVMEDIA_TYPE_SUBTITLE) - { - const char *language = resp->extract_String(); - uint32_t composition_id = resp->extract_U32(); - uint32_t ancillary_id = resp->extract_U32(); - - m_Streams.stream[i].iIdentifier = (composition_id & 0xffff) | ((ancillary_id & 0xffff) << 16); - m_Streams.stream[i].strLanguage[0] = language[0]; - m_Streams.stream[i].strLanguage[1] = language[1]; - m_Streams.stream[i].strLanguage[2] = language[2]; - m_Streams.stream[i].strLanguage[3] = 0; + props->iChannels = resp->extract_U32(); + props->iSampleRate = resp->extract_U32(); + props->iBlockAlign = resp->extract_U32(); + props->iBitRate = resp->extract_U32(); + props->iBitsPerSample = resp->extract_U32(); + props->strLanguage[0] = language[0]; + props->strLanguage[1] = language[1]; + props->strLanguage[2] = language[2]; + props->strLanguage[3] = 0; + + delete[] language; + } + else if (props->iCodecType == XBMC_CODEC_TYPE_VIDEO) + { + props->iFPSScale = resp->extract_U32(); + props->iFPSRate = resp->extract_U32(); + props->iHeight = resp->extract_U32(); + props->iWidth = resp->extract_U32(); + props->fAspect = (float)resp->extract_Double(); + } + else if (props->iCodecType == XBMC_CODEC_TYPE_SUBTITLE) + { + const char *language = resp->extract_String(); + uint32_t composition_id = resp->extract_U32(); + uint32_t ancillary_id = resp->extract_U32(); - delete[] language; - } - else - i = m_Streams.iStreamCount; - break; + props->iIdentifier = (composition_id & 0xffff) | ((ancillary_id & 0xffff) << 16); + props->strLanguage[0] = language[0]; + props->strLanguage[1] = language[1]; + props->strLanguage[2] = language[2]; + props->strLanguage[3] = 0; + + delete[] language; } } - if (i >= m_Streams.iStreamCount) + else { XBMC->Log(LOG_ERROR, "%s - unknown stream id: %d", __FUNCTION__, pid); break; } } - return (memcmp(&old, &m_Streams, sizeof(m_Streams)) != 0); + m_streams = streams; + return true; } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIDemux.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIDemux.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIDemux.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIDemux.h 2014-01-04 10:28:12.000000000 +0000 @@ -24,6 +24,7 @@ #include "client.h" #include #include +#include "xbmc_stream_utils.hpp" class cResponsePacket; @@ -51,6 +52,11 @@ bool SwitchChannel(const PVR_CHANNEL &channelinfo); int CurrentChannel() { return m_channelinfo.iChannelNumber; } bool GetSignalStatus(PVR_SIGNAL_STATUS &qualityinfo); + bool IsTimeshift() { return m_bTimeshift; } + bool SeekTime(int time, bool backwards, double *startpts); + time_t GetPlayingTime(); + time_t GetBufferTimeStart(); + time_t GetBufferTimeEnd(); protected: @@ -61,8 +67,14 @@ private: - PVR_STREAM_PROPERTIES m_Streams; - PVR_CHANNEL m_channelinfo; - SQuality m_Quality; - std::map m_StreamIndex; + ADDON::XbmcStreamProperties m_streams; + PVR_CHANNEL m_channelinfo; + SQuality m_Quality; + bool m_bTimeshift; + uint32_t m_MuxPacketSerial; + time_t m_ReferenceTime; + double m_ReferenceDTS; + double m_CurrentDTS; + time_t m_BufferTimeStart; + time_t m_BufferTimeEnd; }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIRecording.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIRecording.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIRecording.cpp 2012-11-15 21:18:19.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIRecording.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -94,7 +94,11 @@ } if (m_currentPlayingRecordPosition >= m_currentPlayingRecordBytes) - return 0; + { + GetLength(); + if (m_currentPlayingRecordPosition >= m_currentPlayingRecordBytes) + return 0; + } cRequestPacket vrp; if (!vrp.init(VNSI_RECSTREAM_GETBLOCK) || @@ -178,3 +182,17 @@ { OpenRecording(m_recinfo); } + +void cVNSIRecording::GetLength() +{ + cRequestPacket vrp; + if (!vrp.init(VNSI_RECSTREAM_GETLENGTH)) + return; + + cResponsePacket* vresp = ReadResult(&vrp); + if (!vresp) + return; + + m_currentPlayingRecordBytes = vresp->extract_U64(); + delete vresp; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIRecording.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIRecording.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSIRecording.h 2012-11-15 21:18:19.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSIRecording.h 2014-01-28 20:43:50.000000000 +0000 @@ -41,6 +41,7 @@ protected: void OnReconnect(); + void GetLength(); private: diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSISession.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSISession.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/src/VNSISession.cpp 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/src/VNSISession.cpp 2014-05-04 06:40:43.000000000 +0000 @@ -105,7 +105,7 @@ { cRequestPacket vrp; if (!vrp.init(VNSI_LOGIN)) throw "Can't init cRequestPacket"; - if (!vrp.add_U32(VNSIPROTOCOLVERSION)) throw "Can't add protocol version to RequestPacket"; + if (!vrp.add_U32(VNSI_PROTOCOLVERSION)) throw "Can't add protocol version to RequestPacket"; if (!vrp.add_U8(false)) throw "Can't add netlog flag"; if (!m_name.empty()) { @@ -131,7 +131,8 @@ m_version = ServerVersion; m_protocol = (int)protocol; - if (m_protocol != VNSIPROTOCOLVERSION) throw "Protocol versions do not match"; + if (m_protocol < VNSI_PROTOCOLVERSION) + throw "Protocol versions do not match"; if (m_name.empty()) XBMC->Log(LOG_NOTICE, "Logged in at '%lu+%i' to '%s' Version: '%s' with protocol version '%d'", @@ -180,6 +181,8 @@ if (!readData(vresp->getHeader(), vresp->getStreamHeaderLength(), iDatapacketTimeout)) { delete vresp; + XBMC->Log(LOG_ERROR, "%s - lost sync on channel stream packet", __FUNCTION__); + SignalConnectionLost(); return NULL; } vresp->extractStreamHeader(); @@ -196,6 +199,8 @@ { PVR->FreeDemuxPacket(p); delete vresp; + XBMC->Log(LOG_ERROR, "%s - lost sync on channel stream mux packet", __FUNCTION__); + SignalConnectionLost(); return NULL; } } @@ -208,11 +213,43 @@ { free(userData); delete vresp; + XBMC->Log(LOG_ERROR, "%s - lost sync on channel stream (other) packet", __FUNCTION__); + SignalConnectionLost(); return NULL; } } vresp->setStream(userData, userDataLength); } + else if (channelID == VNSI_CHANNEL_OSD) + { + vresp = new cResponsePacket(); + + if (!readData(vresp->getHeader(), vresp->getOSDHeaderLength(), iDatapacketTimeout)) + { + XBMC->Log(LOG_ERROR, "%s - lost sync on osd packet", __FUNCTION__); + SignalConnectionLost(); + return NULL; + } + vresp->extractOSDHeader(); + userDataLength = vresp->getUserDataLength(); + + if (userDataLength > 5000000) return NULL; // how big can these packets get? + userData = NULL; + if (userDataLength > 0) + { + userData = (uint8_t*)malloc(userDataLength); + if (!userData) return NULL; + if (!readData(userData, userDataLength, iDatapacketTimeout)) + { + free(userData); + delete vresp; + XBMC->Log(LOG_ERROR, "%s - lost sync on additional osd packet", __FUNCTION__); + SignalConnectionLost(); + return NULL; + } + } + vresp->setOSD(userData, userDataLength); + } else { vresp = new cResponsePacket(); @@ -220,6 +257,8 @@ if (!readData(vresp->getHeader(), vresp->getHeaderLength(), iDatapacketTimeout)) { delete vresp; + XBMC->Log(LOG_ERROR, "%s - lost sync on response packet", __FUNCTION__); + SignalConnectionLost(); return NULL; } vresp->extractHeader(); @@ -235,6 +274,8 @@ { free(userData); delete vresp; + XBMC->Log(LOG_ERROR, "%s - lost sync on additional response packet", __FUNCTION__); + SignalConnectionLost(); return NULL; } } @@ -256,7 +297,7 @@ ssize_t iWriteResult = m_socket->Write(vrp->getPtr(), vrp->getLen()); if (iWriteResult != (ssize_t)vrp->getLen()) { - XBMC->Log(LOG_ERROR, "%s - Failed to write packet (%s), bytes written: %d of total: %s", __FUNCTION__, m_socket->GetError().c_str(), iWriteResult, vrp->getLen()); + XBMC->Log(LOG_ERROR, "%s - Failed to write packet (%s), bytes written: %d of total: %d", __FUNCTION__, m_socket->GetError().c_str(), iWriteResult, vrp->getLen()); return false; } return true; @@ -352,13 +393,20 @@ int bytesRead = m_socket->Read(buffer, totalBytes, timeout); if (bytesRead == totalBytes) return true; - else if (m_socket->GetErrorNumber() != ETIMEDOUT) + else if (m_socket->GetErrorNumber() == ETIMEDOUT && bytesRead > 0) { - SignalConnectionLost(); - return false; + // we did read something. try to finish the read + bytesRead += m_socket->Read(buffer+bytesRead, totalBytes-bytesRead, timeout); + if (bytesRead == totalBytes) + return true; } - else + else if (m_socket->GetErrorNumber() == ETIMEDOUT) + { return false; + } + + SignalConnectionLost(); + return false; } void cVNSISession::SleepMs(int ms) diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/channelfilter.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/channelfilter.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/channelfilter.c 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/channelfilter.c 2014-05-04 07:03:11.000000000 +0000 @@ -0,0 +1,332 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "channelfilter.h" +#include "config.h" +#include "hash.h" +#include +#include +#include +#include +#include + +cVNSIProvider::cVNSIProvider() + :m_name(""), m_caid(0) +{ + +} + +cVNSIProvider::cVNSIProvider(std::string name, int caid) + :m_name(name), m_caid(caid) +{ +}; + +bool cVNSIProvider::operator==(const cVNSIProvider &rhs) +{ + if (rhs.m_caid != m_caid) + return false; + if (rhs.m_name.compare(m_name) != 0) + return false; + return true; +} + + +bool cVNSIChannelFilter::IsRadio(const cChannel* channel) +{ + bool isRadio = false; + + // assume channels without VPID & APID are video channels + if (channel->Vpid() == 0 && channel->Apid(0) == 0) + isRadio = false; + // channels without VPID are radio channels (channels with VPID 1 are encrypted radio channels) + else if (channel->Vpid() == 0 || channel->Vpid() == 1) + isRadio = true; + + return isRadio; +} + +void cVNSIChannelFilter::Load() +{ + cMutexLock lock(&m_Mutex); + + cString filename; + std::string line; + std::ifstream rfile; + cVNSIProvider provider; + std::vector::iterator p_it; + + filename = cString::sprintf("%s/videowhitelist.vnsi", *VNSIServerConfig.ConfigDirectory); + m_providersVideo.clear(); + rfile.open(filename); + if (rfile.is_open()) + { + while(std::getline(rfile,line)) + { + size_t pos = line.find("|"); + if(pos == line.npos) + { + provider.m_name = line; + provider.m_caid = 0; + } + else + { + provider.m_name = line.substr(0, pos); + std::string tmp = line.substr(pos+1); + char *pend; + provider.m_caid = strtol(tmp.c_str(), &pend, 10); + } + p_it = std::find(m_providersVideo.begin(), m_providersVideo.end(), provider); + if(p_it == m_providersVideo.end()) + { + m_providersVideo.push_back(provider); + } + } + rfile.close(); + } + + filename = cString::sprintf("%s/radiowhitelist.vnsi", *VNSIServerConfig.ConfigDirectory); + rfile.open(filename); + m_providersRadio.clear(); + if (rfile.is_open()) + { + while(std::getline(rfile,line)) + { + unsigned int pos = line.find("|"); + if(pos == line.npos) + { + provider.m_name = line; + provider.m_caid = 0; + } + else + { + provider.m_name = line.substr(0, pos); + std::string tmp = line.substr(pos+1); + char *pend; + provider.m_caid = strtol(tmp.c_str(), &pend, 10); + } + p_it = std::find(m_providersRadio.begin(), m_providersRadio.end(), provider); + if(p_it == m_providersRadio.end()) + { + m_providersRadio.push_back(provider); + } + } + rfile.close(); + } + + filename = cString::sprintf("%s/videoblacklist.vnsi", *VNSIServerConfig.ConfigDirectory); + rfile.open(filename); + m_channelsVideo.clear(); + if (rfile.is_open()) + { + while(getline(rfile,line)) + { + char *pend; + int id = strtol(line.c_str(), &pend, 10); + m_channelsVideo.push_back(id); + } + rfile.close(); + } + + filename = cString::sprintf("%s/radioblacklist.vnsi", *VNSIServerConfig.ConfigDirectory); + rfile.open(filename); + m_channelsRadio.clear(); + if (rfile.is_open()) + { + while(getline(rfile,line)) + { + char *pend; + int id = strtol(line.c_str(), &pend, 10); + m_channelsRadio.push_back(id); + } + rfile.close(); + } +} + +void cVNSIChannelFilter::StoreWhitelist(bool radio) +{ + cMutexLock lock(&m_Mutex); + + cString filename; + std::ofstream wfile; + cVNSIProvider provider; + std::vector::iterator p_it; + std::vector *whitelist; + + if (radio) + { + filename = cString::sprintf("%s/radiowhitelist.vnsi", *VNSIServerConfig.ConfigDirectory); + whitelist = &m_providersRadio; + } + else + { + filename = cString::sprintf("%s/videowhitelist.vnsi", *VNSIServerConfig.ConfigDirectory); + whitelist = &m_providersVideo; + } + + wfile.open(filename); + if(wfile.is_open()) + { + std::string tmp; + char buf[16]; + for(p_it=whitelist->begin(); p_it!=whitelist->end(); ++p_it) + { + tmp = p_it->m_name; + tmp += "|"; + sprintf(buf, "%d\n", p_it->m_caid); + tmp += buf; + wfile << tmp; + } + wfile.close(); + } + + SortChannels(); +} + +void cVNSIChannelFilter::StoreBlacklist(bool radio) +{ + cMutexLock lock(&m_Mutex); + + cString filename; + std::ofstream wfile; + cVNSIProvider provider; + std::vector::iterator it; + std::vector *blacklist; + + if (radio) + { + filename = cString::sprintf("%s/radioblacklist.vnsi", *VNSIServerConfig.ConfigDirectory); + blacklist = &m_channelsRadio; + } + else + { + filename = cString::sprintf("%s/videoblacklist.vnsi", *VNSIServerConfig.ConfigDirectory); + blacklist = &m_channelsVideo; + } + + wfile.open(filename); + if(wfile.is_open()) + { + std::string tmp; + char buf[16]; + for(it=blacklist->begin(); it!=blacklist->end(); ++it) + { + sprintf(buf, "%d\n", *it); + tmp = buf; + wfile << tmp; + } + wfile.close(); + } + + SortChannels(); +} + +bool cVNSIChannelFilter::IsWhitelist(const cChannel &channel) +{ + cVNSIProvider provider; + std::vector::iterator p_it; + std::vector *providers; + provider.m_name = channel.Provider(); + + if (IsRadio(&channel)) + providers = &m_providersRadio; + else + providers = &m_providersVideo; + + if(providers->empty()) + return true; + + if (channel.Ca(0) == 0) + { + provider.m_caid = 0; + p_it = std::find(providers->begin(), providers->end(), provider); + if(p_it!=providers->end()) + return true; + else + return false; + } + + int caid; + int idx = 0; + while((caid = channel.Ca(idx)) != 0) + { + provider.m_caid = caid; + p_it = std::find(providers->begin(), providers->end(), provider); + if(p_it!=providers->end()) + return true; + + idx++; + } + return false; +} + +bool cVNSIChannelFilter::PassFilter(const cChannel &channel) +{ + cMutexLock lock(&m_Mutex); + + if(channel.GroupSep()) + return true; + + if (!IsWhitelist(channel)) + return false; + + std::vector::iterator it; + if (IsRadio(&channel)) + { + it = std::find(m_channelsRadio.begin(), m_channelsRadio.end(), CreateChannelUID(&channel)); + if(it!=m_channelsRadio.end()) + return false; + } + else + { + it = std::find(m_channelsVideo.begin(), m_channelsVideo.end(), CreateChannelUID(&channel)); + if(it!=m_channelsVideo.end()) + return false; + } + + return true; +} + +void cVNSIChannelFilter::SortChannels() +{ + Channels.IncBeingEdited(); + Channels.Lock(true); + + for (cChannel *channel = Channels.First(); channel; channel = Channels.Next(channel)) + { + if(!PassFilter(*channel)) + { + for (cChannel *whitechan = Channels.Next(channel); whitechan; whitechan = Channels.Next(whitechan)) + { + if(PassFilter(*whitechan)) + { + Channels.Move(whitechan, channel); + channel = whitechan; + break; + } + } + } + } + + Channels.SetModified(true); + Channels.Unlock(); + Channels.DecBeingEdited(); +} + +cVNSIChannelFilter VNSIChannelFilter; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/channelfilter.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/channelfilter.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/channelfilter.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/channelfilter.h 2014-05-04 07:03:11.000000000 +0000 @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#pragma once + +#include +#include +#include +#include + +class cVNSIProvider +{ +public: + cVNSIProvider(); + cVNSIProvider(std::string name, int caid); + bool operator==(const cVNSIProvider &rhs); + std::string m_name; + int m_caid; +}; + +class cVNSIChannelFilter +{ +public: + void Load(); + void StoreWhitelist(bool radio); + void StoreBlacklist(bool radio); + bool IsWhitelist(const cChannel &channel); + bool PassFilter(const cChannel &channel); + void SortChannels(); + static bool IsRadio(const cChannel* channel); + std::vector m_providersVideo; + std::vector m_providersRadio; + std::vector m_channelsVideo; + std::vector m_channelsRadio; + cMutex m_Mutex; +}; + +extern cVNSIChannelFilter VNSIChannelFilter; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/config.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/config.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/config.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/config.h 2014-05-04 07:03:11.000000000 +0000 @@ -64,6 +64,12 @@ #define FOLDERDELIMCHAR '~' #endif +// Error flags +#define ERROR_PES_GENERAL 0x01 +#define ERROR_PES_SCRAMBLE 0x02 +#define ERROR_PES_STARTCODE 0x04 +#define ERROR_DEMUX_NODATA 0x10 + class cVNSIServerConfig { public: diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/cxsocket.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/cxsocket.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/cxsocket.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/cxsocket.c 2014-05-04 07:03:11.000000000 +0000 @@ -49,6 +49,10 @@ #include "config.h" #include "cxsocket.h" +#ifndef MSG_MORE +#define MSG_MORE 0 +#endif + cxSocket::~cxSocket() { close(); @@ -63,6 +67,14 @@ } } +void cxSocket::Shutdown() +{ + if(m_fd >= 0) + { + ::shutdown(m_fd, SHUT_RD); + } +} + void cxSocket::LockWrite() { m_MutexWrite.Lock(); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/cxsocket.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/cxsocket.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/cxsocket.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/cxsocket.h 2014-05-04 07:03:11.000000000 +0000 @@ -27,6 +27,10 @@ #ifndef VNSI_CXSOCKET_H #define VNSI_CXSOCKET_H +#ifdef __FreeBSD__ +#include +#endif + #include #include #include @@ -46,6 +50,7 @@ ~cxSocket(); void SetHandle(int h); void close(void); + void Shutdown(void); void LockWrite(); void UnlockWrite(); ssize_t read(void *buffer, size_t size, int timeout_ms = -1); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/demuxer.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/demuxer.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/demuxer.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/demuxer.c 2014-05-04 07:03:11.000000000 +0000 @@ -39,6 +39,8 @@ void cVNSIDemuxer::Open(const cChannel &channel, cVideoBuffer *videoBuffer) { + cMutexLock lock(&m_Mutex); + m_CurrentChannel = channel; m_VideoBuffer = videoBuffer; m_OldPmtVersion = -1; @@ -47,10 +49,21 @@ m_WaitIFrame = true; else m_WaitIFrame = false; + + m_FirstFramePTS = 0; + + m_PtsWrap.m_Wrap = false; + m_PtsWrap.m_NoOfWraps = 0; + m_PtsWrap.m_ConfirmCount = 0; + m_MuxPacketSerial = 0; + m_Error = ERROR_DEMUX_NODATA; + m_SetRefTime = true; } void cVNSIDemuxer::Close() { + cMutexLock lock(&m_Mutex); + for (std::list::iterator it = m_Streams.begin(); it != m_Streams.end(); ++it) { DEBUGLOG("Deleting stream parser for pid=%i and type=%i", (*it)->GetPID(), (*it)->Type()); @@ -66,6 +79,8 @@ int len; cTSStream *stream; + cMutexLock lock(&m_Mutex); + // clear packet if (!packet) return -1; @@ -74,10 +89,15 @@ packet->pmtChange = false; // read TS Packet from buffer - len = m_VideoBuffer->Read(&buf, TS_SIZE); - if (len != TS_SIZE) + len = m_VideoBuffer->Read(&buf, TS_SIZE, m_endTime, m_wrapTime); + // eof + if (len == -2) + return -2; + else if (len != TS_SIZE) return -1; + m_Error &= ~ERROR_DEMUX_NODATA; + int ts_pid = TsPid(buf); // parse PAT/PMT @@ -112,18 +132,221 @@ } else if (stream = FindStream(ts_pid)) { - if (stream->ProcessTSPacket(buf, packet, m_WaitIFrame)) + int error = stream->ProcessTSPacket(buf, packet, m_WaitIFrame); + if (error == 0) { - m_WaitIFrame = false; + if (m_WaitIFrame) + { + if (packet->pts != DVD_NOPTS_VALUE) + m_FirstFramePTS = packet->pts; + m_WaitIFrame = false; + } + + if (packet->pts < m_FirstFramePTS) + return 0; + + packet->serial = m_MuxPacketSerial; + if (m_SetRefTime) + { + m_refTime = m_VideoBuffer->GetRefTime(); + packet->reftime = m_refTime; + m_SetRefTime = false; + } return 1; } + else if (error < 0) + { + m_Error |= abs(error); + } } - else - return -1; return 0; } +bool cVNSIDemuxer::SeekTime(int64_t time) +{ + off_t pos, pos_min, pos_max, pos_limit, start_pos; + int64_t ts, ts_min, ts_max, last_ts; + int no_change; + + if (!m_VideoBuffer->HasBuffer()) + return false; + + cMutexLock lock(&m_Mutex); + +// INFOLOG("----- seek to time: %ld", time); + + // rescale to 90khz + time = cTSStream::Rescale(time, 90000, DVD_TIME_BASE); + + m_VideoBuffer->GetPositions(&pos, &pos_min, &pos_max); + +// INFOLOG("----- seek to time: %ld", time); +// INFOLOG("------pos: %ld, pos min: %ld, pos max: %ld", pos, pos_min, pos_max); + + if (!GetTimeAtPos(&pos_min, &ts_min)) + { + ResetParsers(); + m_WaitIFrame = true; + return false; + } + +// INFOLOG("----time at min: %ld", ts_min); + + if (ts_min >= time) + { + m_VideoBuffer->SetPos(pos_min); + ResetParsers(); + m_WaitIFrame = true; + m_MuxPacketSerial++; + return true; + } + + int64_t timecur; + GetTimeAtPos(&pos, &timecur); + + // get time at end of buffer + unsigned int step= 1024; + bool gotTime; + do + { + pos_max -= step; + gotTime = GetTimeAtPos(&pos_max, &ts_max); + step += step; + } while (!gotTime && pos_max >= step); + + if (!gotTime) + { + ResetParsers(); + m_WaitIFrame = true; + return false; + } + + if (ts_max <= time) + { + ResetParsers(); + m_WaitIFrame = true; + m_MuxPacketSerial++; + return true; + } + +// INFOLOG(" - time in buffer: %ld", cTSStream::Rescale(ts_max-ts_min, DVD_TIME_BASE, 90000)/1000000); + + // bisect seek + if(ts_min > ts_max) + { + ResetParsers(); + m_WaitIFrame = true; + return false; + } + else if (ts_min == ts_max) + { + pos_limit = pos_min; + } + else + pos_limit = pos_max; + + no_change = 0; + ts = time; + last_ts = 0; + while (pos_min < pos_limit) + { + if (no_change==0) + { + // interpolate position + pos = cTSStream::Rescale(time - ts_min, pos_max - pos_min, ts_max - ts_min) + + pos_min - (pos_max - pos_limit); + } + else if (no_change==1) + { + // bisection, if interpolation failed to change min or max pos last time + pos = (pos_min + pos_limit) >> 1; + } + else + { + // linear search if bisection failed + pos = pos_min; + } + + // clamp calculated pos into boundaries + if( pos <= pos_min) + pos = pos_min + 1; + else if (pos > pos_limit) + pos = pos_limit; + start_pos = pos; + + // get time stamp at pos + if (!GetTimeAtPos(&pos, &ts)) + { + ResetParsers(); + m_WaitIFrame = true; + return false; + } + pos = m_VideoBuffer->GetPosCur(); + + // determine method for next calculation of pos + if ((last_ts == ts) || (pos >= pos_max)) + no_change++; + else + no_change=0; + +// INFOLOG("--- pos: %ld, \t time: %ld, diff time: %ld", pos, ts, time-ts); + + // 0.4 sec is close enough + if (abs(time - ts) <= 36000) + { + break; + } + // target is to the left + else if (time <= ts) + { + pos_limit = start_pos - 1; + pos_max = pos; + ts_max = ts; + } + // target is to the right + if (time >= ts) + { + pos_min = pos; + ts_min = ts; + } + last_ts = ts; + } + +// INFOLOG("----pos found: %ld", pos); +// INFOLOG("----time at pos: %ld, diff time: %ld", ts, cTSStream::Rescale(timecur-ts, DVD_TIME_BASE, 90000)); + + m_VideoBuffer->SetPos(pos); + + ResetParsers(); + m_WaitIFrame = true; + m_MuxPacketSerial++; + return true; +} + +void cVNSIDemuxer::BufferStatus(bool ×hift, uint32_t &start, uint32_t &end) +{ + timeshift = m_VideoBuffer->HasBuffer(); + + if (timeshift) + { + if (!m_wrapTime) + { + start = m_refTime; + } + else + { + start = m_endTime - (m_wrapTime - m_refTime); + } + end = m_endTime; + } + else + { + start = 0; + end = 0; + } +} + cTSStream *cVNSIDemuxer::GetFirstStream() { m_StreamsIterator = m_Streams.begin(); @@ -152,6 +375,14 @@ return NULL; } +void cVNSIDemuxer::ResetParsers() +{ + for (std::list::iterator it = m_Streams.begin(); it != m_Streams.end(); ++it) + { + (*it)->ResetParser(); + } +} + void cVNSIDemuxer::AddStreamInfo(sStreamInfo &stream) { m_StreamInfos.push_back(stream); @@ -195,40 +426,40 @@ if (it->type == stH264) { - stream = new cTSStream(stH264, it->pID); + stream = new cTSStream(stH264, it->pID, &m_PtsWrap); } else if (it->type == stMPEG2VIDEO) { - stream = new cTSStream(stMPEG2VIDEO, it->pID); + stream = new cTSStream(stMPEG2VIDEO, it->pID, &m_PtsWrap); } else if (it->type == stMPEG2AUDIO) { - stream = new cTSStream(stMPEG2AUDIO, it->pID); + stream = new cTSStream(stMPEG2AUDIO, it->pID, &m_PtsWrap); stream->SetLanguage(it->language); } else if (it->type == stAACADTS) { - stream = new cTSStream(stAACADTS, it->pID); + stream = new cTSStream(stAACADTS, it->pID, &m_PtsWrap); stream->SetLanguage(it->language); } else if (it->type == stAACLATM) { - stream = new cTSStream(stAACLATM, it->pID); + stream = new cTSStream(stAACLATM, it->pID, &m_PtsWrap); stream->SetLanguage(it->language); } else if (it->type == stAC3) { - stream = new cTSStream(stAC3, it->pID); + stream = new cTSStream(stAC3, it->pID, &m_PtsWrap); stream->SetLanguage(it->language); } else if (it->type == stEAC3) { - stream = new cTSStream(stEAC3, it->pID); + stream = new cTSStream(stEAC3, it->pID, &m_PtsWrap); stream->SetLanguage(it->language); } else if (it->type == stDVBSUB) { - stream = new cTSStream(stDVBSUB, it->pID); + stream = new cTSStream(stDVBSUB, it->pID, &m_PtsWrap); stream->SetLanguage(it->language); #if APIVERSNUM >= 10709 stream->SetSubtitlingDescriptor(it->subtitlingType, it->compositionPageId, it->ancillaryPageId); @@ -236,7 +467,7 @@ } else if (it->type == stTELETEXT) { - stream = new cTSStream(stTELETEXT, it->pID); + stream = new cTSStream(stTELETEXT, it->pID, &m_PtsWrap); } else continue; @@ -253,6 +484,7 @@ void cVNSIDemuxer::SetChannelStreams(const cChannel *channel) { sStreamInfo newStream; + int index = 0; if (channel->Vpid()) { newStream.pID = channel->Vpid(); @@ -266,10 +498,28 @@ AddStreamInfo(newStream); } + const int *DPids = channel->Dpids(); + index = 0; + for ( ; *DPids; DPids++) + { + if (!FindStream(*DPids)) + { + newStream.pID = *DPids; + newStream.type = stAC3; +#if APIVERSNUM >= 10715 + if (channel->Dtype(index) == SI::EnhancedAC3DescriptorTag) + newStream.type = stEAC3; +#endif + newStream.SetLanguage(channel->Dlang(index)); + AddStreamInfo(newStream); + } + index++; + } + const int *APids = channel->Apids(); + index = 0; for ( ; *APids; APids++) { - int index = 0; if (!FindStream(*APids)) { newStream.pID = *APids; @@ -286,28 +536,10 @@ index++; } - const int *DPids = channel->Dpids(); - for ( ; *DPids; DPids++) - { - int index = 0; - if (!FindStream(*DPids)) - { - newStream.pID = *DPids; - newStream.type = stAC3; -#if APIVERSNUM >= 10715 - if (channel->Dtype(index) == SI::EnhancedAC3DescriptorTag) - newStream.type = stEAC3; -#endif - newStream.SetLanguage(channel->Dlang(index)); - AddStreamInfo(newStream); - } - index++; - } - const int *SPids = channel->Spids(); if (SPids) { - int index = 0; + index = 0; for ( ; *SPids; SPids++) { if (!FindStream(*SPids)) @@ -385,3 +617,36 @@ Spids, SLangs, Tpid); } + +bool cVNSIDemuxer::GetTimeAtPos(off_t *pos, int64_t *time) +{ + uint8_t *buf; + int len; + cTSStream *stream; + int ts_pid; + + m_VideoBuffer->SetPos(*pos); + ResetParsers(); + while (len = m_VideoBuffer->Read(&buf, TS_SIZE, m_endTime, m_wrapTime) == TS_SIZE) + { + ts_pid = TsPid(buf); + if (stream = FindStream(ts_pid)) + { + // only consider video or audio streams + if ((stream->Content() == scVIDEO || stream->Content() == scAUDIO) && + stream->ReadTime(buf, time)) + { + return true; + } + } + } + return false; +} + +uint16_t cVNSIDemuxer::GetError() +{ + uint16_t ret = m_Error; + m_Error = ERROR_DEMUX_NODATA; + return ret; +} + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/demuxer.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/demuxer.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/demuxer.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/demuxer.h 2014-05-04 07:03:11.000000000 +0000 @@ -57,13 +57,20 @@ cTSStream *GetNextStream(); void Open(const cChannel &channel, cVideoBuffer *videoBuffer); void Close(); + bool SeekTime(int64_t time); + uint32_t GetSerial() { return m_MuxPacketSerial; } + void SetSerial(uint32_t serial) { m_MuxPacketSerial = serial; } + void BufferStatus(bool ×hift, uint32_t &start, uint32_t &end); + uint16_t GetError(); protected: bool EnsureParsers(); + void ResetParsers(); void SetChannelStreams(const cChannel *channel); void SetChannelPids(cChannel *channel, cPatPmtParser *patPmtParser); cTSStream *FindStream(int Pid); void AddStreamInfo(sStreamInfo &stream); + bool GetTimeAtPos(off_t *pos, int64_t *time); std::list m_Streams; std::list::iterator m_StreamsIterator; std::list m_StreamInfos; @@ -71,5 +78,12 @@ cPatPmtParser m_PatPmtParser; int m_OldPmtVersion; bool m_WaitIFrame; + int64_t m_FirstFramePTS; cVideoBuffer *m_VideoBuffer; + cMutex m_Mutex; + uint32_t m_MuxPacketSerial; + sPtsWrap m_PtsWrap; + uint16_t m_Error; + bool m_SetRefTime; + time_t m_refTime, m_endTime, m_wrapTime; }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/HISTORY xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/HISTORY --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/HISTORY 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/HISTORY 2014-05-04 07:03:11.000000000 +0000 @@ -12,3 +12,17 @@ - proper handling of PMT changes - suffix plugin with version of protocol: vnsiserver3 - this version is compatible with XBMC 12.0 + +2013-12-04: Version 0.9.3 + +- add support for EDL (marks) +- add channel filter +- send buffer times for timeshift +- bump protocol to XBMC to 5 +- suffix plugin with version of protocol: vnsiserver5 +- this version is compatible with XBMC 13 + +2014-01-08: Version 0.9.4 + +- update length of recorings in progress + while playing \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/Makefile xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/Makefile --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/Makefile 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/Makefile 2014-05-04 07:03:11.000000000 +0000 @@ -7,7 +7,7 @@ # This name will be used in the '-P...' option of VDR to load the plugin. # By default the main source file also carries this name. -PLUGIN = vnsiserver3 +PLUGIN = vnsiserver5 ### The version number of this plugin (taken from the main source file): @@ -90,7 +90,7 @@ parser_AC3.o parser_DTS.o parser_h264.o parser_MPEGAudio.o parser_MPEGVideo.o \ parser_Subtitle.o parser_Teletext.o streamer.o recplayer.o requestpacket.o responsepacket.o \ vnsiserver.o hash.o recordingscache.o setup.o vnsiosd.o demuxer.o videobuffer.o \ - videoinput.o + videoinput.o channelfilter.o status.o ### The main target: diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_AAC.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_AAC.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_AAC.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_AAC.c 2014-05-04 07:03:11.000000000 +0000 @@ -1,8 +1,5 @@ /* - * vdr-plugin-vnsi - XBMC server plugin for VDR - * - * Copyright (C) 2010 Alwin Esch (Team XBMC) - * + * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -16,9 +13,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html + * along with XBMC; see the file COPYING. If not, see + * . * */ @@ -35,10 +31,9 @@ }; -cParserAAC::cParserAAC(int pID, cTSStream *stream) - : cParser(pID, stream) +cParserAAC::cParserAAC(int pID, cTSStream *stream, sPtsWrap *ptsWrap, bool observePtsWraps) + : cParser(pID, stream, ptsWrap, observePtsWraps) { - m_firstPUSIseen = false; m_Configured = false; m_FrameLengthType = 0; m_PTS = 0; @@ -111,6 +106,12 @@ m_curPTS += 90000 * 1024 / m_SampleRate; return -1; } + else if (buf_ptr[0] == 0xFF && (buf_ptr[1] & 0xF0) == 0xF0) + { + m_Stream->SetType(stAACADTS); + INFOLOG("cParserAAC::FindHeaders - detected ADTS muxing mode"); + return -1; + } } else if (m_Stream->Type() == stAACADTS) { @@ -143,6 +144,12 @@ m_curPTS += 90000 * 1024 / m_SampleRate; return -1; } + else if (buf_ptr[0] == 0x56 && (buf_ptr[1] & 0xE0) == 0xE0) + { + m_Stream->SetType(stAACLATM); + INFOLOG("cParserAAC::FindHeaders - detected LATM muxing mode"); + return -1; + } } return 0; } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_AAC.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_AAC.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_AAC.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_AAC.h 2014-05-04 07:03:11.000000000 +0000 @@ -1,8 +1,5 @@ /* - * vdr-plugin-vnsi - XBMC server plugin for VDR - * - * Copyright (C) 2010 Alwin Esch (Team XBMC) - * + * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -16,9 +13,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html + * along with XBMC; see the file COPYING. If not, see + * . * */ @@ -52,7 +48,7 @@ uint32_t LATMGetValue(cBitstream *bs) { return bs->readBits(bs->readBits(2) * 8); } public: - cParserAAC(int pID, cTSStream *stream); + cParserAAC(int pID, cTSStream *stream, sPtsWrap *ptsWrap, bool observePtsWraps); virtual ~cParserAAC(); virtual void Parse(sStreamPacket *pkt); virtual void Reset(); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_AC3.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_AC3.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_AC3.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_AC3.c 2014-05-04 07:03:11.000000000 +0000 @@ -1,8 +1,5 @@ /* - * vdr-plugin-vnsi - XBMC server plugin for VDR - * - * Copyright (C) 2010 Alwin Esch (Team XBMC) - * + * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -16,9 +13,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html + * along with XBMC; see the file COPYING. If not, see + * . * */ @@ -109,8 +105,8 @@ EAC3_FRAME_TYPE_RESERVED } EAC3FrameType; -cParserAC3::cParserAC3(int pID, cTSStream *stream) - : cParser(pID, stream) +cParserAC3::cParserAC3(int pID, cTSStream *stream, sPtsWrap *ptsWrap, bool observePtsWraps) + : cParser(pID, stream, ptsWrap, observePtsWraps) { m_PTS = 0; m_DTS = 0; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_AC3.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_AC3.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_AC3.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_AC3.h 2014-05-04 07:03:11.000000000 +0000 @@ -1,8 +1,5 @@ /* - * vdr-plugin-vnsi - XBMC server plugin for VDR - * - * Copyright (C) 2010 Alwin Esch (Team XBMC) - * + * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -16,9 +13,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html + * along with XBMC; see the file COPYING. If not, see + * . * */ @@ -43,7 +39,7 @@ int FindHeaders(uint8_t *buf, int buf_size); public: - cParserAC3(int pID, cTSStream *stream); + cParserAC3(int pID, cTSStream *stream, sPtsWrap *ptsWrap, bool observePtsWraps); virtual ~cParserAC3(); virtual void Parse(sStreamPacket *pkt); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser.c 2014-05-04 07:03:11.000000000 +0000 @@ -1,8 +1,5 @@ /* - * vdr-plugin-vnsi - XBMC server plugin for VDR - * - * Copyright (C) 2010 Alwin Esch (Team XBMC) - * + * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -16,9 +13,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html + * along with XBMC; see the file COPYING. If not, see + * . * */ @@ -46,14 +42,10 @@ // --- cParser ------------------------------------------------- -cParser::cParser(int pID, cTSStream *stream) - : m_pID(pID) +cParser::cParser(int pID, cTSStream *stream, sPtsWrap *ptsWrap, bool observePtsWraps) + : m_pID(pID), m_PtsWrap(ptsWrap), m_ObservePtsWraps(observePtsWraps) { - m_curPTS = DVD_NOPTS_VALUE; - m_curDTS = DVD_NOPTS_VALUE; - m_prevDTS = DVD_NOPTS_VALUE; m_PesBuffer = NULL; - m_IsError = false; m_Stream = stream; m_IsVideo = false; m_PesBufferInitialSize = 1024; @@ -66,23 +58,29 @@ free(m_PesBuffer); } - +void cParser::Reset() +{ + m_curPTS = DVD_NOPTS_VALUE; + m_curDTS = DVD_NOPTS_VALUE; + m_prevDTS = DVD_NOPTS_VALUE; + m_PesBufferPtr = 0; + m_PesParserPtr = 0; + m_PesNextFramePtr = 0; + m_FoundFrame = false; + m_PesPacketLength = 0; + m_PesHeaderPtr = 0; + m_Error = ERROR_PES_GENERAL; +} /* * Extract DTS and PTS and update current values in stream */ int cParser::ParsePESHeader(uint8_t *buf, size_t len) { - if (len < 6) - return -1; - m_PesPacketLength = buf[4] << 8 | buf[5]; if (!PesIsVideoPacket(buf) && !PesIsAudioPacket(buf)) return 6; - if (len < 9) - return -1; - unsigned int hdr_len = PesHeaderLength(buf); if (m_PesPacketLength > 0) @@ -103,7 +101,42 @@ pts |= ((int64_t)(buf[11] & 0xFE)) << 14 ; pts |= ((int64_t) buf[12]) << 7 ; pts |= ((int64_t)(buf[13] & 0xFE)) >> 1 ; + + int64_t bit32and31 = pts >> 31; + if (m_ObservePtsWraps) + { + if ((bit32and31 == 3) && !m_PtsWrap->m_Wrap) + { + m_PtsWrap->m_ConfirmCount++; + if (m_PtsWrap->m_ConfirmCount >= 2) + { + m_PtsWrap->m_Wrap = true; + } + } + else if ((bit32and31 == 1) && m_PtsWrap->m_Wrap) + { + m_PtsWrap->m_ConfirmCount++; + if (m_PtsWrap->m_ConfirmCount >= 2) + { + m_PtsWrap->m_Wrap = false; + m_PtsWrap->m_NoOfWraps++; + } + } + else + m_PtsWrap->m_ConfirmCount = 0; + } + + m_prevPTS = m_curPTS; m_curPTS = pts; + m_PesTimePos = m_PesBufferPtr; + if (m_PtsWrap->m_Wrap && !(bit32and31)) + { + m_curPTS += 1LL<<33; + } + if (m_PtsWrap->m_NoOfWraps) + { + m_curPTS += ((int64_t)m_PtsWrap->m_NoOfWraps<<33); + } } else return hdr_len; @@ -121,24 +154,46 @@ dts |= (int64_t)( buf[17] << 7 ); dts |= (int64_t)((buf[18] & 0xFE) >> 1 ); m_curDTS = dts; + if (m_PtsWrap->m_Wrap && !(m_curDTS >> 31)) + { + m_curDTS += 1LL<<33; + } + if (m_PtsWrap->m_NoOfWraps) + { + m_curDTS += ((int64_t)m_PtsWrap->m_NoOfWraps<<33); + } } else - m_curDTS = m_curPTS; + m_curDTS = DVD_NOPTS_VALUE; return hdr_len; } int cParser::ParsePacketHeader(uint8_t *data) { - m_IsPusi = TsPayloadStart(data); + if (TsIsScrambled(data)) + { + m_Error = ERROR_PES_SCRAMBLE; + return -1; + } + + if (TsPayloadStart(data)) + { + m_IsPusi = true; + m_Error = 0; + } + int bytes = TS_SIZE - TsPayloadOffset(data); if(bytes < 0 || bytes > TS_SIZE) + { + m_Error = ERROR_PES_GENERAL; return -1; + } if (TsError(data)) { - ERRORLOG("transport error"); + m_Error = ERROR_PES_GENERAL; return -1; } @@ -149,55 +204,146 @@ } /* drop broken PES packets */ - if (m_IsError && !m_IsPusi) + if (m_Error) { return -1; } - /* handle new payload unit */ - if (m_IsPusi) - { - if (!PesIsHeader(data+TS_SIZE-bytes)) - { - m_IsError = true; -// ERRORLOG("--------------- no header"); - Reset(); - return -1; - } - m_IsError = false; - } - return bytes; } bool cParser::AddPESPacket(uint8_t *data, int size) { // check for beginning of a PES packet + if (m_IsPusi && m_IsVideo && !IsValidStartCode(data, 4)) + { + m_IsPusi = false; + } if (m_IsPusi) { - if (IsValidStartCode(data, size)) + int hdr_len = 6; + if (m_PesHeaderPtr + size < hdr_len) { - m_firstPUSIseen = true; - int hlen = ParsePESHeader(data, size); - if (hlen <= 0) + memcpy(m_PesHeader+m_PesHeaderPtr, data, size); + m_PesHeaderPtr += size; + return false; + } + else if (m_PesHeaderPtr) + { + int bytesNeeded = hdr_len-m_PesHeaderPtr; + if (bytesNeeded > 0) + { + memcpy(m_PesHeader+m_PesHeaderPtr, data, bytesNeeded); + m_PesHeaderPtr += bytesNeeded; + data += bytesNeeded; + size -= bytesNeeded; + } + if (!IsValidStartCode(m_PesHeader, hdr_len)) { - INFOLOG("--------- reset"); Reset(); + m_Error |= ERROR_PES_STARTCODE; + return false; + } + if (PesIsVideoPacket(m_PesHeader) || PesIsAudioPacket(m_PesHeader)) + { + hdr_len = 9; + bytesNeeded = hdr_len-m_PesHeaderPtr; + if (size < bytesNeeded) + { + memcpy(m_PesHeader+m_PesHeaderPtr, data, size); + m_PesHeaderPtr += size; + return false; + } + else if (bytesNeeded > 0) + { + memcpy(m_PesHeader+m_PesHeaderPtr, data, bytesNeeded); + m_PesHeaderPtr += bytesNeeded; + data += bytesNeeded; + size -= bytesNeeded; + } + if ((m_PesHeader[6] & 0x30)) + { + Reset(); + m_Error |= ERROR_PES_SCRAMBLE; + return false; + } + hdr_len = PesHeaderLength(m_PesHeader); + if (hdr_len > PES_HEADER_LENGTH) + { + Reset(); + return false; + } + } + bytesNeeded = hdr_len-m_PesHeaderPtr; + if (size < bytesNeeded) + { + memcpy(m_PesHeader+m_PesHeaderPtr, data, size); + m_PesHeaderPtr += size; return false; } - data += hlen; - size -= hlen; + else if (bytesNeeded > 0) + { + memcpy(m_PesHeader+m_PesHeaderPtr, data, bytesNeeded); + m_PesHeaderPtr += bytesNeeded; + data += bytesNeeded; + size -= bytesNeeded; + } + if (ParsePESHeader(m_PesHeader, hdr_len) < 0) + { + INFOLOG("error parsing pes packet error "); + Reset(); + return false; + } + m_PesHeaderPtr = 0; + m_IsPusi = false; } - else + else if (!IsValidStartCode(data, size)) { - INFOLOG("--------- reset 2"); Reset(); + m_Error |= ERROR_PES_STARTCODE; + return false; + } + else + { + if (PesIsVideoPacket(data) || PesIsAudioPacket(data)) + { + if (size < 9) + { + memcpy(m_PesHeader+m_PesHeaderPtr, data, size); + m_PesHeaderPtr += size; + return false; + } + if ((data[6] & 0x30)) + { + Reset(); + m_Error |= ERROR_PES_STARTCODE; + return false; + } + hdr_len = PesHeaderLength(data); + if (hdr_len > PES_HEADER_LENGTH) + { + Reset(); + return false; + } + } + if (size < hdr_len) + { + memcpy(m_PesHeader+m_PesHeaderPtr, data, size); + m_PesHeaderPtr += size; + return false; + } + if (ParsePESHeader(data, hdr_len) < 0) + { + INFOLOG("error parsing pes packet error 2"); + Reset(); + return false; + } + data += hdr_len; + size -= hdr_len; + m_IsPusi = false; } } - if (!m_firstPUSIseen) - return false; - if (m_PesBuffer == NULL) { m_PesBufferSize = m_PesBufferInitialSize; @@ -212,9 +358,9 @@ if (m_PesBufferPtr + size >= m_PesBufferSize) { - if (m_PesBufferPtr + size >= 500000) + if (m_PesBufferPtr + size >= 1000000) { - ERRORLOG("cParser::AddPESPacket - max buffer size reached"); + ERRORLOG("cParser::AddPESPacket - max buffer size reached, pid: %d", m_pID); Reset(); return false; } @@ -233,6 +379,7 @@ { memmove(m_PesBuffer, m_PesBuffer+m_PesNextFramePtr, m_PesBufferPtr-m_PesNextFramePtr); m_PesBufferPtr = m_PesBufferPtr-m_PesNextFramePtr; + m_PesTimePos -= m_PesNextFramePtr; m_PesNextFramePtr = 0; } @@ -240,7 +387,7 @@ memcpy(m_PesBuffer+m_PesBufferPtr, data, size); m_PesBufferPtr += size; - return false; + return true; } inline bool cParser::IsValidStartCode(uint8_t *buf, int size) @@ -284,19 +431,9 @@ return false; } -void cParser::Reset() -{ - m_PesBufferPtr = 0; - m_PesParserPtr = 0; - m_firstPUSIseen = false; - m_PesNextFramePtr = 0; - m_FoundFrame = false; - m_PesPacketLength = 0; -} - // --- cTSStream ---------------------------------------------------- -cTSStream::cTSStream(eStreamType type, int pid) +cTSStream::cTSStream(eStreamType type, int pid, sPtsWrap *ptsWrap) : m_streamType(type) , m_pID(pid) { @@ -316,25 +453,55 @@ m_IsStreamChange = false; if (m_streamType == stMPEG2VIDEO) - m_pesParser = new cParserMPEG2Video(m_pID, this); + { + m_pesParser = new cParserMPEG2Video(m_pID, this, ptsWrap, true); + m_streamContent = scVIDEO; + } else if (m_streamType == stH264) - m_pesParser = new cParserH264(m_pID, this); + { + m_pesParser = new cParserH264(m_pID, this, ptsWrap, true); + m_streamContent = scVIDEO; + } else if (m_streamType == stMPEG2AUDIO) - m_pesParser = new cParserMPEG2Audio(m_pID, this); + { + m_pesParser = new cParserMPEG2Audio(m_pID, this, ptsWrap, true); + m_streamContent = scAUDIO; + } else if (m_streamType == stAACADTS) - m_pesParser = new cParserAAC(m_pID, this); + { + m_pesParser = new cParserAAC(m_pID, this, ptsWrap, true); + m_streamContent = scAUDIO; + } else if (m_streamType == stAACLATM) - m_pesParser = new cParserAAC(m_pID, this); + { + m_pesParser = new cParserAAC(m_pID, this, ptsWrap, true); + m_streamContent = scAUDIO; + } else if (m_streamType == stAC3) - m_pesParser = new cParserAC3(m_pID, this); + { + m_pesParser = new cParserAC3(m_pID, this, ptsWrap, true); + m_streamContent = scAUDIO; + } else if (m_streamType == stEAC3) - m_pesParser = new cParserAC3(m_pID, this); + { + m_pesParser = new cParserAC3(m_pID, this, ptsWrap, true); + m_streamContent = scAUDIO; + } else if (m_streamType == stDTS) - m_pesParser = new cParserDTS(m_pID, this); + { + m_pesParser = new cParserDTS(m_pID, this, ptsWrap, true); + m_streamContent = scAUDIO; + } else if (m_streamType == stTELETEXT) - m_pesParser = new cParserTeletext(m_pID, this); + { + m_pesParser = new cParserTeletext(m_pID, this, ptsWrap, false); + m_streamContent = scTELETEXT; + } else if (m_streamType == stDVBSUB) - m_pesParser = new cParserSubtitle(m_pID, this); + { + m_pesParser = new cParserSubtitle(m_pID, this, ptsWrap, false); + m_streamContent = scSUBTITLE; + } else { ERRORLOG("Unrecognised type %i inside stream %i", m_streamType, m_pID); @@ -351,48 +518,96 @@ } } -bool cTSStream::ProcessTSPacket(uint8_t *data, sStreamPacket *pkt, bool iframe) +int cTSStream::ProcessTSPacket(uint8_t *data, sStreamPacket *pkt, bool iframe) { if (!data) - return false; + return 1; if (!m_pesParser) - return false; + return 1; int payloadSize = m_pesParser->ParsePacketHeader(data); - if (payloadSize < 0) - return false; + if (payloadSize == 0) + return 1; + else if (payloadSize < 0) + { + return -m_pesParser->GetError(); + } + + if (!m_pesParser->AddPESPacket(data+TS_SIZE-payloadSize, payloadSize)) + { + return -m_pesParser->GetError(); + } - m_pesParser->AddPESPacket(data+TS_SIZE-payloadSize, payloadSize); m_pesParser->Parse(pkt); if (iframe && !m_pesParser->IsVideo()) - return false; + return 1; if (pkt->data) { int64_t dts = pkt->dts; int64_t pts = pkt->pts; - if (dts == DVD_NOPTS_VALUE) - dts = pts; - // Rescale for XBMC - pkt->dts = Rescale(dts); - pkt->pts = Rescale(pts); - pkt->duration = Rescale(pkt->duration); - return true; + if (pkt->dts != DVD_NOPTS_VALUE) + pkt->dts = Rescale(dts, DVD_TIME_BASE, 90000); + if (pkt->pts != DVD_NOPTS_VALUE) + pkt->pts = Rescale(pts, DVD_TIME_BASE, 90000); + pkt->duration = Rescale(pkt->duration, DVD_TIME_BASE, 90000); + return 0; } + return 1; +} + +bool cTSStream::ReadTime(uint8_t *data, int64_t *dts) +{ + if (!data) + return false; + + if (!m_pesParser) + return false; + + int payloadSize = m_pesParser->ParsePacketHeader(data); + if (payloadSize < 0) + return false; + + if (m_pesParser->m_IsPusi) + { + data += TS_SIZE-payloadSize; + if (payloadSize >= 6 && m_pesParser->IsValidStartCode(data, payloadSize)) + { + m_pesParser->m_curPTS = DVD_NOPTS_VALUE; + m_pesParser->m_curDTS = DVD_NOPTS_VALUE; + m_pesParser->ParsePESHeader(data, payloadSize); + if (m_pesParser->m_curDTS != DVD_NOPTS_VALUE) + { + *dts = m_pesParser->m_curDTS; + return true; + } + else if (m_pesParser->m_curPTS != DVD_NOPTS_VALUE) + { + *dts = m_pesParser->m_curPTS; + return true; + } + } + m_pesParser->m_IsPusi = false; + } return false; } -int64_t cTSStream::Rescale(int64_t a) +void cTSStream::ResetParser() +{ + if (m_pesParser) + m_pesParser->Reset(); +} + +int64_t cTSStream::Rescale(int64_t a, int64_t b, int64_t c) { - uint64_t b = DVD_TIME_BASE; - uint64_t c = 90000; uint64_t r = c/2; - if (b<=INT_MAX && c<=INT_MAX){ + if (b<=INT_MAX && c<=INT_MAX) + { if (a<=INT_MAX) return (a * b + r)/c; else diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_DTS.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_DTS.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_DTS.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_DTS.c 2014-05-04 07:03:11.000000000 +0000 @@ -1,8 +1,5 @@ /* - * vdr-plugin-vnsi - XBMC server plugin for VDR - * - * Copyright (C) 2010 Alwin Esch (Team XBMC) - * + * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -16,9 +13,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html + * along with XBMC; see the file COPYING. If not, see + * . * */ @@ -29,8 +25,8 @@ #include "parser_DTS.h" #include "bitstream.h" -cParserDTS::cParserDTS(int pID, cTSStream *stream) - : cParser(pID, stream) +cParserDTS::cParserDTS(int pID, cTSStream *stream, sPtsWrap *ptsWrap, bool observePtsWraps) + : cParser(pID, stream, ptsWrap, observePtsWraps) { } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_DTS.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_DTS.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_DTS.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_DTS.h 2014-05-04 07:03:11.000000000 +0000 @@ -1,8 +1,5 @@ /* - * vdr-plugin-vnsi - XBMC server plugin for VDR - * - * Copyright (C) 2010 Alwin Esch (Team XBMC) - * + * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -16,9 +13,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html + * along with XBMC; see the file COPYING. If not, see + * . * */ @@ -34,7 +30,7 @@ private: public: - cParserDTS(int pID, cTSStream *stream); + cParserDTS(int pID, cTSStream *stream, sPtsWrap *ptsWrap, bool observePtsWraps); virtual ~cParserDTS(); virtual void Parse(sStreamPacket *pkt); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser.h 2014-05-04 07:03:11.000000000 +0000 @@ -1,8 +1,5 @@ /* - * vdr-plugin-vnsi - XBMC server plugin for VDR - * - * Copyright (C) 2010 Alwin Esch (Team XBMC) - * + * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -16,9 +13,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html + * along with XBMC; see the file COPYING. If not, see + * . * */ @@ -77,88 +73,11 @@ return ((p)[3] == PRIVATE_STREAM1 || (p)[3] == PRIVATE_STREAM3 ); } -inline bool PesIsPaddingPacket(const uchar *p) -{ - return ((p)[3] == PADDING_STREAM); -} - inline bool PesIsAudioPacket(const uchar *p) { return (PesIsMPEGAudioPacket(p) || PesIsPS1Packet(p)); } -#if APIVERSNUM < 10701 - -#define TS_ERROR 0x80 -#define TS_PAYLOAD_START 0x40 -#define TS_TRANSPORT_PRIORITY 0x20 -#define TS_PID_MASK_HI 0x1F -#define TS_SCRAMBLING_CONTROL 0xC0 -#define TS_ADAPT_FIELD_EXISTS 0x20 -#define TS_PAYLOAD_EXISTS 0x10 -#define TS_CONT_CNT_MASK 0x0F -#define TS_ADAPT_DISCONT 0x80 -#define TS_ADAPT_RANDOM_ACC 0x40 // would be perfect for detecting independent frames, but unfortunately not used by all broadcasters -#define TS_ADAPT_ELEM_PRIO 0x20 -#define TS_ADAPT_PCR 0x10 -#define TS_ADAPT_OPCR 0x08 -#define TS_ADAPT_SPLICING 0x04 -#define TS_ADAPT_TP_PRIVATE 0x02 -#define TS_ADAPT_EXTENSION 0x01 - -inline bool TsHasPayload(const uchar *p) -{ - return p[3] & TS_PAYLOAD_EXISTS; -} - -inline bool TsHasAdaptationField(const uchar *p) -{ - return p[3] & TS_ADAPT_FIELD_EXISTS; -} - -inline bool TsPayloadStart(const uchar *p) -{ - return p[1] & TS_PAYLOAD_START; -} - -inline bool TsError(const uchar *p) -{ - return p[1] & TS_ERROR; -} - -inline int TsPid(const uchar *p) -{ - return (p[1] & TS_PID_MASK_HI) * 256 + p[2]; -} - -inline bool TsIsScrambled(const uchar *p) -{ - return p[3] & TS_SCRAMBLING_CONTROL; -} - -inline int TsPayloadOffset(const uchar *p) -{ - return (p[3] & TS_ADAPT_FIELD_EXISTS) ? p[4] + 5 : 4; -} - -inline int TsGetPayload(const uchar **p) -{ - int o = TsPayloadOffset(*p); - *p += o; - return TS_SIZE - o; -} - -inline int TsContinuityCounter(const uchar *p) -{ - return p[3] & TS_CONT_CNT_MASK; -} - -inline int TsGetAdaptationField(const uchar *p) -{ - return TsHasAdaptationField(p) ? p[5] : 0x00; -} -#endif - enum eStreamContent { scVIDEO, @@ -202,27 +121,42 @@ int size; bool streamChange; bool pmtChange; + uint32_t serial; + uint32_t reftime; +}; + +struct sPtsWrap +{ + bool m_Wrap; + int m_NoOfWraps; + int m_ConfirmCount; }; class cTSStream; +#define PES_HEADER_LENGTH 128 + class cParser { +friend class cTSStream; public: - cParser(int pID, cTSStream *stream); + cParser(int pID, cTSStream *stream, sPtsWrap *ptsWrap, bool observePtsWraps); virtual ~cParser(); bool AddPESPacket(uint8_t *data, int size); virtual void Parse(sStreamPacket *pkt) = 0; - void ClearFrame() {m_PesBufferPtr = 0;} +// void ClearFrame() {m_PesBufferPtr = 0;} int ParsePacketHeader(uint8_t *data); int ParsePESHeader(uint8_t *buf, size_t len); virtual void Reset(); bool IsVideo() {return m_IsVideo; } + uint16_t GetError() { return m_Error; } protected: virtual bool IsValidStartCode(uint8_t *buf, int size); + uint8_t m_PesHeader[PES_HEADER_LENGTH]; + int m_PesHeaderPtr; int m_PesPacketLength; uint8_t *m_PesBuffer; int m_PesBufferSize; @@ -230,20 +164,23 @@ size_t m_PesBufferInitialSize; size_t m_PesParserPtr; size_t m_PesNextFramePtr; + int m_PesTimePos; bool m_FoundFrame; int m_pID; int64_t m_curPTS; int64_t m_curDTS; + int64_t m_prevPTS; int64_t m_prevDTS; bool m_IsPusi; - bool m_firstPUSIseen; - bool m_IsError; + uint16_t m_Error; cTSStream *m_Stream; bool m_IsVideo; + sPtsWrap *m_PtsWrap; + bool m_ObservePtsWraps; }; @@ -277,15 +214,18 @@ uint16_t m_ancillaryPageId; public: - cTSStream(eStreamType type, int pid); + cTSStream(eStreamType type, int pid, sPtsWrap *ptsWrap); virtual ~cTSStream(); - bool ProcessTSPacket(uint8_t *data, sStreamPacket *pkt, bool iframe); + int ProcessTSPacket(uint8_t *data, sStreamPacket *pkt, bool iframe); + bool ReadTime(uint8_t *data, int64_t *dts); + void ResetParser(); void SetLanguage(const char *language); const char *GetLanguage() { return m_language; } const eStreamContent Content() const { return m_streamContent; } const eStreamType Type() const { return m_streamType; } + void SetType(eStreamType type) { m_streamType = type; } const int GetPID() const { return m_pID; } /* Video Stream Information */ @@ -302,7 +242,7 @@ uint16_t CompositionPageId() const { return m_compositionPageId; } uint16_t AncillaryPageId() const { return m_ancillaryPageId; } - int64_t Rescale(int64_t a); + static int64_t Rescale(int64_t a, int64_t b, int64_t c); }; #endif // VNSI_DEMUXER_H diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_h264.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_h264.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_h264.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_h264.c 2014-05-04 07:03:11.000000000 +0000 @@ -1,8 +1,5 @@ /* - * vdr-plugin-vnsi - XBMC server plugin for VDR - * - * Copyright (C) 2010 Alwin Esch (Team XBMC) - * + * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -16,9 +13,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html + * along with XBMC; see the file COPYING. If not, see + * . * */ @@ -49,8 +45,8 @@ {-1, -1}, }; -cParserH264::cParserH264(int pID, cTSStream *stream) - : cParser(pID, stream) +cParserH264::cParserH264(int pID, cTSStream *stream, sPtsWrap *ptsWrap, bool observePtsWraps) + : cParser(pID, stream, ptsWrap, observePtsWraps) { m_Height = 0; m_Width = 0; @@ -62,7 +58,7 @@ m_PixelAspect.den = 1; m_PixelAspect.num = 0; memset(&m_streamData, 0, sizeof(m_streamData)); - m_PesBufferInitialSize = 80000; + m_PesBufferInitialSize = 240000; m_IsVideo = true; Reset(); @@ -103,26 +99,33 @@ double DAR = (PAR * m_Width) / m_Height; DEBUGLOG("H.264 SPS: PAR %i:%i", m_PixelAspect.num, m_PixelAspect.den); DEBUGLOG("H.264 SPS: DAR %.2f", DAR); -// int fpsScale = DVD_TIME_BASE / m_FPS; + if (m_FpsScale == 0) { - m_FpsScale = m_Stream->Rescale(m_curDTS - m_prevDTS); + if (m_curDTS != DVD_NOPTS_VALUE && m_prevDTS != DVD_NOPTS_VALUE) + m_FpsScale = m_Stream->Rescale(m_curDTS - m_prevDTS, DVD_TIME_BASE, 90000); + else + m_FpsScale = 40000; } - bool streamChange = m_Stream->SetVideoInformation(m_FpsScale,DVD_TIME_BASE, m_Height, m_Width, DAR); + bool streamChange = m_Stream->SetVideoInformation(m_FpsScale, DVD_TIME_BASE, m_Height, m_Width, DAR); + + int duration; + if (m_curDTS != DVD_NOPTS_VALUE && m_prevDTS != DVD_NOPTS_VALUE) + duration = m_curDTS - m_prevDTS; + else + duration = m_Stream->Rescale(m_FpsScale, 90000, DVD_TIME_BASE); pkt->id = m_pID; pkt->size = m_PesNextFramePtr; pkt->data = m_PesBuffer; pkt->dts = m_DTS; pkt->pts = m_PTS; - pkt->duration = m_curDTS - m_prevDTS; + pkt->duration = duration; pkt->streamChange = streamChange; } m_StartCode = 0xffffffff; m_PesParserPtr = 0; m_FoundFrame = false; - m_PTS = m_curPTS; - m_DTS = m_curDTS; } } @@ -133,7 +136,7 @@ m_NeedIFrame = true; m_NeedSPS = true; m_NeedPPS = true; - m_DTS = DVD_NOPTS_VALUE; + memset(&m_streamData, 0, sizeof(m_streamData)); } int cParserH264::Parse_H264(uint32_t startcode, int buf_ptr, bool &complete) @@ -168,16 +171,22 @@ return -1; } - m_streamData.vcl_nal = vcl; - - // if this is the first frame we see, set timestamp - if (m_DTS == DVD_NOPTS_VALUE) + if (!m_FoundFrame) { - m_PTS = m_curPTS; - m_DTS = m_curDTS; + if (buf_ptr - 4 >= m_PesTimePos) + { + m_DTS = m_curDTS; + m_PTS = m_curPTS; + } + else + { + m_DTS = m_prevDTS; + m_PTS = m_prevPTS; + } } - m_FoundFrame = true; + m_streamData.vcl_nal = vcl; + m_FoundFrame = true; break; } @@ -226,7 +235,7 @@ } case NAL_AUD: - if (m_FoundFrame && (m_prevDTS != DVD_NOPTS_VALUE)) + if (m_FoundFrame && (m_prevPTS != DVD_NOPTS_VALUE)) { complete = true; m_PesNextFramePtr = buf_ptr - 4; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_h264.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_h264.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_h264.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_h264.h 2014-05-04 07:03:11.000000000 +0000 @@ -1,8 +1,5 @@ /* - * vdr-plugin-vnsi - XBMC server plugin for VDR - * - * Copyright (C) 2010 Alwin Esch (Team XBMC) - * + * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -16,9 +13,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html + * along with XBMC; see the file COPYING. If not, see + * . * */ @@ -102,7 +98,6 @@ int64_t m_DTS; int64_t m_PTS; - int Parse_H264(uint32_t startcode, int buf_ptr, bool &complete); bool Parse_PPS(uint8_t *buf, int len); bool Parse_SLH(uint8_t *buf, int len, h264_private::VCL_NAL &vcl); @@ -110,7 +105,7 @@ bool IsFirstVclNal(h264_private::VCL_NAL &vcl); public: - cParserH264(int pID, cTSStream *stream); + cParserH264(int pID, cTSStream *stream, sPtsWrap *ptsWrap, bool observePtsWraps); virtual ~cParserH264(); virtual void Parse(sStreamPacket *pkt); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_MPEGAudio.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_MPEGAudio.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_MPEGAudio.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_MPEGAudio.c 2014-05-04 07:03:11.000000000 +0000 @@ -1,8 +1,5 @@ /* - * vdr-plugin-vnsi - XBMC server plugin for VDR - * - * Copyright (C) 2010 Alwin Esch (Team XBMC) - * + * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -16,9 +13,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html + * along with XBMC; see the file COPYING. If not, see + * . * */ @@ -44,8 +40,8 @@ } }; -cParserMPEG2Audio::cParserMPEG2Audio(int pID, cTSStream *stream) - : cParser(pID, stream) +cParserMPEG2Audio::cParserMPEG2Audio(int pID, cTSStream *stream, sPtsWrap *ptsWrap, bool observePtsWraps) + : cParser(pID, stream, ptsWrap, observePtsWraps) { m_PTS = 0; m_DTS = 0; @@ -113,6 +109,7 @@ int layer = bs.readBits(2); if (layer == 0) return 0; + layer = 4 - layer; bs.skipBits(1); // protetion bit int bitrate_index = bs.readBits(4); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_MPEGAudio.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_MPEGAudio.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_MPEGAudio.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_MPEGAudio.h 2014-05-04 07:03:11.000000000 +0000 @@ -1,8 +1,5 @@ /* - * vdr-plugin-vnsi - XBMC server plugin for VDR - * - * Copyright (C) 2010 Alwin Esch (Team XBMC) - * + * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -16,9 +13,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html + * along with XBMC; see the file COPYING. If not, see + * . * */ @@ -43,7 +39,7 @@ int FindHeaders(uint8_t *buf, int buf_size); public: - cParserMPEG2Audio(int pID, cTSStream *stream); + cParserMPEG2Audio(int pID, cTSStream *stream, sPtsWrap *ptsWrap, bool observePtsWraps); virtual ~cParserMPEG2Audio(); virtual void Parse(sStreamPacket *pkt); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_MPEGVideo.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_MPEGVideo.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_MPEGVideo.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_MPEGVideo.c 2014-05-04 07:03:11.000000000 +0000 @@ -1,8 +1,5 @@ /* - * vdr-plugin-vnsi - XBMC server plugin for VDR - * - * Copyright (C) 2010 Alwin Esch (Team XBMC) - * + * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -16,9 +13,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html + * along with XBMC; see the file COPYING. If not, see + * . * */ @@ -52,8 +48,8 @@ 1500, }; -cParserMPEG2Video::cParserMPEG2Video(int pID, cTSStream *stream) - : cParser(pID, stream) +cParserMPEG2Video::cParserMPEG2Video(int pID, cTSStream *stream, sPtsWrap *ptsWrap, bool observePtsWraps) + : cParser(pID, stream, ptsWrap, observePtsWraps) { m_FrameDuration = 0; m_vbvDelay = -1; @@ -61,6 +57,7 @@ m_Height = 0; m_Width = 0; m_Dar = 0.0; + m_FpsScale = 0; m_PesBufferInitialSize = 80000; m_IsVideo = true; Reset(); @@ -97,22 +94,26 @@ { if (!m_NeedSPS && !m_NeedIFrame) { - int fpsScale = m_Stream->Rescale(m_FrameDuration); - bool streamChange = m_Stream->SetVideoInformation(fpsScale,DVD_TIME_BASE, m_Height, m_Width, m_Dar); + if (m_FpsScale == 0) + { + if (m_FrameDuration != DVD_NOPTS_VALUE) + m_FpsScale = m_Stream->Rescale(m_FrameDuration, DVD_TIME_BASE, 90000); + else + m_FpsScale = 40000; + } + bool streamChange = m_Stream->SetVideoInformation(m_FpsScale, DVD_TIME_BASE, m_Height, m_Width, m_Dar); pkt->id = m_pID; pkt->size = m_PesNextFramePtr; pkt->data = m_PesBuffer; pkt->dts = m_DTS; pkt->pts = m_PTS; - pkt->duration = m_curDTS - m_prevDTS; + pkt->duration = m_FrameDuration; pkt->streamChange = streamChange; } m_StartCode = 0xffffffff; m_PesParserPtr = 0; m_FoundFrame = false; - m_PTS = m_curPTS; - m_DTS = m_curDTS; } } @@ -122,7 +123,6 @@ m_StartCode = 0xffffffff; m_NeedIFrame = true; m_NeedSPS = true; - m_DTS = DVD_NOPTS_VALUE; } int cParserMPEG2Video::Parse_MPEG2Video(uint32_t startcode, int buf_ptr, bool &complete) @@ -150,12 +150,34 @@ if (!Parse_MPEG2Video_PicStart(buf)) return 0; - // if this is the first frame we see, set timestamp - if (m_DTS == DVD_NOPTS_VALUE) + if (!m_FoundFrame) { - m_PTS = m_curPTS; - m_DTS = m_curDTS; + m_AuPrevDTS = m_AuDTS; + if (buf_ptr - 4 >= m_PesTimePos) + { + m_AuDTS = m_curDTS != DVD_NOPTS_VALUE ? m_curDTS : m_curPTS; + m_AuPTS = m_curPTS; + } + else + { + m_AuDTS = m_prevDTS != DVD_NOPTS_VALUE ? m_prevDTS : m_prevPTS;; + m_AuPTS = m_prevPTS; + } + } + if (m_AuPrevDTS == m_AuDTS) + { + m_DTS = m_AuDTS + m_PicNumber*m_FrameDuration; + m_PTS = m_AuPTS + (m_TemporalReference-m_TrLastTime)*m_FrameDuration; } + else + { + m_PTS = m_AuPTS; + m_DTS = m_AuDTS; + m_PicNumber = 0; + m_TrLastTime = m_TemporalReference; + } + + m_PicNumber++; m_FoundFrame = true; break; } @@ -237,7 +259,7 @@ { cBitstream bs(buf, 4 * 8); - bs.skipBits(10); /* temporal reference */ + m_TemporalReference = bs.readBits(10); /* temporal reference */ int pct = bs.readBits(3); if (pct < PKT_I_FRAME || pct > PKT_B_FRAME) diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_MPEGVideo.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_MPEGVideo.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_MPEGVideo.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_MPEGVideo.h 2014-05-04 07:03:11.000000000 +0000 @@ -1,8 +1,5 @@ /* - * vdr-plugin-vnsi - XBMC server plugin for VDR - * - * Copyright (C) 2010 Alwin Esch (Team XBMC) - * + * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -16,9 +13,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html + * along with XBMC; see the file COPYING. If not, see + * . * */ @@ -46,13 +42,18 @@ float m_Dar; int64_t m_DTS; int64_t m_PTS; + int64_t m_AuDTS, m_AuPTS, m_AuPrevDTS; + int m_TemporalReference; + int m_TrLastTime; + int m_PicNumber; + int m_FpsScale; int Parse_MPEG2Video(uint32_t startcode, int buf_ptr, bool &complete); bool Parse_MPEG2Video_SeqStart(uint8_t *buf); bool Parse_MPEG2Video_PicStart(uint8_t *buf); public: - cParserMPEG2Video(int pID, cTSStream *stream); + cParserMPEG2Video(int pID, cTSStream *stream, sPtsWrap *ptsWrap, bool observePtsWraps); virtual ~cParserMPEG2Video(); virtual void Parse(sStreamPacket *pkt); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_Subtitle.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_Subtitle.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_Subtitle.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_Subtitle.c 2014-05-04 07:03:11.000000000 +0000 @@ -1,8 +1,5 @@ /* - * vdr-plugin-vnsi - XBMC server plugin for VDR - * - * Copyright (C) 2010 Alwin Esch (Team XBMC) - * + * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -16,9 +13,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html + * along with XBMC; see the file COPYING. If not, see + * . * */ @@ -28,8 +24,8 @@ #include "parser_Subtitle.h" -cParserSubtitle::cParserSubtitle(int pID, cTSStream *stream) - : cParser(pID, stream) +cParserSubtitle::cParserSubtitle(int pID, cTSStream *stream, sPtsWrap *ptsWrap, bool observePtsWraps) + : cParser(pID, stream, ptsWrap, observePtsWraps) { m_PesBufferInitialSize = 4000; } @@ -55,7 +51,7 @@ { pkt->id = m_pID; pkt->data = m_PesBuffer+2; - pkt->size = m_PesPacketLength-2; + pkt->size = m_PesPacketLength-3; pkt->duration = 0; pkt->dts = m_curDTS; pkt->pts = m_curPTS; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_Subtitle.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_Subtitle.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_Subtitle.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_Subtitle.h 2014-05-04 07:03:11.000000000 +0000 @@ -1,8 +1,5 @@ /* - * vdr-plugin-vnsi - XBMC server plugin for VDR - * - * Copyright (C) 2010 Alwin Esch (Team XBMC) - * + * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -16,9 +13,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html + * along with XBMC; see the file COPYING. If not, see + * . * */ @@ -32,7 +28,7 @@ class cParserSubtitle : public cParser { public: - cParserSubtitle(int pID, cTSStream *stream); + cParserSubtitle(int pID, cTSStream *stream, sPtsWrap *ptsWrap, bool observePtsWraps); virtual ~cParserSubtitle(); virtual void Parse(sStreamPacket *pkt); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_Teletext.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_Teletext.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_Teletext.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_Teletext.c 2014-05-04 07:03:11.000000000 +0000 @@ -1,8 +1,5 @@ /* - * vdr-plugin-vnsi - XBMC server plugin for VDR - * - * Copyright (C) 2010 Alwin Esch (Team XBMC) - * + * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -16,9 +13,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html + * along with XBMC; see the file COPYING. If not, see + * . * */ @@ -27,8 +23,8 @@ #include "parser_Teletext.h" -cParserTeletext::cParserTeletext(int pID, cTSStream *stream) - : cParser(pID, stream) +cParserTeletext::cParserTeletext(int pID, cTSStream *stream, sPtsWrap *ptsWrap, bool observePtsWraps) + : cParser(pID, stream, ptsWrap, observePtsWraps) { m_PesBufferInitialSize = 4000; } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_Teletext.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_Teletext.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_Teletext.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_Teletext.h 2014-05-04 07:03:11.000000000 +0000 @@ -1,8 +1,5 @@ /* - * vdr-plugin-vnsi - XBMC server plugin for VDR - * - * Copyright (C) 2010 Alwin Esch (Team XBMC) - * + * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This Program is free software; you can redistribute it and/or modify @@ -16,9 +13,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html + * along with XBMC; see the file COPYING. If not, see + * . * */ @@ -36,7 +32,7 @@ int64_t m_lastPTS; public: - cParserTeletext(int pID, cTSStream *stream); + cParserTeletext(int pID, cTSStream *stream, sPtsWrap *ptsWrap, bool observePtsWraps); virtual ~cParserTeletext(); virtual void Parse(sStreamPacket *pkt); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/recplayer.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/recplayer.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/recplayer.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/recplayer.c 2014-05-04 07:03:11.000000000 +0000 @@ -34,11 +34,16 @@ #include #include -cRecPlayer::cRecPlayer(cRecording* rec) +#ifndef O_NOATIME +#define O_NOATIME 0 +#endif + +cRecPlayer::cRecPlayer(cRecording* rec, bool inProgress) { m_file = -1; m_fileOpen = -1; m_recordingFilename = strdup(rec->FileName()); + m_inProgress = inProgress; // FIXME find out max file path / name lengths #if VDRVERSNUM < 10703 @@ -94,6 +99,39 @@ INFOLOG("total frames: %u", m_totalFrames); } +void cRecPlayer::reScan() +{ + struct stat s; + + m_totalLength = 0; + + for(int i = 0; ; i++) // i think we only need one possible loop + { + fileNameFromIndex(i); + + if(stat(m_fileName, &s) == -1) { + break; + } + + cSegment* segment; + if (m_segments.Size() < i+1) + { + cSegment* segment = new cSegment(); + m_segments.Append(segment); + segment->start = m_totalLength; + } + else + segment = m_segments[i]; + + segment->end = segment->start + s.st_size; + + m_totalLength += s.st_size; + } + + m_totalFrames = m_indexFile->Last(); +} + + cRecPlayer::~cRecPlayer() { cleanup(); @@ -118,7 +156,7 @@ fileNameFromIndex(index); INFOLOG("openFile called for index %i string:%s", index, m_fileName); - m_file = open(m_fileName, O_RDONLY | O_NOATIME); + m_file = open(m_fileName, O_RDONLY); if (m_file == -1) { INFOLOG("file failed to open"); @@ -155,14 +193,20 @@ int cRecPlayer::getBlock(unsigned char* buffer, uint64_t position, int amount) { // dont let the block be larger than 256 kb - if (amount > 256*1024) - amount = 256*1024; + if (amount > 512*1024) + amount = 512*1024; if ((uint64_t)amount > m_totalLength) amount = m_totalLength; if (position >= m_totalLength) - return 0; + { + reScan(); + if (position >= m_totalLength) + { + return 0; + } + } if ((position + amount) > m_totalLength) amount = m_totalLength - position; @@ -178,16 +222,19 @@ } // segment not found / invalid position - if (segmentNumber == -1) return 0; + if (segmentNumber == -1) + return 0; // open file (if not already open) - if (!openFile(segmentNumber)) return 0; + if (!openFile(segmentNumber)) + return 0; // work out position in current file uint64_t filePosition = position - m_segments[segmentNumber]->start; // seek to position - if(lseek(m_file, filePosition, SEEK_SET) == -1) { + if(lseek(m_file, filePosition, SEEK_SET) == -1) + { ERRORLOG("unable to seek to position: %lu", filePosition); return 0; } @@ -195,16 +242,21 @@ // try to read the block int bytes_read = read(m_file, buffer, amount); - if(bytes_read <= 0) { + // we may got stuck at end of segment + if ((bytes_read == 0) && (position < m_totalLength)) + bytes_read += getBlock(buffer, position+1 , amount); + + if(bytes_read <= 0) + { return 0; } - // Tell linux not to bother keeping the data in the FS cache - posix_fadvise(m_file, filePosition, bytes_read, POSIX_FADV_DONTNEED); - - // divide and conquer - if(bytes_read < amount) { - bytes_read += getBlock(&buffer[bytes_read], position + bytes_read, amount - bytes_read); + if (!m_inProgress) + { +#ifndef __FreeBSD__ + // Tell linux not to bother keeping the data in the FS cache + posix_fadvise(m_file, filePosition, bytes_read, POSIX_FADV_DONTNEED); +#endif } return bytes_read; @@ -212,7 +264,8 @@ uint64_t cRecPlayer::positionFromFrameNumber(uint32_t frameNumber) { - if (!m_indexFile) return 0; + if (!m_indexFile) + return 0; #if VDRVERSNUM < 10703 unsigned char retFileNumber; int retFileOffset; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/recplayer.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/recplayer.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/recplayer.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/recplayer.h 2014-05-04 07:03:11.000000000 +0000 @@ -47,7 +47,7 @@ class cRecPlayer { public: - cRecPlayer(cRecording* rec); + cRecPlayer(cRecording* rec, bool inProgress = false); ~cRecPlayer(); uint64_t getLengthBytes(); uint32_t getLengthFrames(); @@ -57,6 +57,7 @@ void closeFile(); void scan(); + void reScan(); uint64_t positionFromFrameNumber(uint32_t frameNumber); uint32_t frameNumberFromPosition(uint64_t position); bool getNextIFrame(uint32_t frameNumber, uint32_t direction, uint64_t* rfilePosition, uint32_t* rframeNumber, uint32_t* rframeLength); @@ -75,6 +76,7 @@ uint32_t m_totalFrames; char *m_recordingFilename; bool m_pesrecording; + bool m_inProgress; }; #endif // VNSI_RECPLAYER_H diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/requestpacket.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/requestpacket.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/requestpacket.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/requestpacket.c 2014-05-04 07:03:11.000000000 +0000 @@ -28,7 +28,13 @@ #include #include +#ifndef __FreeBSD__ #include +#else +#include +#define __be64_to_cpu be64toh +#define __cpu_to_be64 htobe64 +#endif #include "config.h" #include "requestpacket.h" @@ -102,6 +108,16 @@ return ull; } +int64_t cRequestPacket::extract_S64() +{ + if ((packetPos + sizeof(int64_t)) > userDataLength) return 0; + int64_t ll; + memcpy(&ll, &userData[packetPos], sizeof(int64_t)); + ll = __be64_to_cpu(ll); + packetPos += sizeof(int64_t); + return ll; +} + double cRequestPacket::extract_Double() { if ((packetPos + sizeof(uint64_t)) > userDataLength) return 0; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/requestpacket.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/requestpacket.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/requestpacket.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/requestpacket.h 2014-05-04 07:03:11.000000000 +0000 @@ -46,6 +46,7 @@ uint8_t extract_U8(); uint32_t extract_U32(); uint64_t extract_U64(); + int64_t extract_S64(); int32_t extract_S32(); double extract_Double(); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/responsepacket.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/responsepacket.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/responsepacket.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/responsepacket.c 2014-05-04 07:03:11.000000000 +0000 @@ -31,8 +31,15 @@ #include #include #include +#include +#ifndef __FreeBSD__ #include +#else +#include +#define __be64_to_cpu be64toh +#define __cpu_to_be64 htobe64 +#endif #include "responsepacket.h" #include "vnsicommand.h" @@ -120,7 +127,7 @@ return true; } -bool cResponsePacket::initStream(uint32_t opCode, uint32_t streamID, uint32_t duration, int64_t pts, int64_t dts) +bool cResponsePacket::initStream(uint32_t opCode, uint32_t streamID, uint32_t duration, int64_t pts, int64_t dts, uint32_t serial) { initBuffers(); @@ -139,6 +146,8 @@ memcpy(&buffer[16], &ull, sizeof(uint64_t)); ull = __cpu_to_be64(dts); // DTS memcpy(&buffer[24], &ull, sizeof(uint64_t)); + ul = htonl(serial); + memcpy(&buffer[32], &ul, sizeof(uint32_t)); ul = 0; memcpy(&buffer[userDataLenPosStream], &ul, sizeof(uint32_t)); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/responsepacket.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/responsepacket.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/responsepacket.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/responsepacket.h 2014-05-04 07:03:11.000000000 +0000 @@ -40,7 +40,7 @@ bool init(uint32_t requestID); bool initScan(uint32_t opCode); bool initStatus(uint32_t opCode); - bool initStream(uint32_t opCode, uint32_t streamID, uint32_t duration, int64_t pts, int64_t dts); + bool initStream(uint32_t opCode, uint32_t streamID, uint32_t duration, int64_t pts, int64_t dts, uint32_t serial); bool initOsd(uint32_t opCode, int32_t wnd, int32_t color, int32_t x0, int32_t y0, int32_t x1, int32_t y1); void finalise(); void finaliseStream(); @@ -72,8 +72,8 @@ const static uint32_t headerLength = 12; const static uint32_t userDataLenPos = 8; - const static uint32_t headerLengthStream = 36; - const static uint32_t userDataLenPosStream = 32; + const static uint32_t headerLengthStream = 40; + const static uint32_t userDataLenPosStream = 36; const static uint32_t headerLengthOSD = 36; const static uint32_t userDataLenPosOSD = 32; }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/setup.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/setup.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/setup.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/setup.c 2014-05-04 07:03:11.000000000 +0000 @@ -1,31 +1,51 @@ /* -* Copyright (C) 2005-2012 Team XBMC -* http://www.xbmc.org -* -* This Program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. -* -* This Program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XBMC; see the file COPYING. If not, see -* . -* -*/ + * Copyright (C) 2005-2012 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ #include "setup.h" +#include "vnsicommand.h" int PmtTimeout = 5; +int TimeshiftMode = 0; +int TimeshiftBufferSize = 5; +int TimeshiftBufferFileSize = 6; +char TimeshiftBufferDir[PATH_MAX] = "\0"; cMenuSetupVNSI::cMenuSetupVNSI(void) { newPmtTimeout = PmtTimeout; Add(new cMenuEditIntItem( tr("PMT Timeout (0-10)"), &newPmtTimeout)); + + timeshiftModesTexts[0] = tr("Off"); + timeshiftModesTexts[1] = tr("RAM"); + timeshiftModesTexts[2] = tr("File"); + newTimeshiftMode = TimeshiftMode; + Add(new cMenuEditStraItem( tr("Time Shift Mode"), &newTimeshiftMode, 3, timeshiftModesTexts)); + + newTimeshiftBufferSize = TimeshiftBufferSize; + Add(new cMenuEditIntItem( tr("TS Buffersize (RAM) (1-20) x 100MB"), &newTimeshiftBufferSize)); + + newTimeshiftBufferFileSize = TimeshiftBufferFileSize; + Add(new cMenuEditIntItem( tr("TS Buffersize (File) (1-10) x 1GB"), &newTimeshiftBufferFileSize)); + + strn0cpy(newTimeshiftBufferDir, TimeshiftBufferDir, sizeof(newTimeshiftBufferDir)); + Add(new cMenuEditStrItem(tr("TS Buffer Directory"), newTimeshiftBufferDir, sizeof(newTimeshiftBufferDir))); } void cMenuSetupVNSI::Store(void) @@ -33,4 +53,20 @@ if (newPmtTimeout > 10 || newPmtTimeout < 0) newPmtTimeout = 2; SetupStore(CONFNAME_PMTTIMEOUT, PmtTimeout = newPmtTimeout); + + SetupStore(CONFNAME_TIMESHIFT, TimeshiftMode = newTimeshiftMode); + + if (newTimeshiftBufferSize > 40) + newTimeshiftBufferSize = 40; + else if (newTimeshiftBufferSize < 1) + newTimeshiftBufferSize = 1; + SetupStore(CONFNAME_TIMESHIFTBUFFERSIZE, TimeshiftBufferSize = newTimeshiftBufferSize); + + if (newTimeshiftBufferFileSize > 20) + newTimeshiftBufferFileSize = 20; + else if (newTimeshiftBufferFileSize < 1) + newTimeshiftBufferFileSize = 1; + SetupStore(CONFNAME_TIMESHIFTBUFFERFILESIZE, TimeshiftBufferFileSize = newTimeshiftBufferFileSize); + + SetupStore(CONFNAME_TIMESHIFTBUFFERDIR, strn0cpy(TimeshiftBufferDir, newTimeshiftBufferDir, sizeof(TimeshiftBufferDir))); } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/setup.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/setup.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/setup.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/setup.h 2014-05-04 07:03:11.000000000 +0000 @@ -23,12 +23,15 @@ #include -#define CONFNAME_PMTTIMEOUT "PmtTimeout" - class cMenuSetupVNSI : public cMenuSetupPage { private: int newPmtTimeout; + int newTimeshiftMode; + const char *timeshiftModesTexts[3]; + int newTimeshiftBufferSize; + int newTimeshiftBufferFileSize; + char newTimeshiftBufferDir[PATH_MAX]; protected: virtual void Store(void); public: diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/status.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/status.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/status.c 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/status.c 2014-05-04 07:03:11.000000000 +0000 @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2005-2014 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "vnsi.h" +#include "status.h" +#include "vnsiclient.h" +#include +#include +#include +#include + +cVNSIStatus::~cVNSIStatus() +{ + Shutdown(); +} + +void cVNSIStatus::Shutdown() +{ + Cancel(5); + cMutexLock lock(&m_mutex); + for (ClientList::iterator i = m_clients.begin(); i != m_clients.end(); i++) + { + delete (*i); + } + m_clients.erase(m_clients.begin(), m_clients.end()); +} + +void cVNSIStatus::AddClient(cVNSIClient* client) +{ + cMutexLock lock(&m_mutex); + m_clients.push_back(client); +} + +void cVNSIStatus::Action(void) +{ + cTimeMs chanTimer(0); + + // get initial state of the recordings + int recState = -1; + Recordings.StateChanged(recState); + + // get initial state of the timers + int timerState = -1; + Timers.Modified(timerState); + + // last update of epg + time_t epgUpdate = cSchedules::Modified(); + + // delete old timeshift file + cString cmd; + struct stat sb; + if ((*TimeshiftBufferDir) && stat(TimeshiftBufferDir, &sb) == 0 && S_ISDIR(sb.st_mode)) + { + if (TimeshiftBufferDir[strlen(TimeshiftBufferDir)-1] == '/') + cmd = cString::sprintf("rm -f %s*.vnsi", TimeshiftBufferDir); + else + cmd = cString::sprintf("rm -f %s/*.vnsi", TimeshiftBufferDir); + } + else + { +#if VDRVERSNUM >= 20102 + cmd = cString::sprintf("rm -f %s/*.vnsi", cVideoDirectory::Name()); +#else + cmd = cString::sprintf("rm -f %s/*.vnsi", VideoDirectory); +#endif + } + int ret = system(cmd); + + // set thread priority + SetPriority(1); + + while (Running()) + { + m_mutex.Lock(); + + // remove disconnected clients + for (ClientList::iterator i = m_clients.begin(); i != m_clients.end();) + { + if (!(*i)->Active()) + { + INFOLOG("Client with ID %u seems to be disconnected, removing from client list", (*i)->GetID()); + delete (*i); + i = m_clients.erase(i); + } + else { + i++; + } + } + + // trigger clients to reload the modified channel list + if(m_clients.size() > 0 && chanTimer.TimedOut()) + { + int modified = Channels.Modified(); + if (modified) + { + Channels.SetModified((modified == CHANNELSMOD_USER) ? true : false); + INFOLOG("Requesting clients to reload channel list"); + for (ClientList::iterator i = m_clients.begin(); i != m_clients.end(); i++) + (*i)->ChannelsChange(); + } + chanTimer.Set(5000); + } + + // reset inactivity timeout as long as there are clients connected + if(m_clients.size() > 0) { + ShutdownHandler.SetUserInactiveTimeout(); + } + + // update recordings + if(Recordings.StateChanged(recState)) + { + INFOLOG("Recordings state changed (%i)", recState); + INFOLOG("Requesting clients to reload recordings list"); + for (ClientList::iterator i = m_clients.begin(); i != m_clients.end(); i++) + (*i)->RecordingsChange(); + } + + // update timers + if(Timers.Modified(timerState)) + { + INFOLOG("Timers state changed (%i)", timerState); + INFOLOG("Requesting clients to reload timers"); + for (ClientList::iterator i = m_clients.begin(); i != m_clients.end(); i++) + { + (*i)->TimerChange(); + } + } + + // update epg + if((cSchedules::Modified() > epgUpdate + 10) || time(NULL) > epgUpdate + 300) + { + for (ClientList::iterator i = m_clients.begin(); i != m_clients.end(); i++) + { + (*i)->EpgChange(); + } + epgUpdate = cSchedules::Modified(); + } + + m_mutex.Unlock(); + + usleep(250*1000); + } +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/status.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/status.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/status.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/status.h 2014-05-04 07:03:11.000000000 +0000 @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2005-2014 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#pragma once + +#include +#include + +class cVNSIClient; + +typedef std::list ClientList; + +class cVNSIStatus : public cThread +{ +public: + virtual ~cVNSIStatus(); + void Shutdown(); + void AddClient(cVNSIClient* client); + +protected: + virtual void Action(void); + + ClientList m_clients; + cMutex m_mutex; +}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/streamer.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/streamer.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/streamer.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/streamer.c 2014-05-04 07:03:11.000000000 +0000 @@ -40,9 +40,11 @@ // --- cLiveStreamer ------------------------------------------------- -cLiveStreamer::cLiveStreamer(uint32_t timeout) +cLiveStreamer::cLiveStreamer(int clientID, uint8_t timeshift, uint32_t timeout) : cThread("cLiveStreamer stream processor") + , m_ClientID(clientID) , m_scanTimeout(timeout) + , m_VideoInput(m_Event, m_Mutex, m_IsRetune) { m_Channel = NULL; m_Socket = NULL; @@ -52,6 +54,9 @@ m_startup = true; m_SignalLost = false; m_IFrameSeen = false; + m_VideoBuffer = NULL; + m_Timeshift = timeshift; + m_IsRetune = false; memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo)); @@ -64,26 +69,109 @@ DEBUGLOG("Started to delete live streamer"); Cancel(5); + Close(); + DEBUGLOG("Finished to delete live streamer"); +} + +bool cLiveStreamer::Open(int serial) +{ + Close(); + +#if APIVERSNUM >= 10725 + m_Device = cDevice::GetDevice(m_Channel, m_Priority, true, true); +#else + m_Device = cDevice::GetDevice(m_Channel, m_Priority, true); +#endif + + if (!m_Device) + return false; + + bool recording = false; + if (0) // test harness + { + recording = true; + m_VideoBuffer = cVideoBuffer::Create("/home/xbmc/test.ts"); + } + else if (serial == -1) + { + for (cTimer *timer = Timers.First(); timer; timer = Timers.Next(timer)) + { + if (timer && + timer->Recording() && + timer->Channel() == m_Channel) + { + Recordings.Load(); + cRecording matchRec(timer, timer->Event()); + cRecording *rec; + { + cThreadLock RecordingsLock(&Recordings); + rec = Recordings.GetByName(matchRec.FileName()); + if (!rec) + { + return false; + } + } + m_VideoBuffer = cVideoBuffer::Create(rec); + recording = true; + break; + } + } + } + if (!recording) + { + m_VideoBuffer = cVideoBuffer::Create(m_ClientID, m_Timeshift); + } + + if (!m_VideoBuffer) + return false; + + if (!recording) + { + if (m_Channel && ((m_Channel->Source() >> 24) == 'V')) + m_IsMPEGPS = true; + + m_IsRetune = false; + if (!m_VideoInput.Open(m_Channel, m_Priority, m_VideoBuffer)) + { + ERRORLOG("Can't switch to channel %i - %s", m_Channel->Number(), m_Channel->Name()); + return false; + } + } + + m_Demuxer.Open(*m_Channel, m_VideoBuffer); + if (serial >= 0) + m_Demuxer.SetSerial(serial); + + return true; +} + +void cLiveStreamer::Close(void) +{ + INFOLOG("LiveStreamer::Close - close"); m_VideoInput.Close(); m_Demuxer.Close(); - delete m_VideoBuffer; + if (m_VideoBuffer) + { + delete m_VideoBuffer; + m_VideoBuffer = NULL; + } if (m_Frontend >= 0) { close(m_Frontend); m_Frontend = -1; } - - DEBUGLOG("Finished to delete live streamer"); } void cLiveStreamer::Action(void) { int ret; sStreamPacket pkt; + memset(&pkt, 0, sizeof(sStreamPacket)); bool requestStreamChange = false; cTimeMs last_info(1000); + cTimeMs bufferStatsTimer(1000); while (Running()) { @@ -99,6 +187,11 @@ if (pkt.streamChange || requestStreamChange) sendStreamChange(); requestStreamChange = false; + if (pkt.reftime) + { + sendRefTime(&pkt); + pkt.reftime = 0; + } sendStreamPacket(&pkt); } @@ -108,18 +201,43 @@ last_info.Set(0); sendSignalInfo(); } + + // send buffer stats + if(bufferStatsTimer.TimedOut()) + { + sendBufferStatus(); + bufferStatsTimer.Set(1000); + } } - else + else if (ret == -1) { // no data + { + cMutexLock lock(&m_Mutex); + if (m_IsRetune) + { + m_VideoInput.Close(); + m_VideoInput.Open(m_Channel, m_Priority, m_VideoBuffer); + m_IsRetune = false; + } + else + m_Event.TimedWait(m_Mutex, 10); + } if(m_last_tick.Elapsed() >= (uint64_t)(m_scanTimeout*1000)) { - INFOLOG("No Signal"); sendStreamStatus(); m_last_tick.Set(0); m_SignalLost = true; } } + else if (ret == -2) + { + if (!Open(m_Demuxer.GetSerial())) + { + m_Socket->Shutdown(); + break; + } + } } INFOLOG("exit streamer thread"); } @@ -132,32 +250,22 @@ return false; } - m_VideoBuffer = cVideoBuffer::Create(); m_Channel = channel; + m_Priority = priority; m_Socket = Socket; - m_Device = cDevice::GetDevice(m_Channel, priority, true); - - if (m_Channel && ((m_Channel->Source() >> 24) == 'V')) m_IsMPEGPS = true; - if (m_VideoInput.Open(channel, priority, m_VideoBuffer)) - { - m_Demuxer.Open(*m_Channel, m_VideoBuffer); + if (!Open()) + return false; - // Send the OK response here, that it is before the Stream end message - resp->add_U32(VNSI_RET_OK); - resp->finalise(); - m_Socket->write(resp->getPtr(), resp->getLen()); + // Send the OK response here, that it is before the Stream end message + resp->add_U32(VNSI_RET_OK); + resp->finalise(); + m_Socket->write(resp->getPtr(), resp->getLen()); - Activate(true); + Activate(true); - INFOLOG("Successfully switched to channel %i - %s", m_Channel->Number(), m_Channel->Name()); - return true; - } - else - { - ERRORLOG("Can't switch to channel %i - %s", m_Channel->Number(), m_Channel->Name()); - } - return false; + INFOLOG("Successfully switched to channel %i - %s", m_Channel->Number(), m_Channel->Name()); + return true; } inline void cLiveStreamer::Activate(bool On) @@ -182,7 +290,7 @@ if(pkt->size == 0) return; - if (!m_streamHeader.initStream(VNSI_STREAM_MUXPKT, pkt->id, pkt->duration, pkt->pts, pkt->dts)) + if (!m_streamHeader.initStream(VNSI_STREAM_MUXPKT, pkt->id, pkt->duration, pkt->pts, pkt->dts, pkt->serial)) { ERRORLOG("stream response packet init fail"); return; @@ -202,7 +310,7 @@ void cLiveStreamer::sendStreamChange() { cResponsePacket *resp = new cResponsePacket(); - if (!resp->initStream(VNSI_STREAM_CHANGE, 0, 0, 0, 0)) + if (!resp->initStream(VNSI_STREAM_CHANGE, 0, 0, 0, 0, 0)) { ERRORLOG("stream response packet init fail"); delete resp; @@ -285,7 +393,7 @@ else if (stream->Type() == stAACLATM) { stream->GetAudioInformation(Channels, SampleRate, BitRate, BitsPerSample, BlockAlign); - resp->add_String("AACLATM"); + resp->add_String("AAC_LATM"); resp->add_String(stream->GetLanguage()); resp->add_U32(Channels); resp->add_U32(SampleRate); @@ -329,7 +437,7 @@ if (m_Frontend == -2) { cResponsePacket *resp = new cResponsePacket(); - if (!resp->initStream(VNSI_STREAM_SIGNALINFO, 0, 0, 0, 0)) + if (!resp->initStream(VNSI_STREAM_SIGNALINFO, 0, 0, 0, 0, 0)) { ERRORLOG("stream response packet init fail"); delete resp; @@ -377,7 +485,7 @@ if (m_Frontend >= 0) { cResponsePacket *resp = new cResponsePacket(); - if (!resp->initStream(VNSI_STREAM_SIGNALINFO, 0, 0, 0, 0)) + if (!resp->initStream(VNSI_STREAM_SIGNALINFO, 0, 0, 0, 0, 0)) { ERRORLOG("stream response packet init fail"); delete resp; @@ -417,7 +525,7 @@ if (m_Frontend >= 0) { cResponsePacket *resp = new cResponsePacket(); - if (!resp->initStream(VNSI_STREAM_SIGNALINFO, 0, 0, 0, 0)) + if (!resp->initStream(VNSI_STREAM_SIGNALINFO, 0, 0, 0, 0, 0)) { ERRORLOG("stream response packet init fail"); delete resp; @@ -470,14 +578,93 @@ void cLiveStreamer::sendStreamStatus() { cResponsePacket *resp = new cResponsePacket(); - if (!resp->initStream(VNSI_STREAM_STATUS, 0, 0, 0, 0)) + if (!resp->initStream(VNSI_STREAM_STATUS, 0, 0, 0, 0, 0)) { ERRORLOG("stream response packet init fail"); delete resp; return; } - resp->add_String("No Signal"); + uint16_t error = m_Demuxer.GetError(); + if (error & ERROR_PES_SCRAMBLE) + { + INFOLOG("Channel: scrambled %d", error); + resp->add_String(cString::sprintf("Channel: scrambled (%d)", error)); + } + else if (error & ERROR_PES_STARTCODE) + { + INFOLOG("Channel: startcode %d", error); + resp->add_String(cString::sprintf("Channel: encrypted? (%d)", error)); + } + else if (error & ERROR_DEMUX_NODATA) + { + INFOLOG("Channel: no data %d", error); + resp->add_String(cString::sprintf("Channel: no data")); + } + else + { + INFOLOG("Channel: unknown error %d", error); + resp->add_String(cString::sprintf("Channel: unknown error (%d)", error)); + } + resp->finaliseStream(); m_Socket->write(resp->getPtr(), resp->getLen()); delete resp; } + +void cLiveStreamer::sendBufferStatus() +{ + cResponsePacket *resp = new cResponsePacket(); + if (!resp->initStream(VNSI_STREAM_BUFFERSTATS, 0, 0, 0, 0, 0)) + { + ERRORLOG("stream response packet init fail"); + delete resp; + return; + } + uint32_t start, end; + bool timeshift; + m_Demuxer.BufferStatus(timeshift, start, end); + resp->add_U8(timeshift); + resp->add_U32(start); + resp->add_U32(end); + resp->finaliseStream(); + m_Socket->write(resp->getPtr(), resp->getLen()); + delete resp; +} + +void cLiveStreamer::sendRefTime(sStreamPacket *pkt) +{ + if(pkt == NULL) + return; + + cResponsePacket *resp = new cResponsePacket(); + if (!resp->initStream(VNSI_STREAM_REFTIME, 0, 0, 0, 0, 0)) + { + ERRORLOG("stream response packet init fail"); + delete resp; + return; + } + + resp->add_U32(pkt->reftime); + resp->add_U64(pkt->pts); + resp->finaliseStream(); + m_Socket->write(resp->getPtr(), resp->getLen()); + delete resp; +} + +bool cLiveStreamer::SeekTime(int64_t time, uint32_t &serial) +{ + bool ret = m_Demuxer.SeekTime(time); + serial = m_Demuxer.GetSerial(); + return ret; +} + +void cLiveStreamer::RetuneChannel(const cChannel *channel) +{ + if (m_Channel != channel || !m_VideoInput.IsOpen()) + return; + + INFOLOG("re-tune to channel %s", m_Channel->Name()); + cMutexLock lock(&m_Mutex); + m_IsRetune = true; + m_Event.Broadcast(); +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/streamer.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/streamer.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/streamer.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/streamer.h 2014-05-04 07:03:11.000000000 +0000 @@ -57,7 +57,10 @@ void sendStreamChange(); void sendSignalInfo(); void sendStreamStatus(); + void sendBufferStatus(); + void sendRefTime(sStreamPacket *pkt); + int m_ClientID; const cChannel *m_Channel; /*!> Channel to stream */ cDevice *m_Device; cxSocket *m_Socket; /*!> The socket class to communicate with client */ @@ -76,12 +79,19 @@ cVNSIDemuxer m_Demuxer; cVideoBuffer *m_VideoBuffer; cVideoInput m_VideoInput; + int m_Priority; + uint8_t m_Timeshift; + cCondVar m_Event; + cMutex m_Mutex; + bool m_IsRetune; protected: virtual void Action(void); + bool Open(int serial = -1); + void Close(); public: - cLiveStreamer(uint32_t timeout = 0); + cLiveStreamer(int clientID, uint8_t timeshift, uint32_t timeout = 0); virtual ~cLiveStreamer(); void Activate(bool On); @@ -90,6 +100,8 @@ bool IsStarting() { return m_startup; } bool IsAudioOnly() { return m_IsAudioOnly; } bool IsMPEGPS() { return m_IsMPEGPS; } + bool SeekTime(int64_t time, uint32_t &serial); + void RetuneChannel(const cChannel *channel); }; #endif // VNSI_RECEIVER_H diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/videobuffer.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/videobuffer.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/videobuffer.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/videobuffer.c 2014-05-04 07:03:11.000000000 +0000 @@ -19,16 +19,25 @@ */ #include "videobuffer.h" +#include "config.h" +#include "vnsi.h" +#include "recplayer.h" #include #include +#include +#include + +#include +#include +#include class cVideoBufferSimple : public cVideoBuffer { friend class cVideoBuffer; public: - virtual void Put(uint8_t *buf, int size); - virtual int Read(uint8_t **buf, int size); + virtual void Put(uint8_t *buf, unsigned int size); + virtual int ReadBlock(uint8_t **buf, unsigned int size, time_t &endTime, time_t &wrapTime); protected: cVideoBufferSimple(); @@ -50,12 +59,12 @@ delete m_Buffer; } -void cVideoBufferSimple::Put(uint8_t *buf, int size) +void cVideoBufferSimple::Put(uint8_t *buf, unsigned int size) { m_Buffer->Put(buf, size); } -int cVideoBufferSimple::Read(uint8_t **buf, int size) +int cVideoBufferSimple::ReadBlock(uint8_t **buf, unsigned int size, time_t &endTime, time_t &wrapTime) { int readBytes; if (m_BytesConsumed) @@ -87,21 +96,866 @@ } m_BytesConsumed += TS_SIZE; + endTime = 0; + wrapTime = 0; + return TS_SIZE; +} + +//----------------------------------------------------------------------------- + +#define MARGIN 40000 + +class cVideoBufferTimeshift : public cVideoBuffer +{ +friend class cVideoBuffer; +public: + virtual off_t GetPosMin(); + virtual off_t GetPosMax(); + virtual off_t GetPosCur(); + virtual void GetPositions(off_t *cur, off_t *min, off_t *max); + virtual bool HasBuffer() { return true; }; + +protected: + cVideoBufferTimeshift(); + virtual bool Init() = 0; + virtual off_t Available(); + off_t m_BufferSize; + off_t m_WritePtr; + off_t m_ReadPtr; + bool m_BufferFull; + unsigned int m_Margin; + unsigned int m_BytesConsumed; + cMutex m_Mutex; +}; + +cVideoBufferTimeshift::cVideoBufferTimeshift() +{ + m_Margin = TS_SIZE*2; + m_BufferFull = false; + m_ReadPtr = 0; + m_WritePtr = 0; + m_BytesConsumed = 0; +} + +off_t cVideoBufferTimeshift::GetPosMin() +{ + off_t ret; + if (!m_BufferFull) + return 0; + + ret = m_WritePtr + MARGIN * 2; + if (ret >= m_BufferSize) + ret -= m_BufferSize; + + return ret; +} + +off_t cVideoBufferTimeshift::GetPosMax() +{ + off_t ret = m_WritePtr; + if (ret < GetPosMin()) + ret += m_BufferSize; + return ret; +} + +off_t cVideoBufferTimeshift::GetPosCur() +{ + off_t ret = m_ReadPtr; + if (ret < GetPosMin()) + ret += m_BufferSize; + return ret; +} + +void cVideoBufferTimeshift::GetPositions(off_t *cur, off_t *min, off_t *max) +{ + cMutexLock lock(&m_Mutex); + + *cur = GetPosCur(); + *min = GetPosMin(); + *min = (*min > *cur) ? *cur : *min; + *max = GetPosMax(); +} + +off_t cVideoBufferTimeshift::Available() +{ + cMutexLock lock(&m_Mutex); + + off_t ret; + if (m_ReadPtr <= m_WritePtr) + ret = m_WritePtr - m_ReadPtr; + else + ret = m_BufferSize - (m_ReadPtr - m_WritePtr); + + return ret; +} +//----------------------------------------------------------------------------- + +class cVideoBufferRAM : public cVideoBufferTimeshift +{ +friend class cVideoBuffer; +public: + virtual void Put(uint8_t *buf, unsigned int size); + virtual int ReadBlock(uint8_t **buf, unsigned int size, time_t &endTime, time_t &wrapTime); + virtual void SetPos(off_t pos); + +protected: + cVideoBufferRAM(); + virtual ~cVideoBufferRAM(); + virtual bool Init(); + uint8_t *m_Buffer; + uint8_t *m_BufferPtr; +}; + +cVideoBufferRAM::cVideoBufferRAM() +{ + m_Buffer = 0; +} + +cVideoBufferRAM::~cVideoBufferRAM() +{ + if (m_Buffer) + free(m_Buffer); +} + +bool cVideoBufferRAM::Init() +{ + m_BufferSize = (off_t)TimeshiftBufferSize*100*1000*1000; + INFOLOG("allocated timeshift buffer with size: %ld", m_BufferSize); + m_Buffer = (uint8_t*)malloc(m_BufferSize + m_Margin); + m_BufferPtr = m_Buffer + m_Margin; + if (!m_Buffer) + return false; + else + return true; +} + +void cVideoBufferRAM::SetPos(off_t pos) +{ + cMutexLock lock(&m_Mutex); + + m_ReadPtr = pos; + if (m_ReadPtr >= m_BufferSize) + m_ReadPtr -= m_BufferSize; + m_BytesConsumed = 0; +} + +void cVideoBufferRAM::Put(uint8_t *buf, unsigned int size) +{ + if (Available() + MARGIN >= m_BufferSize) + { + return; + } + + if ((m_BufferSize - m_WritePtr) <= size) + { + int bytes = m_BufferSize - m_WritePtr; + memcpy(m_BufferPtr+m_WritePtr, buf, bytes); + size -= bytes; + buf += bytes; + cMutexLock lock(&m_Mutex); + m_WritePtr = 0; + } + + memcpy(m_BufferPtr+m_WritePtr, buf, size); + + cMutexLock lock(&m_Mutex); + + m_WritePtr += size; + if (!m_BufferFull) + { + if ((m_WritePtr + 2*MARGIN) > m_BufferSize) + { + m_BufferFull = true; + time(&m_bufferWrapTime); + } + } + + time(&m_bufferEndTime); +} + +int cVideoBufferRAM::ReadBlock(uint8_t **buf, unsigned int size, time_t &endTime, time_t &wrapTime) +{ + // move read pointer + if (m_BytesConsumed) + { + cMutexLock lock(&m_Mutex); + m_ReadPtr += m_BytesConsumed; + if (m_ReadPtr >= m_BufferSize) + m_ReadPtr -= m_BufferSize; + + endTime = m_bufferEndTime; + wrapTime = m_bufferWrapTime; + } + m_BytesConsumed = 0; + + // check if we have anything to read + off_t readBytes = Available(); + if (readBytes < m_Margin) + { + return 0; + } + + // if we are close to end, copy margin to front + if (m_ReadPtr > (m_BufferSize - m_Margin)) + { + int bytesToCopy = m_BufferSize - m_ReadPtr; + memmove(m_Buffer + (m_Margin - bytesToCopy), m_Buffer + m_ReadPtr, bytesToCopy); + *buf = m_Buffer + (m_Margin - bytesToCopy); + } + else + *buf = m_BufferPtr + m_ReadPtr; + + // Make sure we are looking at a TS packet + while (readBytes > TS_SIZE) + { + if ((*buf)[0] == TS_SYNC_BYTE && (*buf)[TS_SIZE] == TS_SYNC_BYTE) + break; + m_BytesConsumed++; + (*buf)++; + readBytes--; + } + + if ((*buf)[0] != TS_SYNC_BYTE) + { + return 0; + } + + m_BytesConsumed += TS_SIZE; return TS_SIZE; } //----------------------------------------------------------------------------- +class cVideoBufferFile : public cVideoBufferTimeshift +{ +friend class cVideoBuffer; +public: + virtual off_t GetPosMax(); + virtual void Put(uint8_t *buf, unsigned int size); + virtual int ReadBlock(uint8_t **buf, unsigned int size, time_t &endTime, time_t &wrapTime); + virtual void SetPos(off_t pos); + +protected: + cVideoBufferFile(); + cVideoBufferFile(int clientID); + virtual ~cVideoBufferFile(); + virtual bool Init(); + virtual int ReadBytes(uint8_t *buf, off_t pos, unsigned int size); + int m_ClientID; + cString m_Filename; + int m_Fd; + uint8_t *m_ReadCache; + unsigned int m_ReadCachePtr; + unsigned int m_ReadCacheSize; + unsigned int m_ReadCacheMaxSize; +}; + +cVideoBufferFile::cVideoBufferFile() +{ + +} + +cVideoBufferFile::cVideoBufferFile(int clientID) +{ + m_ClientID = clientID; + m_Fd = 0; + m_ReadCacheSize = 0; + m_ReadCache = 0; +} + +cVideoBufferFile::~cVideoBufferFile() +{ + if (m_Fd) + { + close(m_Fd); + unlink(m_Filename); + m_Fd = 0; + } + if (m_ReadCache) + free(m_ReadCache); +} + +bool cVideoBufferFile::Init() +{ + m_ReadCache = 0; + m_ReadCacheMaxSize = 32000; + + m_ReadCache = (uint8_t*)malloc(m_ReadCacheMaxSize); + if (!m_ReadCache) + return false; + + m_BufferSize = (off_t)TimeshiftBufferFileSize*1000*1000*1000; + + struct stat sb; + if ((*TimeshiftBufferDir) && stat(TimeshiftBufferDir, &sb) == 0 && S_ISDIR(sb.st_mode)) + { + if (TimeshiftBufferDir[strlen(TimeshiftBufferDir)-1] == '/') + m_Filename = cString::sprintf("%sTimeshift-%d.vnsi", TimeshiftBufferDir, m_ClientID); + else + m_Filename = cString::sprintf("%s/Timeshift-%d.vnsi", TimeshiftBufferDir, m_ClientID); + } + else +#if VDRVERSNUM >= 20102 + m_Filename = cString::sprintf("%s/Timeshift-%d.vnsi", cVideoDirectory::Name(), m_ClientID); +#else + m_Filename = cString::sprintf("%s/Timeshift-%d.vnsi", VideoDirectory, m_ClientID); +#endif + + m_Fd = open(m_Filename, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU); + if (m_Fd == -1) + { + ERRORLOG("Could not open file: %s", (const char*)m_Filename); + return false; + } + m_WritePtr = lseek(m_Fd, m_BufferSize - 1, SEEK_SET); + if (m_WritePtr == -1) + { + ERRORLOG("(Init) Could not seek file: %s", (const char*)m_Filename); + return false; + } + char tmp = '0'; + if (safe_write(m_Fd, &tmp, 1) < 0) + { + ERRORLOG("(Init) Could not write to file: %s", (const char*)m_Filename); + return false; + } + + m_WritePtr = 0; + m_ReadPtr = 0; + m_ReadCacheSize = 0; + return true; +} + +void cVideoBufferFile::SetPos(off_t pos) +{ + cMutexLock lock(&m_Mutex); + + m_ReadPtr = pos; + if (m_ReadPtr >= m_BufferSize) + m_ReadPtr -= m_BufferSize; + m_BytesConsumed = 0; + m_ReadCacheSize = 0; +} + +off_t cVideoBufferFile::GetPosMax() +{ + off_t posMax = cVideoBufferTimeshift::GetPosMax(); + if (posMax >= m_ReadCacheMaxSize) + posMax -= m_ReadCacheMaxSize; + else + posMax = 0; + return posMax; +} + +void cVideoBufferFile::Put(uint8_t *buf, unsigned int size) +{ + if (Available() + MARGIN >= m_BufferSize) + { + return; + } + + if ((m_BufferSize - m_WritePtr) <= size) + { + int bytes = m_BufferSize - m_WritePtr; + + int p = 0; + off_t ptr = m_WritePtr; + while(bytes > 0) + { + p = pwrite(m_Fd, buf, bytes, ptr); + if (p < 0) + { + ERRORLOG("Could not write to file: %s", (const char*)m_Filename); + return; + } + size -= p; + bytes -= p; + buf += p; + ptr += p; + } + cMutexLock lock(&m_Mutex); + m_WritePtr = 0; + } + + off_t ptr = m_WritePtr; + int bytes = size; + int p; + while(bytes > 0) + { + p = pwrite(m_Fd, buf, bytes, ptr); + if (p < 0) + { + ERRORLOG("Could not write to file: %s", (const char*)m_Filename); + return; + } + bytes -= p; + buf += p; + ptr += p; + } + + cMutexLock lock(&m_Mutex); + + m_WritePtr += size; + if (!m_BufferFull) + { + if ((m_WritePtr + 2*MARGIN) > m_BufferSize) + { + m_BufferFull = true; + time(&m_bufferWrapTime); + } + } + + time(&m_bufferEndTime); +} + +int cVideoBufferFile::ReadBytes(uint8_t *buf, off_t pos, unsigned int size) +{ + int p; + for (;;) + { + p = pread(m_Fd, buf, size, pos); + if (p < 0 && errno == EINTR) + { + continue; + } + return p; + } +} + +int cVideoBufferFile::ReadBlock(uint8_t **buf, unsigned int size, time_t &endTime, time_t &wrapTime) +{ + // move read pointer + if (m_BytesConsumed) + { + cMutexLock lock(&m_Mutex); + m_ReadPtr += m_BytesConsumed; + if (m_ReadPtr >= m_BufferSize) + m_ReadPtr -= m_BufferSize; + m_ReadCachePtr += m_BytesConsumed; + + endTime = m_bufferEndTime; + wrapTime = m_bufferWrapTime; + } + m_BytesConsumed = 0; + + // check if we have anything to read + off_t readBytes; + if (m_ReadCacheSize && ((m_ReadCachePtr + m_Margin) <= m_ReadCacheSize)) + { + readBytes = m_ReadCacheSize - m_ReadCachePtr; + *buf = m_ReadCache + m_ReadCachePtr; + } + else if ((readBytes = Available()) >= m_ReadCacheMaxSize) + { + if (m_ReadPtr + m_ReadCacheMaxSize <= m_BufferSize) + { + m_ReadCacheSize = ReadBytes(m_ReadCache, m_ReadPtr, m_ReadCacheMaxSize); + if (m_ReadCacheSize < 0) + { + ERRORLOG("Could not read file: %s", (const char*)m_Filename); + return 0; + } + if (m_ReadCacheSize < m_Margin) + { + ERRORLOG("Could not read file (margin): %s , read: %d", (const char*)m_Filename, m_ReadCacheSize); + m_ReadCacheSize = 0; + return 0; + } + readBytes = m_ReadCacheSize; + *buf = m_ReadCache; + m_ReadCachePtr = 0; + } + else + { + m_ReadCacheSize = ReadBytes(m_ReadCache, m_ReadPtr, m_BufferSize - m_ReadPtr); + if ((m_ReadCacheSize < m_Margin) && (m_ReadCacheSize != (m_BufferSize - m_ReadPtr))) + { + ERRORLOG("Could not read file (end): %s", (const char*)m_Filename); + m_ReadCacheSize = 0; + return 0; + } + readBytes = ReadBytes(m_ReadCache + m_ReadCacheSize, 0, m_ReadCacheMaxSize - m_ReadCacheSize); + if (readBytes < 0) + { + ERRORLOG("Could not read file (end): %s", (const char*)m_Filename); + m_ReadCacheSize = 0; + return 0; + } + m_ReadCacheSize += readBytes; + if (m_ReadCacheSize < m_Margin) + { + ERRORLOG("Could not read file (margin): %s", (const char*)m_Filename); + m_ReadCacheSize = 0; + return 0; + } + readBytes = m_ReadCacheSize; + *buf = m_ReadCache; + m_ReadCachePtr = 0; + } + } + else + return 0; + + // Make sure we are looking at a TS packet + while (readBytes > TS_SIZE) + { + if ((*buf)[0] == TS_SYNC_BYTE && (*buf)[TS_SIZE] == TS_SYNC_BYTE) + break; + m_BytesConsumed++; + (*buf)++; + readBytes--; + } + + if ((*buf)[0] != TS_SYNC_BYTE) + { + return 0; + } + + m_BytesConsumed += TS_SIZE; + return TS_SIZE; +} + +//----------------------------------------------------------------------------- + +class cVideoBufferRecording : public cVideoBufferFile +{ +friend class cVideoBuffer; +public: + virtual off_t GetPosMax(); + virtual void Put(uint8_t *buf, unsigned int size); + virtual int ReadBlock(uint8_t **buf, unsigned int size, time_t &endTime, time_t &wrapTime); + virtual time_t GetRefTime(); + +protected: + cVideoBufferRecording(cRecording *rec); + virtual ~cVideoBufferRecording(); + virtual bool Init(); + virtual off_t Available(); + off_t GetPosEnd(); + cRecPlayer *m_RecPlayer; + cRecording *m_Recording; + cTimeMs m_ScanTimer; +}; + +cVideoBufferRecording::cVideoBufferRecording(cRecording *rec) +{ + m_Recording = rec; + m_ReadCacheSize = 0; + m_ReadCache = 0; +} + +cVideoBufferRecording::~cVideoBufferRecording() +{ + INFOLOG("delete cVideoBufferRecording"); + if (m_RecPlayer) + delete m_RecPlayer; +} + +off_t cVideoBufferRecording::GetPosMax() +{ + m_RecPlayer->reScan(); + m_WritePtr = m_RecPlayer->getLengthBytes(); + return cVideoBufferFile::GetPosMax(); +} + +void cVideoBufferRecording::Put(uint8_t *buf, unsigned int size) +{ + +} + +bool cVideoBufferRecording::Init() +{ + m_ReadCacheMaxSize = 32000; + + m_ReadCache = (uint8_t*)malloc(m_ReadCacheMaxSize); + if (!m_ReadCache) + return false; + + m_RecPlayer = new cRecPlayer(m_Recording, true); + if (!m_RecPlayer) + return false; + + m_WritePtr = 0; + m_ReadPtr = 0; + m_ReadCacheSize = 0; + m_InputAttached = false; + m_ScanTimer.Set(0); + + return true; +} + +time_t cVideoBufferRecording::GetRefTime() +{ + return m_Recording->Start(); +} + +off_t cVideoBufferRecording::Available() +{ + if (m_ScanTimer.TimedOut()) + { + m_RecPlayer->reScan(); + m_ScanTimer.Set(1000); + } + m_BufferSize = m_WritePtr = m_RecPlayer->getLengthBytes(); + return cVideoBufferTimeshift::Available(); +} + +int cVideoBufferRecording::ReadBlock(uint8_t **buf, unsigned int size, time_t &endTime, time_t &wrapTime) +{ + // move read pointer + if (m_BytesConsumed) + { + m_ReadPtr += m_BytesConsumed; + if (m_ReadPtr >= m_BufferSize) + { + m_ReadPtr -= m_BufferSize; + ERRORLOG("cVideoBufferRecording::ReadBlock - unknown error"); + } + m_ReadCachePtr += m_BytesConsumed; + } + m_BytesConsumed = 0; + + // check if we have anything to read + off_t readBytes; + if (m_ReadCacheSize && ((m_ReadCachePtr + m_Margin) <= m_ReadCacheSize)) + { + readBytes = m_ReadCacheSize - m_ReadCachePtr; + *buf = m_ReadCache + m_ReadCachePtr; + } + else if ((readBytes = Available()) >= m_ReadCacheMaxSize) + { + if (m_ReadPtr + m_ReadCacheMaxSize <= m_BufferSize) + { + m_ReadCacheSize = m_RecPlayer->getBlock(m_ReadCache, m_ReadPtr, m_ReadCacheMaxSize); + if (m_ReadCacheSize < 0) + { + ERRORLOG("Could not read file, size: %d", m_ReadCacheSize); + m_ReadCacheSize = 0; + return 0; + } + readBytes = m_ReadCacheSize; + *buf = m_ReadCache; + m_ReadCachePtr = 0; + } + else + { + ERRORLOG("cVideoBufferRecording::ReadBlock - unknown error"); + return 0; + } + } + else + return 0; + + // Make sure we are looking at a TS packet + while (readBytes > TS_SIZE) + { + if ((*buf)[0] == TS_SYNC_BYTE && (*buf)[TS_SIZE] == TS_SYNC_BYTE) + break; + m_BytesConsumed++; + (*buf)++; + readBytes--; + } + + if ((*buf)[0] != TS_SYNC_BYTE) + { + return 0; + } + + m_BytesConsumed += TS_SIZE; + time(&endTime); + wrapTime = 0; + return TS_SIZE; +} + +//----------------------------------------------------------------------------- + +class cVideoBufferTest : public cVideoBufferFile +{ +friend class cVideoBuffer; +public: + virtual off_t GetPosMax(); + virtual void Put(uint8_t *buf, unsigned int size); + +protected: + cVideoBufferTest(cString filename); + virtual ~cVideoBufferTest(); + virtual bool Init(); + virtual off_t Available(); + off_t GetPosEnd(); +}; + +cVideoBufferTest::cVideoBufferTest(cString filename) +{ + m_Filename = filename; + m_Fd = 0; + m_ReadCacheSize = 0; +} + +cVideoBufferTest::~cVideoBufferTest() +{ + if (m_Fd) + { + close(m_Fd); + m_Fd = 0; + } +} + +off_t cVideoBufferTest::GetPosMax() +{ + m_WritePtr = GetPosEnd(); + return cVideoBufferTimeshift::GetPosMax(); +} + +off_t cVideoBufferTest::GetPosEnd() +{ + off_t cur = lseek(m_Fd, 0, SEEK_CUR); + off_t end = lseek(m_Fd, 0, SEEK_END); + lseek(m_Fd, cur, SEEK_SET); + return end; +} + +void cVideoBufferTest::Put(uint8_t *buf, unsigned int size) +{ + +} + +bool cVideoBufferTest::Init() +{ + m_ReadCache = 0; + m_ReadCacheMaxSize = 8000; + + m_ReadCache = (uint8_t*)malloc(m_ReadCacheMaxSize); + if (!m_ReadCache) + return false; + + m_Fd = open(m_Filename, O_RDONLY); + if (m_Fd == -1) + { + ERRORLOG("Could not open file: %s", (const char*)m_Filename); + return false; + } + + m_WritePtr = 0; + m_ReadPtr = 0; + m_ReadCacheSize = 0; + m_InputAttached = false; + return true; +} + +off_t cVideoBufferTest::Available() +{ + m_BufferSize = m_WritePtr = GetPosEnd(); + return cVideoBufferTimeshift::Available(); +} + +//----------------------------------------------------------------------------- + cVideoBuffer::cVideoBuffer() { + m_CheckEof = false; + m_InputAttached = true; + m_bufferEndTime = 0; + m_bufferWrapTime = 0; } cVideoBuffer::~cVideoBuffer() { } -cVideoBuffer* cVideoBuffer::Create() +cVideoBuffer* cVideoBuffer::Create(int clientID, uint8_t timeshift) +{ + // no time shift + if (TimeshiftMode == 0 || timeshift == 0) + { + cVideoBufferSimple *buffer = new cVideoBufferSimple(); + return buffer; + } + // buffer in ram + else if (TimeshiftMode == 1) + { + cVideoBufferRAM *buffer = new cVideoBufferRAM(); + if (!buffer->Init()) + { + delete buffer; + return NULL; + } + else + return buffer; + } + // buffer in file + else if (TimeshiftMode == 2) + { + cVideoBufferFile *buffer = new cVideoBufferFile(clientID); + if (!buffer->Init()) + { + delete buffer; + return NULL; + } + else + return buffer; + } + else + return NULL; +} + +cVideoBuffer* cVideoBuffer::Create(cString filename) +{ + INFOLOG("Open recording: %s", (const char*)filename); + cVideoBufferTest *buffer = new cVideoBufferTest(filename); + if (!buffer->Init()) + { + delete buffer; + return NULL; + } + else + return buffer; +} + +cVideoBuffer* cVideoBuffer::Create(cRecording *rec) +{ + INFOLOG("Open recording: %s", rec->FileName()); + cVideoBufferRecording *buffer = new cVideoBufferRecording(rec); + if (!buffer->Init()) + { + delete buffer; + return NULL; + } + else + return buffer; +} + +int cVideoBuffer::Read(uint8_t **buf, unsigned int size, time_t &endTime, time_t &wrapTime) +{ + int count = ReadBlock(buf, size, endTime, wrapTime); + + // check for end of file + if (!m_InputAttached && count != TS_SIZE) + { + if (m_CheckEof && m_Timer.TimedOut()) + { + INFOLOG("Recoding - end of file"); + return -2; + } + else if (!m_CheckEof) + { + m_CheckEof = true; + m_Timer.Set(3000); + } + } + else + m_CheckEof = false; + + return count; +} + +void cVideoBuffer::AttachInput(bool attach) +{ + m_InputAttached = attach; +} + +time_t cVideoBuffer::GetRefTime() { - cVideoBuffer *buffer = new cVideoBufferSimple(); - return buffer; + time_t t; + time(&t); + return t; } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/videobuffer.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/videobuffer.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/videobuffer.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/videobuffer.h 2014-05-04 07:03:11.000000000 +0000 @@ -21,14 +21,35 @@ #pragma once #include +#include +#include + +class cRecording; class cVideoBuffer { public: virtual ~cVideoBuffer(); - static cVideoBuffer* Create(); - virtual void Put(uint8_t *buf, int size) = 0; - virtual int Read(uint8_t **buf, int size) = 0; + static cVideoBuffer* Create(int clientID, uint8_t timeshift); + static cVideoBuffer* Create(cString filename); + static cVideoBuffer* Create(cRecording *rec); + virtual void Put(uint8_t *buf, unsigned int size) = 0; + virtual int ReadBlock(uint8_t **buf, unsigned int size, time_t &endTime, time_t &wrapTime) = 0; + virtual off_t GetPosMin() { return 0; }; + virtual off_t GetPosMax() { return 0; }; + virtual off_t GetPosCur() { return 0; }; + virtual void GetPositions(off_t *cur, off_t *min, off_t *max) {}; + virtual void SetPos(off_t pos) {}; + virtual void SetCache(bool on) {}; + virtual bool HasBuffer() { return false; }; + virtual time_t GetRefTime(); + int Read(uint8_t **buf, unsigned int size, time_t &endTime, time_t &wrapTime); + void AttachInput(bool attach); protected: cVideoBuffer(); + cTimeMs m_Timer; + bool m_CheckEof; + bool m_InputAttached; + time_t m_bufferEndTime; + time_t m_bufferWrapTime; }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/videoinput.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/videoinput.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/videoinput.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/videoinput.c 2014-05-04 07:03:11.000000000 +0000 @@ -68,6 +68,10 @@ inline void cLiveReceiver::Activate(bool On) { DEBUGLOG("activate live receiver: %d", On); + if (!On) + { + m_VideoInput->Retune(); + } } // --- cLivePatFilter ---------------------------------------------------- @@ -386,7 +390,8 @@ // ---------------------------------------------------------------------------- -cVideoInput::cVideoInput() +cVideoInput::cVideoInput(cCondVar &condVar, cMutex &mutex, bool &retune) : + m_Event(condVar), m_Mutex(mutex), m_IsRetune(retune) { m_Device = NULL;; m_PatFilter = NULL; @@ -407,7 +412,7 @@ m_VideoBuffer = videoBuffer; m_Channel = channel; m_Priority = priority; - m_Device = cDevice::GetDevice(m_Channel, m_Priority, true); + m_Device = cDevice::GetDevice(m_Channel, m_Priority, false); if (m_Device != NULL) { @@ -422,6 +427,7 @@ m_Receiver = new cLiveReceiver(this, m_Channel, m_Priority); m_Device->AttachReceiver(m_Receiver0); m_Device->AttachFilter(m_PatFilter); + m_VideoBuffer->AttachInput(true); Start(); return true; } @@ -483,6 +489,19 @@ DELETENULL(m_PatFilter); } } + m_Channel = NULL; + if (m_VideoBuffer) + { + m_VideoBuffer->AttachInput(false); + } +} + +bool cVideoInput::IsOpen() +{ + if (m_Channel) + return true; + else + return false; } cChannel *cVideoInput::PmtChannel() @@ -520,6 +539,13 @@ m_VideoBuffer->Put(data, length); } +void cVideoInput::Retune() +{ + cMutexLock lock(&m_Mutex); + m_IsRetune = true; + m_Event.Broadcast(); +} + void cVideoInput::Action() { cTimeMs starttime; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/videoinput.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/videoinput.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/videoinput.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/videoinput.h 2014-05-04 07:03:11.000000000 +0000 @@ -33,16 +33,18 @@ friend class cLivePatFilter; friend class cLiveReceiver; public: - cVideoInput(); + cVideoInput(cCondVar &condVar, cMutex &mutex, bool &retune); virtual ~cVideoInput(); bool Open(const cChannel *channel, int priority, cVideoBuffer *videoBuffer); void Close(); + bool IsOpen(); protected: virtual void Action(void); void PmtChange(int pidChange); cChannel *PmtChannel(); void Receive(uchar *data, int length); + void Retune(); cDevice *m_Device; cLivePatFilter *m_PatFilter; cLiveReceiver *m_Receiver; @@ -52,4 +54,7 @@ int m_Priority; bool m_PmtChange; bool m_SeenPmt; + cCondVar &m_Event; + cMutex &m_Mutex; + bool &m_IsRetune; }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsi.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsi.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsi.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsi.c 2014-05-04 07:03:11.000000000 +0000 @@ -26,11 +26,15 @@ #include #include #include "vnsi.h" +#include "vnsicommand.h" #include "setup.h" +cPluginVNSIServer* cPluginVNSIServer::VNSIServer = NULL; + cPluginVNSIServer::cPluginVNSIServer(void) { Server = NULL; + VNSIServer = NULL; } cPluginVNSIServer::~cPluginVNSIServer() @@ -67,6 +71,8 @@ { // Initialize any background activities the plugin shall perform. VNSIServerConfig.ConfigDirectory = ConfigDirectory(PLUGIN_NAME_I18N); + + VNSIServer = this; return true; } @@ -117,6 +123,14 @@ // Parse your own setup parameters and store their values. if (!strcasecmp(Name, CONFNAME_PMTTIMEOUT)) PmtTimeout = atoi(Value); + else if (!strcasecmp(Name, CONFNAME_TIMESHIFT)) + TimeshiftMode = atoi(Value); + else if (!strcasecmp(Name, CONFNAME_TIMESHIFTBUFFERSIZE)) + TimeshiftBufferSize = atoi(Value); + else if (!strcasecmp(Name, CONFNAME_TIMESHIFTBUFFERFILESIZE)) + TimeshiftBufferFileSize = atoi(Value); + else if (!strcasecmp(Name, CONFNAME_TIMESHIFTBUFFERDIR)) + strn0cpy(TimeshiftBufferDir, Value, sizeof(TimeshiftBufferDir)); else return false; return true; @@ -140,4 +154,16 @@ return NULL; } +void cPluginVNSIServer::StoreSetup(const char *Name, int Value) +{ + if (VNSIServer) + { + if (VNSIServer->SetupParse(Name, itoa(Value))) + { + VNSIServer->SetupStore(Name, Value); + Setup.Save(); + } + } +} + VDRPLUGINCREATOR(cPluginVNSIServer); // Don't touch this! diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsiclient.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsiclient.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsiclient.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsiclient.c 2014-05-04 07:03:11.000000000 +0000 @@ -35,6 +35,7 @@ #include #include +#include "vnsi.h" #include "config.h" #include "vnsicommand.h" #include "recordingscache.h" @@ -46,24 +47,11 @@ #include "requestpacket.h" #include "responsepacket.h" #include "hash.h" +#include "channelfilter.h" #include "wirbelscanservice.h" /// copied from modified wirbelscan plugin /// must be hold up to date with wirbelscan -static bool IsRadio(const cChannel* channel) -{ - bool isRadio = false; - - // assume channels without VPID & APID are video channels - if (channel->Vpid() == 0 && channel->Apid(0) == 0) - isRadio = false; - // channels without VPID are radio channels (channels with VPID 1 are encrypted radio channels) - else if (channel->Vpid() == 0 || channel->Vpid() == 1) - isRadio = true; - - return isRadio; -} - cMutex cVNSIClient::m_timerLock; cVNSIClient::cVNSIClient(int fd, unsigned int id, const char *ClientAdr) @@ -176,10 +164,10 @@ } } -bool cVNSIClient::StartChannelStreaming(const cChannel *channel, uint32_t timeout) +bool cVNSIClient::StartChannelStreaming(const cChannel *channel, int32_t priority, uint8_t timeshift, uint32_t timeout) { - m_Streamer = new cLiveStreamer(timeout); - m_isStreaming = m_Streamer->StreamChannel(channel, 50, &m_socket, m_resp); + m_Streamer = new cLiveStreamer(m_Id, timeshift, timeout); + m_isStreaming = m_Streamer->StreamChannel(channel, priority, &m_socket, m_resp); return m_isStreaming; } @@ -217,7 +205,7 @@ } } -void cVNSIClient::ChannelChange() +void cVNSIClient::ChannelsChange() { cMutexLock lock(&m_msgLock); @@ -274,15 +262,24 @@ if (!lastEvent) continue; + Channels.Lock(false); + const cChannel *channel = Channels.GetByChannelID(schedule->ChannelID()); + Channels.Unlock(); + + if (!channel) + continue; + + if (!VNSIChannelFilter.PassFilter(*channel)) + continue; + uint32_t channelId = CreateStringHash(schedule->ChannelID().ToString()); it = m_epgUpdate.find(channelId); - if (it == m_epgUpdate.end()) + if (it != m_epgUpdate.end() && it->second >= lastEvent->StartTime()) { continue; } - if (it->second >= lastEvent->StartTime()) - continue; + INFOLOG("Trigger EPG update for channel %s, id: %d", channel->Name(), channelId); cResponsePacket *resp = new cResponsePacket(); if (!resp->initStatus(VNSI_STATUS_EPGCHANGE)) @@ -294,10 +291,6 @@ resp->finalise(); m_socket.write(resp->getPtr(), resp->getLen()); delete resp; - - const cChannel *channel = FindChannelByUID(channelId); - if (channel) - INFOLOG("Trigger EPG update for channel %s", channel->Name()); } } @@ -375,6 +368,15 @@ } } +void cVNSIClient::ChannelChange(const cChannel *Channel) +{ + cMutexLock lock(&m_msgLock); + if (m_isStreaming && m_Streamer) + { + m_Streamer->RetuneChannel(Channel); + } +} + bool cVNSIClient::processRequest(cRequestPacket* req) { cMutexLock lock(&m_msgLock); @@ -411,6 +413,13 @@ result = process_Ping(); break; + case VNSI_GETSETUP: + result = process_GetSetup(); + break; + + case VNSI_STORESETUP: + result = process_StoreSetup(); + break; /** OPCODE 20 - 39: VNSI network functions for live streaming */ case VNSI_CHANNELSTREAM_OPEN: @@ -421,6 +430,9 @@ result = processChannelStream_Close(); break; + case VNSI_CHANNELSTREAM_SEEK: + result = processChannelStream_Seek(); + break; /** OPCODE 40 - 59: VNSI network functions for recording streaming */ case VNSI_RECSTREAM_OPEN: @@ -447,6 +459,10 @@ result = processRecStream_GetIFrame(); break; + case VNSI_RECSTREAM_GETLENGTH: + result = processRecStream_GetLength(); + break; + /** OPCODE 60 - 79: VNSI network functions for channel access */ case VNSI_CHANNELS_GETCOUNT: @@ -469,6 +485,26 @@ result = processCHANNELS_GetGroupMembers(); break; + case VNSI_CHANNELS_GETCAIDS: + result = processCHANNELS_GetCaids(); + break; + + case VNSI_CHANNELS_GETWHITELIST: + result = processCHANNELS_GetWhitelist(); + break; + + case VNSI_CHANNELS_GETBLACKLIST: + result = processCHANNELS_GetBlacklist(); + break; + + case VNSI_CHANNELS_SETWHITELIST: + result = processCHANNELS_SetWhitelist(); + break; + + case VNSI_CHANNELS_SETBLACKLIST: + result = processCHANNELS_SetBlacklist(); + break; + /** OPCODE 80 - 99: VNSI network functions for timer access */ case VNSI_TIMER_GETCOUNT: result = processTIMER_GetCount(); @@ -516,6 +552,9 @@ result = processRECORDINGS_Delete(); break; + case VNSI_RECORDINGS_GETEDL: + result = processRECORDINGS_GetEdl(); + break; /** OPCODE 120 - 139: VNSI network functions for epg access and manipulating */ case VNSI_EPG_GETFORCHANNEL: @@ -622,6 +661,7 @@ bool enabled = m_req->extract_U8(); SetStatusInterface(enabled); + SetPriority(1); m_resp->add_U32(VNSI_RET_OK); m_resp->finalise(); @@ -637,12 +677,61 @@ return true; } +bool cVNSIClient::process_GetSetup() /* OPCODE 8 */ +{ + char* name = m_req->extract_String(); + if (!strcasecmp(name, CONFNAME_PMTTIMEOUT)) + m_resp->add_U32(PmtTimeout); + else if (!strcasecmp(name, CONFNAME_TIMESHIFT)) + m_resp->add_U32(TimeshiftMode); + else if (!strcasecmp(name, CONFNAME_TIMESHIFTBUFFERSIZE)) + m_resp->add_U32(TimeshiftBufferSize); + else if (!strcasecmp(name, CONFNAME_TIMESHIFTBUFFERFILESIZE)) + m_resp->add_U32(TimeshiftBufferFileSize); + + m_resp->finalise(); + m_socket.write(m_resp->getPtr(), m_resp->getLen()); + return true; +} + +bool cVNSIClient::process_StoreSetup() /* OPCODE 9 */ +{ + char* name = m_req->extract_String(); + + if (!strcasecmp(name, CONFNAME_PMTTIMEOUT)) + { + int value = m_req->extract_U32(); + cPluginVNSIServer::StoreSetup(CONFNAME_PMTTIMEOUT, value); + } + else if (!strcasecmp(name, CONFNAME_TIMESHIFT)) + { + int value = m_req->extract_U32(); + cPluginVNSIServer::StoreSetup(CONFNAME_TIMESHIFT, value); + } + else if (!strcasecmp(name, CONFNAME_TIMESHIFTBUFFERSIZE)) + { + int value = m_req->extract_U32(); + cPluginVNSIServer::StoreSetup(CONFNAME_TIMESHIFTBUFFERSIZE, value); + } + else if (!strcasecmp(name, CONFNAME_TIMESHIFTBUFFERFILESIZE)) + { + int value = m_req->extract_U32(); + cPluginVNSIServer::StoreSetup(CONFNAME_TIMESHIFTBUFFERFILESIZE, value); + } + + m_resp->add_U32(VNSI_RET_OK); + m_resp->finalise(); + m_socket.write(m_resp->getPtr(), m_resp->getLen()); + return true; +} /** OPCODE 20 - 39: VNSI network functions for live streaming */ bool cVNSIClient::processChannelStream_Open() /* OPCODE 20 */ { uint32_t uid = m_req->extract_U32(); + int32_t priority = m_req->extract_S32(); + uint8_t timeshift = m_req->extract_U8(); uint32_t timeout = m_req->extract_U32(); if(timeout == 0) @@ -668,7 +757,7 @@ } else { - if (StartChannelStreaming(channel, timeout)) + if (StartChannelStreaming(channel, priority, timeshift, timeout)) { INFOLOG("Started streaming of channel %s (timeout %i seconds)", channel->Name(), timeout); // return here without sending the response @@ -694,6 +783,25 @@ return true; } +bool cVNSIClient::processChannelStream_Seek() /* OPCODE 22 */ +{ + uint32_t serial = 0; + if (m_isStreaming && m_Streamer) + { + int64_t time = m_req->extract_S64(); + if (m_Streamer->SeekTime(time, serial)) + m_resp->add_U32(VNSI_RET_OK); + else + m_resp->add_U32(VNSI_RET_ERROR); + } + else + m_resp->add_U32(VNSI_RET_ERROR); + + m_resp->add_U32(serial); + m_resp->finalise(); + m_socket.write(m_resp->getPtr(), m_resp->getLen()); + return true; +} /** OPCODE 40 - 59: VNSI network functions for recording streaming */ @@ -840,6 +948,23 @@ return true; } +bool cVNSIClient::processRecStream_GetLength() /* OPCODE 46 */ +{ + uint64_t length = 0; + + if (m_RecPlayer) + { + m_RecPlayer->reScan(); + length = m_RecPlayer->getLengthBytes(); + } + + m_resp->add_U64(length); + + m_resp->finalise(); + m_socket.write(m_resp->getPtr(), m_resp->getLen()); + + return true; +} /** OPCODE 60 - 79: VNSI network functions for channel access */ @@ -858,31 +983,42 @@ bool cVNSIClient::processCHANNELS_GetChannels() /* OPCODE 63 */ { - if (m_req->getDataLength() != 4) return false; + if (m_req->getDataLength() != 5) return false; bool radio = m_req->extract_U32(); + bool filter = m_req->extract_U8(); Channels.Lock(false); + cString caids; + int caid; + int caid_idx; for (cChannel *channel = Channels.First(); channel; channel = Channels.Next(channel)) { - if (radio != IsRadio(channel)) + if (radio != cVNSIChannelFilter::IsRadio(channel)) continue; // skip invalid channels if (channel->Sid() == 0) continue; + // check filter + if (filter && !VNSIChannelFilter.PassFilter(*channel)) + continue; + m_resp->add_U32(channel->Number()); m_resp->add_String(m_toUTF8.Convert(channel->Name())); + m_resp->add_String(m_toUTF8.Convert(channel->Provider())); m_resp->add_U32(CreateChannelUID(channel)); - m_resp->add_U32(0); // groupindex unused - m_resp->add_U32(channel->Ca()); -#if APIVERSNUM >= 10701 - m_resp->add_U32(channel->Vtype()); -#else - m_resp->add_U32(2); -#endif + m_resp->add_U32(channel->Ca(0)); + caid_idx = 0; + caids = "caids:"; + while((caid = channel->Ca(caid_idx)) != 0) + { + caids = cString::sprintf("%s%d;", (const char*)caids, caid); + caid_idx++; + } + m_resp->add_String((const char*)caids); } Channels.Unlock(); @@ -945,6 +1081,7 @@ { char* groupname = m_req->extract_String(); uint32_t radio = m_req->extract_U8(); + bool filter = m_req->extract_U8(); int index = 0; // unknown group @@ -978,7 +1115,11 @@ if(name.empty()) continue; - if(IsRadio(channel) != radio) + if(cVNSIChannelFilter::IsRadio(channel) != radio) + continue; + + // check filter + if (filter && !VNSIChannelFilter.PassFilter(*channel)) continue; if(name == groupname) @@ -996,13 +1137,142 @@ return true; } +bool cVNSIClient::processCHANNELS_GetCaids() +{ + uint32_t uid = m_req->extract_U32(); + + Channels.Lock(false); + const cChannel *channel = NULL; + channel = FindChannelByUID(uid); + Channels.Unlock(); + + if (channel != NULL) + { + int caid; + int idx = 0; + while((caid = channel->Ca(idx)) != 0) + { + m_resp->add_U32(caid); + idx++; + } + } + + m_resp->finalise(); + m_socket.write(m_resp->getPtr(), m_resp->getLen()); + + return true; +} + +bool cVNSIClient::processCHANNELS_GetWhitelist() +{ + bool radio = m_req->extract_U8(); + std::vector *providers; + + if(radio) + providers = &VNSIChannelFilter.m_providersRadio; + else + providers = &VNSIChannelFilter.m_providersVideo; + + VNSIChannelFilter.m_Mutex.Lock(); + for(unsigned int i=0; isize(); i++) + { + m_resp->add_String((*providers)[i].m_name.c_str()); + m_resp->add_U32((*providers)[i].m_caid); + } + VNSIChannelFilter.m_Mutex.Unlock(); + + m_resp->finalise(); + m_socket.write(m_resp->getPtr(), m_resp->getLen()); + return true; +} + +bool cVNSIClient::processCHANNELS_GetBlacklist() +{ + bool radio = m_req->extract_U8(); + std::vector *channels; + + if(radio) + channels = &VNSIChannelFilter.m_channelsRadio; + else + channels = &VNSIChannelFilter.m_channelsVideo; + + VNSIChannelFilter.m_Mutex.Lock(); + for(unsigned int i=0; isize(); i++) + { + m_resp->add_U32((*channels)[i]); + } + VNSIChannelFilter.m_Mutex.Unlock(); + + m_resp->finalise(); + m_socket.write(m_resp->getPtr(), m_resp->getLen()); + return true; +} + +bool cVNSIClient::processCHANNELS_SetWhitelist() +{ + bool radio = m_req->extract_U8(); + cVNSIProvider provider; + std::vector *providers; + + if(radio) + providers = &VNSIChannelFilter.m_providersRadio; + else + providers = &VNSIChannelFilter.m_providersVideo; + + VNSIChannelFilter.m_Mutex.Lock(); + providers->clear(); + + while(!m_req->end()) + { + char *str = m_req->extract_String(); + provider.m_name = str; + provider.m_caid = m_req->extract_U32(); + delete [] str; + providers->push_back(provider); + } + VNSIChannelFilter.StoreWhitelist(radio); + VNSIChannelFilter.m_Mutex.Unlock(); + + m_resp->finalise(); + m_socket.write(m_resp->getPtr(), m_resp->getLen()); + return true; +} + +bool cVNSIClient::processCHANNELS_SetBlacklist() +{ + bool radio = m_req->extract_U8(); + cVNSIProvider provider; + std::vector *channels; + + if(radio) + channels = &VNSIChannelFilter.m_channelsRadio; + else + channels = &VNSIChannelFilter.m_channelsVideo; + + VNSIChannelFilter.m_Mutex.Lock(); + channels->clear(); + + int id; + while(!m_req->end()) + { + id = m_req->extract_U32(); + channels->push_back(id); + } + VNSIChannelFilter.StoreBlacklist(radio); + VNSIChannelFilter.m_Mutex.Unlock(); + + m_resp->finalise(); + m_socket.write(m_resp->getPtr(), m_resp->getLen()); + return true; +} + void cVNSIClient::CreateChannelGroups(bool automatic) { std::string groupname; for (cChannel *channel = Channels.First(); channel; channel = Channels.Next(channel)) { - bool isRadio = IsRadio(channel); + bool isRadio = cVNSIChannelFilter::IsRadio(channel); if(automatic && !channel->GroupSep()) groupname = channel->Provider(); @@ -1324,7 +1594,11 @@ bool cVNSIClient::processRECORDINGS_GetDiskSpace() /* OPCODE 100 */ { int FreeMB; +#if VDRVERSNUM >= 20102 + int Percent = cVideoDirectory::VideoDiskSpace(&FreeMB); +#else int Percent = VideoDiskSpace(&FreeMB); +#endif int Total = (FreeMB / (100 - Percent)) * 100; m_resp->add_U32(Total); @@ -1349,6 +1623,7 @@ bool cVNSIClient::processRECORDINGS_GetList() /* OPCODE 102 */ { cMutexLock lock(&m_timerLock); + cThreadLock RecordingsLock(&Recordings); for (cRecording *recording = Recordings.First(); recording; recording = Recordings.Next(recording)) { @@ -1477,7 +1752,7 @@ // replace spaces in newtitle strreplace(newtitle, ' ', '_'); - char* filename_new = new char[512]; + char* filename_new = new char[1024]; strncpy(filename_new, filename_old, 512); sep = strrchr(filename_new, '/'); if(sep != NULL) { @@ -1544,6 +1819,37 @@ m_resp->finalise(); m_socket.write(m_resp->getPtr(), m_resp->getLen()); + return true; +} + +bool cVNSIClient::processRECORDINGS_GetEdl() /* OPCODE 105 */ +{ + cString recName; + cRecording* recording = NULL; + + uint32_t uid = m_req->extract_U32(); + recording = cRecordingsCache::GetInstance().Lookup(uid); + + if (recording) + { + cMarks marks; + if(marks.Load(recording->FileName(), recording->FramesPerSecond(), recording->IsPesRecording())) + { +#if VDRVERSNUM >= 10732 + cMark* mark = NULL; + double fps = recording->FramesPerSecond(); + while((mark = marks.GetNextBegin(mark)) != NULL) + { + m_resp->add_U64(mark->Position() *1000 / fps); + m_resp->add_U64(mark->Position() *1000 / fps); + m_resp->add_S32(2); + } +#endif + } + } + m_resp->finalise(); + m_socket.write(m_resp->getPtr(), m_resp->getLen()); + return true; } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsiclient.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsiclient.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsiclient.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsiclient.h 2014-05-04 07:03:11.000000000 +0000 @@ -77,13 +77,14 @@ virtual void TimerChange(const cTimer *Timer, eTimerChange Change); virtual void Recording(const cDevice *Device, const char *Name, const char *FileName, bool On); virtual void OsdStatusMessage(const char *Message); + virtual void ChannelChange(const cChannel *Channel); public: cVNSIClient(int fd, unsigned int id, const char *ClientAdr); virtual ~cVNSIClient(); - void ChannelChange(); + void ChannelsChange(); void RecordingsChange(); void TimerChange(); void EpgChange(); @@ -94,7 +95,7 @@ void SetLoggedIn(bool yesNo) { m_loggedIn = yesNo; } void SetStatusInterface(bool yesNo) { m_StatusInterfaceEnabled = yesNo; } - bool StartChannelStreaming(const cChannel *channel, uint32_t timeout); + bool StartChannelStreaming(const cChannel *channel, int32_t priority, uint8_t timeshift, uint32_t timeout); void StopChannelStreaming(); private: @@ -111,9 +112,12 @@ bool process_GetTime(); bool process_EnableStatusInterface(); bool process_Ping(); + bool process_GetSetup(); + bool process_StoreSetup(); bool processChannelStream_Open(); bool processChannelStream_Close(); + bool processChannelStream_Seek(); bool processRecStream_Open(); bool processRecStream_Close(); @@ -121,12 +125,18 @@ bool processRecStream_PositionFromFrameNumber(); bool processRecStream_FrameNumberFromPosition(); bool processRecStream_GetIFrame(); + bool processRecStream_GetLength(); bool processCHANNELS_GroupsCount(); bool processCHANNELS_ChannelsCount(); bool processCHANNELS_GroupList(); bool processCHANNELS_GetChannels(); bool processCHANNELS_GetGroupMembers(); + bool processCHANNELS_GetCaids(); + bool processCHANNELS_GetWhitelist(); + bool processCHANNELS_GetBlacklist(); + bool processCHANNELS_SetWhitelist(); + bool processCHANNELS_SetBlacklist(); void CreateChannelGroups(bool automatic); @@ -144,6 +154,7 @@ bool processRECORDINGS_Rename(); bool processRECORDINGS_Delete(); bool processRECORDINGS_Move(); + bool processRECORDINGS_GetEdl(); bool processEPG_GetForChannel(); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsicommand.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsicommand.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsicommand.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsicommand.h 2014-05-04 07:03:11.000000000 +0000 @@ -27,7 +27,7 @@ #define VNSI_COMMAND_H /** Current VNSI Protocol Version number */ -#define VNSI_PROTOCOLVERSION 3 +#define VNSI_PROTOCOLVERSION 5 /** Packet types */ #define VNSI_CHANNEL_REQUEST_RESPONSE 1 @@ -40,15 +40,24 @@ /** Response packets operation codes */ +#define CONFNAME_PMTTIMEOUT "PmtTimeout" +#define CONFNAME_TIMESHIFT "Timeshift" +#define CONFNAME_TIMESHIFTBUFFERSIZE "TimeshiftBufferSize" +#define CONFNAME_TIMESHIFTBUFFERFILESIZE "TimeshiftBufferFileSize" +#define CONFNAME_TIMESHIFTBUFFERDIR "TimeshiftBufferDir" + /* OPCODE 1 - 19: VNSI network functions for general purpose */ #define VNSI_LOGIN 1 #define VNSI_GETTIME 2 #define VNSI_ENABLESTATUSINTERFACE 3 #define VNSI_PING 7 +#define VNSI_GETSETUP 8 +#define VNSI_STORESETUP 9 /* OPCODE 20 - 39: VNSI network functions for live streaming */ -#define VNSI_CHANNELSTREAM_OPEN 20 -#define VNSI_CHANNELSTREAM_CLOSE 21 +#define VNSI_CHANNELSTREAM_OPEN 20 +#define VNSI_CHANNELSTREAM_CLOSE 21 +#define VNSI_CHANNELSTREAM_SEEK 22 /* OPCODE 40 - 59: VNSI network functions for recording streaming */ #define VNSI_RECSTREAM_OPEN 40 @@ -57,6 +66,7 @@ #define VNSI_RECSTREAM_POSTOFRAME 43 #define VNSI_RECSTREAM_FRAMETOPOS 44 #define VNSI_RECSTREAM_GETIFRAME 45 +#define VNSI_RECSTREAM_GETLENGTH 46 /* OPCODE 60 - 79: VNSI network functions for channel access */ #define VNSI_CHANNELS_GETCOUNT 61 @@ -64,6 +74,11 @@ #define VNSI_CHANNELGROUP_GETCOUNT 65 #define VNSI_CHANNELGROUP_LIST 66 #define VNSI_CHANNELGROUP_MEMBERS 67 +#define VNSI_CHANNELS_GETCAIDS 68 +#define VNSI_CHANNELS_GETWHITELIST 69 +#define VNSI_CHANNELS_GETBLACKLIST 70 +#define VNSI_CHANNELS_SETWHITELIST 71 +#define VNSI_CHANNELS_SETBLACKLIST 72 /* OPCODE 80 - 99: VNSI network functions for timer access */ #define VNSI_TIMER_GETCOUNT 80 @@ -79,6 +94,7 @@ #define VNSI_RECORDINGS_GETLIST 102 #define VNSI_RECORDINGS_RENAME 103 #define VNSI_RECORDINGS_DELETE 104 +#define VNSI_RECORDINGS_GETEDL 105 /* OPCODE 120 - 139: VNSI network functions for epg access and manipulating */ #define VNSI_EPG_GETFORCHANNEL 120 @@ -102,6 +118,8 @@ #define VNSI_STREAM_MUXPKT 4 #define VNSI_STREAM_SIGNALINFO 5 #define VNSI_STREAM_CONTENTINFO 6 +#define VNSI_STREAM_BUFFERSTATS 7 +#define VNSI_STREAM_REFTIME 8 /** Scan packet types (server -> client) */ #define VNSI_SCANNER_PERCENTAGE 1 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsi.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsi.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsi.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsi.h 2014-05-04 07:03:11.000000000 +0000 @@ -27,14 +27,19 @@ #include #include "vnsiserver.h" -static const char *VERSION = "0.9.1"; +static const char *VERSION = "0.9.4"; static const char *DESCRIPTION = "VDR-Network-Streaming-Interface (VNSI) Server"; extern int PmtTimeout; +extern int TimeshiftMode; +extern int TimeshiftBufferSize; +extern int TimeshiftBufferFileSize; +extern char TimeshiftBufferDir[PATH_MAX]; class cPluginVNSIServer : public cPlugin { private: cVNSIServer *Server; + static cPluginVNSIServer *VNSIServer; public: cPluginVNSIServer(void); @@ -57,5 +62,7 @@ virtual bool Service(const char *Id, void *Data = NULL); virtual const char **SVDRPHelpPages(void); virtual cString SVDRPCommand(const char *Command, const char *Option, int &ReplyCode); + + static void StoreSetup(const char *Name, int Value); }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsiserver.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsiserver.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsiserver.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsiserver.c 2014-05-04 07:03:11.000000000 +0000 @@ -36,12 +36,14 @@ #include #include #include +#include #include -#include +#include "vnsi.h" #include "vnsiserver.h" #include "vnsiclient.h" +#include "channelfilter.h" unsigned int cVNSIServer::m_IdCnt = 0; @@ -71,41 +73,6 @@ { m_ServerPort = listenPort; - if(*VNSIServerConfig.ConfigDirectory) - { - m_AllowedHostsFile = cString::sprintf("%s/" ALLOWED_HOSTS_FILE, *VNSIServerConfig.ConfigDirectory); - } - else - { - ERRORLOG("cVNSIServer: missing ConfigDirectory!"); - m_AllowedHostsFile = cString::sprintf("/video/" ALLOWED_HOSTS_FILE); - } - - m_ServerFD = socket(AF_INET, SOCK_STREAM, 0); - if(m_ServerFD == -1) - return; - - fcntl(m_ServerFD, F_SETFD, fcntl(m_ServerFD, F_GETFD) | FD_CLOEXEC); - - int one = 1; - setsockopt(m_ServerFD, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int)); - - struct sockaddr_in s; - memset(&s, 0, sizeof(s)); - s.sin_family = AF_INET; - s.sin_port = htons(m_ServerPort); - - int x = bind(m_ServerFD, (struct sockaddr *)&s, sizeof(s)); - if (x < 0) - { - close(m_ServerFD); - INFOLOG("Unable to start VNSI Server, port already in use ?"); - m_ServerFD = -1; - return; - } - - listen(m_ServerFD, 10); - Start(); INFOLOG("VNSI Server started"); @@ -115,12 +82,7 @@ cVNSIServer::~cVNSIServer() { - Cancel(-1); - for (ClientList::iterator i = m_clients.begin(); i != m_clients.end(); i++) - { - delete (*i); - } - m_clients.erase(m_clients.begin(), m_clients.end()); + m_Status.Shutdown(); Cancel(); INFOLOG("VNSI Server stopped"); } @@ -156,6 +118,7 @@ int val = 1; setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val)); +#ifdef SOL_TCP val = 30; setsockopt(fd, SOL_TCP, TCP_KEEPIDLE, &val, sizeof(val)); @@ -167,10 +130,11 @@ val = 1; setsockopt(fd, SOL_TCP, TCP_NODELAY, &val, sizeof(val)); +#endif INFOLOG("Client with ID %d connected: %s", m_IdCnt, cxSocket::ip2txt(sin.sin_addr.s_addr, sin.sin_port, buf)); cVNSIClient *connection = new cVNSIClient(fd, m_IdCnt, cxSocket::ip2txt(sin.sin_addr.s_addr, sin.sin_port, buf)); - m_clients.push_back(connection); + m_Status.AddClient(connection); m_IdCnt++; } @@ -179,16 +143,44 @@ fd_set fds; struct timeval tv; - // get initial state of the recordings - int recState = -1; - Recordings.StateChanged(recState); - - // get initial state of the timers - int timerState = -1; - Timers.Modified(timerState); + if(*VNSIServerConfig.ConfigDirectory) + { + m_AllowedHostsFile = cString::sprintf("%s/" ALLOWED_HOSTS_FILE, *VNSIServerConfig.ConfigDirectory); + } + else + { + ERRORLOG("cVNSIServer: missing ConfigDirectory!"); + m_AllowedHostsFile = cString::sprintf("/video/" ALLOWED_HOSTS_FILE); + } + + VNSIChannelFilter.Load(); + VNSIChannelFilter.SortChannels(); + m_Status.Start(); + + m_ServerFD = socket(AF_INET, SOCK_STREAM, 0); + if(m_ServerFD == -1) + return; + + fcntl(m_ServerFD, F_SETFD, fcntl(m_ServerFD, F_GETFD) | FD_CLOEXEC); + + int one = 1; + setsockopt(m_ServerFD, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int)); - // last update of epg - time_t epgUpdate = cSchedules::Modified(); + struct sockaddr_in s; + memset(&s, 0, sizeof(s)); + s.sin_family = AF_INET; + s.sin_port = htons(m_ServerPort); + + int x = bind(m_ServerFD, (struct sockaddr *)&s, sizeof(s)); + if (x < 0) + { + close(m_ServerFD); + INFOLOG("Unable to start VNSI Server, port already in use ?"); + m_ServerFD = -1; + return; + } + + listen(m_ServerFD, 10); while (Running()) { @@ -206,67 +198,6 @@ } if (r == 0) { - // remove disconnected clients - for (ClientList::iterator i = m_clients.begin(); i != m_clients.end();) - { - if (!(*i)->Active()) - { - INFOLOG("Client with ID %u seems to be disconnected, removing from client list", (*i)->GetID()); - delete (*i); - i = m_clients.erase(i); - } - else { - i++; - } - } - - // trigger clients to reload the modified channel list - if(m_clients.size() > 0) - { - Channels.Lock(false); - if(Channels.Modified() != 0) - { - INFOLOG("Requesting clients to reload channel list"); - for (ClientList::iterator i = m_clients.begin(); i != m_clients.end(); i++) - (*i)->ChannelChange(); - } - Channels.Unlock(); - } - - // reset inactivity timeout as long as there are clients connected - if(m_clients.size() > 0) { - ShutdownHandler.SetUserInactiveTimeout(); - } - - // update recordings - if(Recordings.StateChanged(recState)) - { - INFOLOG("Recordings state changed (%i)", recState); - INFOLOG("Requesting clients to reload recordings list"); - for (ClientList::iterator i = m_clients.begin(); i != m_clients.end(); i++) - (*i)->RecordingsChange(); - } - - // update timers - if(Timers.Modified(timerState)) - { - INFOLOG("Timers state changed (%i)", timerState); - INFOLOG("Requesting clients to reload timers"); - for (ClientList::iterator i = m_clients.begin(); i != m_clients.end(); i++) - { - (*i)->TimerChange(); - } - } - - // update epg - if((cSchedules::Modified() > epgUpdate + 10) || time(NULL) > epgUpdate + 300) - { - for (ClientList::iterator i = m_clients.begin(); i != m_clients.end(); i++) - { - (*i)->EpgChange(); - } - epgUpdate = cSchedules::Modified(); - } continue; } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsiserver.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsiserver.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsiserver.h 2012-11-15 21:18:19.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsiserver.h 2014-05-04 07:03:11.000000000 +0000 @@ -26,10 +26,10 @@ #ifndef VNSI_SERVER_H #define VNSI_SERVER_H -#include #include #include "config.h" +#include "status.h" class cVNSIClient; @@ -37,15 +37,13 @@ { protected: - typedef std::list ClientList; - virtual void Action(void); void NewClientConnected(int fd); int m_ServerPort; int m_ServerFD; cString m_AllowedHostsFile; - ClientList m_clients; + cVNSIStatus m_Status; static unsigned int m_IdCnt; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/addon.xml.in xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/addon.xml.in --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/addon.xml.in 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/addon.xml.in 2014-05-04 06:40:43.000000000 +0000 @@ -1,41 +1,51 @@ - + XBMC se voorprogram vir VU+ / Enigma2 gebasseerde 'set-top' bokse XBMC's frontend for VU+ / Enigma2 based settop boxes + XBMC клиент за тунери базирани на VU+ / Enigma2 Rozhraní XBMC pro VU+ / přijímače založené na Enigma2 + Blaen XBMC ar gyfer blychau teledu VU+ / Enigma2 XBMC's frontend til VU+ / Enigma2 baseret på settop bokse - XBMCs Oberfläche für VU+ / Enigma2-basierte Settop-Boxen + XBMC Oberfläche für VU+ / Enigma2-basierte Settop-Boxen Frontend του XBMC για αποκωδικοποιητές (settop box) τύπου VU+ / Enigma2 XBMC's frontend for VU+ / Enigma2 based settop boxes - XBMC frontend para decodificadores equipados con VU+/Enigma2 + XBMC's frontend for VU+ / Enigma2 based settop boxes + Frontend XBMC para decodificadores basados en VU+/Enigma2 XBMC frontend para decodificadores equipados con VU+/Enigma2 + XBMC esi VU+ / Enigma2 põhistele digiboksidele Applicatif XBMC pour les enregistreurs VU+/Enigma2 + Frontal XBMC pour les boîtiers décodeurs basés sur VU+ / Enigma 2 Interface de XBMC para decodificadores equipados con VU+/Enigma2 XBMC's frontend for VU+ / Enigma2 based settop boxes + XBMC sučelje za VU+ / Enigma2 set-top box temeljene uređaje XBMC VU+ és Enigma2 előtér-kiszolgáló settop boxokhoz - Frontend XBMC per VU+ / Enigma2 + Frontend XBMC untuk settop boxes berbasis VU+ / Enigma2 + Frontend con XBMC per i settop box basati su VU+ / Enigma2 VU+ / Enigma2 ベースのセットトップボックス用 XBMC フロントエンド VU+ / Enigma2 베이스 셋탑박스를 위한 XBMC 프론트엔드 XBMC sąsaja(-os) VU + / Enigma2 rinkinių priedų pagrindu + XBMC's galasistēma VU+ / Enigma2 balstītām pierīcēm XBMC's интерфејс за VU+ / Enigma2 базирани звучници + Bahagian hadapan XBMC untuk kotak settop berasaskan VU+/Enigma2 XBMC's frontend voor op VU+ / Enigma2 gebaseerde settopboxen - XBMC's frontend for VU+ / Enigma2 baserte settop bokser + XBMC's frontend for VU+ / Enigma2-baserte set top bokser Interfejs XBMC dla urządzeń typu VU+ / Enigma2 Frontend XBMC para caixas settop baseadas em VU+ / Enigma2 Frontend do XBMC para conversores baseados em VU+/Enigma2 @@ -43,56 +53,88 @@ Фронтэнд XBMC для тюнеров, основанных на VU+ /Enigma2 Rozhranie XBMC pre spoluprácu s prijímačmi VU+ / Enigma2 XBMC-jev vmesnik za sprejemnike VU+ / Enigma2 + Frontend i XBMC'së për Aparate VU+ / Enigma2 XBMC Frontend för VU+/Enigma2 baserade dekodrar - XBMC基于VU+/Enigma2的机顶盒的前端 + VU+ / Enigma2 சார்ந்த செட்டாபு பெட்டிகளுக்கான XBMC முன்தோற்றம் + Накладка VU+ / Enigma2 для XBMC + Giao tiếp XBMC cho VU+ / Enigma2 dựa trên các bộ Settop Box + 基于 VU+/Enigma2 的机顶盒的 XBMC 前端 + 給以VU+ / Enigma2開發的機上盒使用的XBMC前端 VU+ voorprogram; ondersteun stroom van Lewendige TV & Opnames, EPG, Tydhouers. VU+ frontend; supporting streaming of Live TV & Recordings, EPG, Timers. + VU+ клиент. Поддържа стрийминг и записване на телевизия, електронен програмен справочник и броячи. Rozhraní WU+. Podporuje proudové vysílání živého vysílání a nahrávek, poslech kanálů rádia, EPG, a časovače. + Blaen VU+; cynnal ffrydio Teledu Byw, Recordio, Amserlenni, Amseryddion VU+ frontend; understøtter streaming af TV og Optagelser, EPG og Timere. - VU+ -Oberfläche; Unterstützt Streaming von Livefernsehen & Aufnahmen, EPG, Timer. + VU+ -Oberfläche; Unterstützt Live TV & Aufnahmen, EPG und Timer. Frontend για το VU+. Υποστηρίζει ροές Live TV & Εγγραφές, EPG, Χρονοδιακόπτες. VU+ frontend; supporting streaming of Live TV & Recordings, EPG, Timers. - VU+ frontend; soporta TV en vivo, grabaciones, guía de programación (EPG) y temporizadores. + VU+ frontend; supporting streaming of Live TV & Recordings, EPG, Timers. + Frontend VU+; soporta TV en vivo, grabaciones, guía de programación (EPG) y temporizadores. VU+ frontend; soporta TV en vivo, grabaciones, guía de programación (EPG) y temporizadores. + VU+ esi. Toetab telekanalite striimimist ja salvestamist ning elektroonilist saatekava. Applicatif VU+. Supporte la lecture en continu de direct télévision et son enregistrement, guide de programme, minuteurs. - Interface VU+; soporta TV ao vivo, gravacións, guía de programación (EPG) e temporizadores. + Frontal VU+, prenant en charge la lecture en transit des télés en direct & les enregistrements, le GÉP et les minuteries. + Interface VU+; soporta TV ao vivo, gravacións, Guía de programación e temporizadores. VU+ frontend; supporting streaming of Live TV & Recordings, EPG, Timers. + VU+ sučelje; podržava stremanje i snimanje TV programa, elektronski programski vodič (EPG) i vremeski zadano snimanje. VU+ előtér-kiszolgáló. Élő adások és felvételek sugárzásának támogatása EPG-vel és időzítéssel. - Frontend VU+; supporta lo streaming di Live TV, registrazioni, EPG e i timer. + Frontend VU+. Mendukung pengaliran TV dan Rekaman langsung, EPG dan Timer. + Frontend VU+; supporta EPG, i timer e lo streaming della TV dal vivo e delle registrazioni. VU+ フロントエンド。ライブテレビのストリーミングや録画、EPG、タイマーをサポート。 VU+ 프론트엔드; TV 시청 & 녹화, EPG, 타이머 지원 TPB + sąsaja, remti transliacijos Live TV & įrašai, EPG, Laikmačiai. + VU+ galasistēma; atbalsta tiešraides TV & ierakstu straumēšanu, EPG, taimerus. VU+ интерфејс;подржува стриминг на Live TV & Recordings, EPG, Timers. + Bahagian hadapan VU+; menyokong penstirman Langsung & Rakaman, EPG, Pemasa TV VU+ frontend; ondersteunt het streamen van LiveTV & Opnames, EPG, Timers VU+ frontend; støtte for Live TV & Opptak, EPG, Timere. - Interfejs VU+; wspiera strumieniowanie TV na żywo i nagrywania, EPG oraz planowanie nagrań. + Interfejs VU+; wspiera strumieniowanie TV na żywo i nagrań, EPG oraz planowanie nagrań. Frontend VU+ ; suporta transmissão de TV em Directo e Gravações, EPG, Temporizadores. VU+ frontend; suporta streaming de TV Ao Vivo e Gravações, EPG, agendamentos. Interfața VU+; suportă streaming programe TV și înregistrare, program electronic, cronometre - înregistrare programată VU+ фронтэнд; поддерживает потоковое TV, запись, ЕПГ, таймеры. VU+ rozhranie; je podporované streamovanie živého televízneho vysielania a nahrávok, EPG, časovačov. Vmesnik za VU+; podpira pretakanje televizije v živo in posnetkov, EPG, časovnike. + VU+ frontend, përkrahën transmetimin e Live TV's & Regjistrime, EPG, timer. VU+ frontend; stödjer strömning av direktsänd TV & inspelningar, EPG, timers. - VU+前端,支持直播电视播放和录制、电子节目单、定时器 + VU+ முன்நிலை. லைவ் டிவி & பதிவுகளின் ஸ்ட்ரீமிங், EPG கேட்கவும் துணைபுரிகிறது. + Накладка VU+; підтримує потоки Live TV, запис, програму передач, таймери. + Giao tiếp cho VU+; hỗ trợ truyền phát và thu chương trình Live TV, hẹn giờ và hiển thị lịch trình chiếu (EPG) + VU+ 前端,支持直播电视播放和录像、电子节目单、定时器。 + VU+前端;支援的串流媒體包括有:電視直播和節目錄影,電子節目表,定時器。 詳細信息建議歷史 Hierdie is onstabiele sagteware! Die outeurs is op geen manier verantwoordelik vir gefaalde opnames, inkorrekte tydhouers, gemorsde ure, of enige ander ongewensde effekte. This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. + Тази програма е нестабилна! Авторите не носят отговорност за неуспешно записване, некоректни броячи, пропиляно време и други нежелани ефекти. + Això és programari inestable! Els autors no són de cap manera responsables dels enregistraments que han fallat, temporitzadors incorrectes, hores perdudes, o qualssevol altres efectes no desitjats.. Tento software není stabilní. Autoři nejsou žádným způsobem zodpovědní za selhání při nahrávání, neplatné časovače, ztracený čas, či jakékoliv jiné nežádoucí události... + Mae hwn yn feddalwedd ansad! Nid yw'r awduron yn gyfrifol mewn unrhyw ffordd am fethu recordio, amseru gwallus, oriau wedi eu gwastraffu nac effeithiau anymunol eraill. Dette er ustabil software! Ophavsmændene er på ingen måde ansvarlige for mislykkede optagelser, ukorrekte timere, spildte timer, eller andre uønskede konsekvenser.. - Diese Software ist noch in der Entwicklung! Die Autoren sind nicht für fehlgeschlagene Aufnahmen, falsche Timer, verschwendete Zeit oder andere ungewollte Effekte verantwortlich. + Dies ist instabile Software! Die Autoren sind in keiner Weise verantwortlich für fehlgeschlagene Aufnahmen, falsche Timer, verschwendete Zeit oder andere ungewünschte Effekte. Ασταθές πρόγραμμα! Οι δημιουργοί δεν είναι σε καμία περίπτωση υπεύθυνοι για αποτυχημένες εγγραφές, λανθασμένους χρονοδιακόπτες, χαμένες ώρες, ή κάθε είδους ανεπιθύμητα αποτελέσματα.. This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. + This is unstable software! The authors are in no way responsible for failed recordings, incorrect timers, wasted hours, or any other undesirable effects.. ¡Este es un software inestable! Los autores no son de ninguna manera responsables de las grabaciones fallidas o incorrectas, las temporizadores perdidas, ni otros efectos no deseables.. ¡Este software es inestable! Los autores no se responsabilizan por grabaciones fallidas, temporizadores incorrectos, horas perdidas, o cualquier otro efecto no deseado.. + ¡Esto es software inestable! Los autores no son de ninguna manera responsables por grabaciones fallidas, temporizadores incorrectos, horas perdidas o cualquier otro efecto no deseado... + See on ebastabiilne tarkvara! Autorid ei ole kuidagi moodi vastutavad nurjunud salvestiste, ebaõige aegrelee, raisatud tundide ega muude soovimatute asjade eest. Tämä on epävakaa ohjelmisto! Tekijät eivät ole millään muotoa vastuussa epäonnistuneista tallennuksista, virheellisistä ajastuksia, haaskatusta ajasta, verenpaineen noususta tai mistään muusta epäsuotuisasta vaikutuksesta. Logiciel en cours d'élaboration ! Les auteurs ne sont en aucun cas responsables de l'échec des enregistrements, minuteries défectueuses, temps perdu ou autres effets indésirables.. + Ce logiciel est instable! Les auteurs ne sont aucunement responsables des enregistrements défaillants, des minuteries erronées, des heures perdues ou tout autre effet indésirable. Este é software non estable, os autores non se fan responsábeis dos erros na gravacións, temporizadores incorrectos, e outros efectos non desexados. זוהי תוכנה בלתי יציבה!מחברי התכנה אינם אחראים להקלטות כושלות,מתזמני הקלטות שגויים,שעות מבוזבזות,או כל תוצאה בלתי רצויה... + Ovo je nestabilan softver! Autori nisu ni na koji način odgovorni za neuspjelo snimanje, netočna vremena snimanja, izgubljene sate, ili bilo koje druge nepoželjne učinke... Ez nem stabil szoftver! A készítők nem vállalnak felelősséget, a hibás felvételért, rossz időzítésért, elvesztegetett időért... - Questo software è instabile! Gli autori non sono in alcun modo responsabile per le fallite registrazionie, timer non corretti, ore perse o qualsiasi altro effetto non desiderato... + Ini merupakan software yang tidak stabil! Penulis tidak bertanggung jawab untuk rekaman gagal, timer salah, waktu terbuang, atau efek tak diinginkan lainnya... + Þetta er óstöðugur hugbúnaður! Höfundarnir eru á engann hátt ábyrgir fyrir misheppnuðum upptökum, röngum upptökutímum, klukkustundum sem að fóru í súginn eða nokkrum öðrum óæskilegum áhrifum. + Questo software è instabile! Gli autori non sono in alcun modo responsabile per le fallite registrazioni, timer non corretti, ore perse o qualsiasi altro effetto non desiderato... これは不安定なソフトウェアです!本プログラムの作者は、録画の失敗、正確に作動しなかったタイマー、無駄にした時間、その他あらゆる好ましくない結果について責任を負わないものとします。 + ეს არის არასტაბილური პროგრამული უზრუნველყოფა! ავტორები არ არიან პასუხისმგებელი შეცდომებზე, არასწორ EPG-ზე, დაკარგულ დროზე ან სხვა ხარვეზებზე 이 소프트웨어는 불안정합니다! 제작자는 녹화 실패, 부정확한 타이머, 시간 낭비 및 기타 예상하지 못한 결과에 대해 책임지지 않습니다.. Tai yra nestabili programinė įranga! Autorius jokiu būdu neatsakingas už nepavykusius įrašus, neteisingus laikmačius, iššvaistytas valandas, ar nutikus kitiems nepageidaujamiems poveikiams ...[COLOR=red](xbmc.lt rekomenduoja/siūlo testuojant šį priedą persijungti į Anglų [orinali] kalbą)[/COLOR] + Šī ir nestabila programmatūra! Autori nav nekādā vaidā atbildīgi par nesanākušiem ierakstiem, nepareiziem taimeriem, iztērētām stundām vai jebkādiem citiem nevēlamiem efektiem.. Ова е нестабилен софтвер! Авторите на ниту еден начин не одговараат за неуспешни снимки, неточни тајмери, потрошени часови, или било кои други несакани ефекти. + Ini merupakan perisian tidak stabil! Pengarang tidak bertanggungjawab atas kegagalan rakaman, pemasa tidak betul, masa yang dibazirkan, atau apa jua kesan yang tidak dikehendaki.. Dit is onstabiele software! De auteurs zijn op geen enkele manier verantwoordelijk voor mislukte opnames, incorrecte timers, verspilde uren of andere ongewenste effecten. Dette er ustabil programvare! Skaperen har ikke på noen måte ansvar for feilede opptak, feile timere, bortkastede timer, eller andre uønskede effekter.. To oprogramowanie jest niestabilne! Autorzy w żaden sposób nie odpowiadają za nieudane nagrania, źle działające planowanie nagrań, stracone godziny czy też jakiekolwiek inne niepożądane efekty. @@ -102,8 +144,16 @@ Это тестовая программа! Авторы не несут ответственности за неудачные записи, неверные таймеры, потраченное время и прочие нежелательные эффекты.. Tento softvér nie je stabilný! Autori nenesú žiadnu zodpovednosť za chybné nahrávky vysielania, nesprávne časovače alebo iné neželané udalosti spôsobené týmto softvérom.. To je nestabilna programska oprema! Avtorji niso odgovorni za neuspela snemanja, nepravilne časovnike, zapravljen čas in katerikoli drug neželen učinek... + Ky program nuk është ende stabël! Autorët e këtij programi nuk janë në as një menyr përgjegjës për rregistrime të gabuara, timer të pasaktë, kohë të humbur ose efekte të tilla të padëshirueshme. + Овај софтвер је нестабилан! Аутори ни на који начин нису одговорни за неуспела снимања, неисправна заказана снимања, изгубљене сате или друге нежељене ефекте. Detta är ostabil mjukvara! Upphovsmännen är inte ansvariga för misslyckade inspelningar, inkorrekta timers, bortslösade timmar, eller några andra oönskade effekter.. - 这是不稳定版的软件!作者不对录制失败、错误定时造成时间浪费或其它不良影响负责。 + இந்த நிலையற்ற மென்பொருள்! தோல்வியடைந்தது பதிவுகள், தவறான டைமர்கள், வீணாகி மணி, அல்லது வேறு எந்த விரும்பத்தகாத விளைவுகலுக்கு இதன் ஆசிரியர்கள் பொறுப்பு இல்லை. + Ин нармафзори ноустувор аст! Муаллифон барои вайрониҳои сабт, вақтсанҷҳои нодуруст, соатҳои бефоида ва дигар таъсирҳои номатлуб ҷавобгар намебошанд. + Bu stabil olmayan program! Yapımcılar hatalı kayıtlardan, bozuk sürelerden, harcanan vakitten veya herhangi bir olumsuz etkiden dolayı sorumlu tutulamaz. + Це нестабільна програма! Автори не несуть відповідальності за попсуті записи, неправильні таймери, втрачений час та інші небажані ефекти. + Đây là phần mềm không ổn định! Các tác giả không chịu trách nhiệm đối với bản ghi chương trình thất bại, hẹn giờ không chính xác, giờ lãng phí, hoặc bất kỳ tác dụng không mong muốn khác.. + 这是不稳定版的软件!作者不对录像失败、错误定时造成时间浪费或其它不良影响负责。 + 這是測試版軟體!其原創作者並無法對於以下情況負責,包含:錄影失敗,不正確的定時設定,多餘時數,或任何產生的其它不良影響... @OS@ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/changelog.txt xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/changelog.txt --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/changelog.txt 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/changelog.txt 2014-05-04 06:40:43.000000000 +0000 @@ -1,3 +1,21 @@ +1.9.11 +- updated language files from Transifex + +1.9.10 +- updated language files from Transifex + +1.9.9 +- add timeshift buffer functions + +1.8.8 +- sync with PVR API v1.8.0 + +1.7.8 +- fix: typo in settings.xml + +1.7.7 +- Bump after PVR API version bump + 1.6.7 - add: support for /virtual) recording folders - add: support for fetching picons from the webinterface diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Afrikaans/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Afrikaans/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Afrikaans/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Afrikaans/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Afrikaans (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/af/)\n" +"Language-Team: Afrikaans (http://www.transifex.com/projects/p/xbmc-main/language/af/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Albanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Albanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Albanian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Albanian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,121 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Albanian (http://www.transifex.com/projects/p/xbmc-main/language/sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "VU+ hostname or IP address" +msgstr "VU+ hostname ose adresa IP" + +msgctxt "#30002" +msgid "Streaming Port" +msgstr "Porti i transmetimit" + +msgctxt "#30003" +msgid "Username" +msgstr "Emër-përdoruesi" + +msgctxt "#30004" +msgid "Password" +msgstr "Fjalkalimi" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Timeout i përgjigjjes në eskonda" + +msgctxt "#30008" +msgid "Icon Path" +msgstr "Vendndodhja e ikonave" + +msgctxt "#30010" +msgid "Update Interval in minutes" +msgstr "Interval i aktualizimit në minuta" + +msgctxt "#30011" +msgid "Automatic Timerlist Cleanup" +msgstr "Pastrimi i Orarit automatikisht" + +msgctxt "#30012" +msgid "Webinterface Port" +msgstr "Webinterface porti" + +msgctxt "#30013" +msgid "Zap before channelswitch (i.e. for Single Tuner boxes)" +msgstr "Parashikimi i kanaleve para ndrimit tëi një kanali (p.sh. për aparate me Single Tuner )" + +msgctxt "#30014" +msgid "Folder for channeldata" +msgstr "Rregjistri për informacionet të kanaleve" + +msgctxt "#30015" +msgid "Check for bouquett updates" +msgstr "Shikoni për aktualizime të buketit" + +msgctxt "#30016" +msgid "Check for channel updates" +msgstr "Shikoni për aktualizime të kanaleve" + +msgctxt "#30017" +msgid "Use only the DVB boxes' current recording path" +msgstr "Përdorni vendndodhjen aktual për regjistrimet të DVB box'it" + +msgctxt "#30018" +msgid "General" +msgstr "I përgjithsëm" + +msgctxt "#30019" +msgid "Channels" +msgstr "Kanalet" + +msgctxt "#30020" +msgid "Advanced" +msgstr "Të shtuar" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30022" +msgid "Recordings / Timer" +msgstr "Regjistrime / timer" + +msgctxt "#30023" +msgid "Recording folder on the receiver" +msgstr "Regjistër i regjistrimeve në resiverin" + +msgctxt "#30024" +msgid "Send DeepStandby-Command" +msgstr "Dërgo komand DeepStandby" + +msgctxt "#30025" +msgid "Fetch only one TV bouquet" +msgstr "Shkarko vetëm një TV buket" + +msgctxt "#30026" +msgid "TV-Bouquet" +msgstr "TV-Buket" + +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Tërhiqni pikon'at nga webinterface" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "U ndërpre nga '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "U rilidh me '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Amharic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Amharic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Amharic/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Amharic/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Amharic (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/am/)\n" +"Language-Team: Amharic (http://www.transifex.com/projects/p/xbmc-main/language/am/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -25,10 +24,34 @@ msgid "Password" msgstr "የመግቢያ ቃል" +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "መመለሻ ጊዜ በ ሰከንዶች" + +msgctxt "#30008" +msgid "Icon Path" +msgstr "የ ምልክት መንገድ" + +msgctxt "#30010" +msgid "Update Interval in minutes" +msgstr "የ ማሻሻያ እረፍት በ ደቂቆች" + +msgctxt "#30014" +msgid "Folder for channeldata" +msgstr "ፎልደር ለ ጣቢያዎች ዳታ " + +msgctxt "#30016" +msgid "Check for channel updates" +msgstr "የ ጣቢያ ማሻሻያ መፈለጊያ" + msgctxt "#30018" msgid "General" msgstr "ባጠቃላይ" +msgctxt "#30019" +msgid "Channels" +msgstr "ጣቢያዎች" + msgctxt "#30020" msgid "Advanced" msgstr "የረቀቀ" @@ -37,6 +60,10 @@ msgid "HTTP" msgstr "HTTP" +msgctxt "#30022" +msgid "Recordings / Timer" +msgstr "የ መቅረጫ / ሰአት" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "ግንኙነት ተቋርጧል ከ '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Arabic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Arabic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Arabic/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Arabic/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Arabic (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ar/)\n" +"Language-Team: Arabic (http://www.transifex.com/projects/p/xbmc-main/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Basque/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Basque/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Basque/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Basque/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Basque (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/eu/)\n" +"Language-Team: Basque (http://www.transifex.com/projects/p/xbmc-main/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -32,3 +31,7 @@ msgctxt "#30019" msgid "Channels" msgstr "Kateak" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Belarusian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Belarusian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Belarusian/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Belarusian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Belarusian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/be/)\n" +"Language-Team: Belarusian (http://www.transifex.com/projects/p/xbmc-main/language/be/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Bosnian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Bosnian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Bosnian/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Bosnian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Bosnian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/bs/)\n" +"Language-Team: Bosnian (http://www.transifex.com/projects/p/xbmc-main/language/bs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -28,3 +27,11 @@ msgctxt "#30018" msgid "General" msgstr "Opšte" + +msgctxt "#30019" +msgid "Channels" +msgstr "Kanali" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Bulgarian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Bulgarian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Bulgarian/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Bulgarian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,29 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Bulgarian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/bg/)\n" +"Language-Team: Bulgarian (http://www.transifex.com/projects/p/xbmc-main/language/bg/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bg\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "VU+ hostname or IP address" +msgstr "VU+ хост или IP адрес" + +msgctxt "#30002" +msgid "Streaming Port" +msgstr "Стрийминг порт" + msgctxt "#30003" msgid "Username" msgstr "Потребител" @@ -25,6 +32,46 @@ msgid "Password" msgstr "Парола" +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Таймаут за отговор в секунди" + +msgctxt "#30008" +msgid "Icon Path" +msgstr "Път до иконите" + +msgctxt "#30010" +msgid "Update Interval in minutes" +msgstr "Интервал за обновяване в минути" + +msgctxt "#30011" +msgid "Automatic Timerlist Cleanup" +msgstr "Автоматично почистване на таймерите" + +msgctxt "#30012" +msgid "Webinterface Port" +msgstr "Порт на уеб интерфейса" + +msgctxt "#30013" +msgid "Zap before channelswitch (i.e. for Single Tuner boxes)" +msgstr "Нулиране преди превключване на канал (за едно-тунерни устройства)" + +msgctxt "#30014" +msgid "Folder for channeldata" +msgstr "Папка за данните на канала" + +msgctxt "#30015" +msgid "Check for bouquett updates" +msgstr "Провери за обновявания на букетите" + +msgctxt "#30016" +msgid "Check for channel updates" +msgstr "Проверявай за обновяване на каналите" + +msgctxt "#30017" +msgid "Use only the DVB boxes' current recording path" +msgstr "Използвай само за запис на зададения в DVB път" + msgctxt "#30018" msgid "General" msgstr "General" @@ -36,3 +83,39 @@ msgctxt "#30020" msgid "Advanced" msgstr "Допълнителни" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30022" +msgid "Recordings / Timer" +msgstr "Записи / Брояч" + +msgctxt "#30023" +msgid "Recording folder on the receiver" +msgstr "Папка за записите на ресивъра" + +msgctxt "#30024" +msgid "Send DeepStandby-Command" +msgstr "Изпращай DeepStandby команда" + +msgctxt "#30025" +msgid "Fetch only one TV bouquet" +msgstr "Избери само един ТВ букет" + +msgctxt "#30026" +msgid "TV-Bouquet" +msgstr "ТВ букет" + +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Взимай логото на канала от уеб интерфейса" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Изключен от '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Повторно свързан с '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Burmese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Burmese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Burmese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Burmese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,37 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Burmese (http://www.transifex.com/projects/p/xbmc-main/language/my/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30003" +msgid "Username" +msgstr "အသုံးပြုသူအမည်" + +msgctxt "#30004" +msgid "Password" +msgstr "စကားဝှက်" + +msgctxt "#30018" +msgid "General" +msgstr "ယေဘုယျ" + +msgctxt "#30019" +msgid "Channels" +msgstr "Channel များ" + +msgctxt "#30020" +msgid "Advanced" +msgstr "အဆင့်မြင့်သော" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Catalan/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Catalan/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Catalan/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Catalan/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,29 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Catalan (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ca/)\n" +"Language-Team: Catalan (http://www.transifex.com/projects/p/xbmc-main/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "VU+ hostname or IP address" +msgstr "Nom de màquina o IP del VU+" + +msgctxt "#30002" +msgid "Streaming Port" +msgstr "Port del flux de dades" + msgctxt "#30003" msgid "Username" msgstr "Nom d'usuari" @@ -25,6 +32,30 @@ msgid "Password" msgstr "Contrasenya" +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Temps d'espera de la resposta en segons" + +msgctxt "#30008" +msgid "Icon Path" +msgstr "Ruta de l'icona" + +msgctxt "#30010" +msgid "Update Interval in minutes" +msgstr "Interval d'actualització en minuts" + +msgctxt "#30012" +msgid "Webinterface Port" +msgstr "Port de la interfície web" + +msgctxt "#30014" +msgid "Folder for channeldata" +msgstr "Carpeta pel canal de dades" + +msgctxt "#30016" +msgid "Check for channel updates" +msgstr "Comprova si hi ha actualitzacions dels canals" + msgctxt "#30018" msgid "General" msgstr "General" @@ -32,3 +63,39 @@ msgctxt "#30019" msgid "Channels" msgstr "Canals" + +msgctxt "#30020" +msgid "Advanced" +msgstr "Avançat" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30022" +msgid "Recordings / Timer" +msgstr "Enregistraments / Temporitzador" + +msgctxt "#30023" +msgid "Recording folder on the receiver" +msgstr "Grabant carpeta en el receptor" + +msgctxt "#30025" +msgid "Fetch only one TV bouquet" +msgstr "Obté només un TV bouquet" + +msgctxt "#30026" +msgid "TV-Bouquet" +msgstr "TV-Bouquet" + +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Obté els picons des de la interfície web" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Desconnectat de '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Reconnectat a '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Chinese (Simple)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Chinese (Simple)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Chinese (Simple)/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Chinese (Simple)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Chinese (Simple) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/zh/)\n" +"Language-Team: Chinese (Simple) (http://www.transifex.com/projects/p/xbmc-main/language/zh/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,7 +18,7 @@ msgctxt "#30000" msgid "VU+ hostname or IP address" -msgstr "VU+主机名或IP地址" +msgstr "VU+ 主机名或 IP 地址" msgctxt "#30002" msgid "Streaming Port" @@ -51,7 +50,7 @@ msgctxt "#30012" msgid "Webinterface Port" -msgstr "Web界面端口" +msgstr "Web 界面端口" msgctxt "#30013" msgid "Zap before channelswitch (i.e. for Single Tuner boxes)" @@ -71,7 +70,7 @@ msgctxt "#30017" msgid "Use only the DVB boxes' current recording path" -msgstr "仅使用DVB机顶盒的当前录制路径" +msgstr "仅使用 DVB 机顶盒的当前录像路径" msgctxt "#30018" msgid "General" @@ -83,7 +82,7 @@ msgctxt "#30020" msgid "Advanced" -msgstr "高级选项" +msgstr "高级" msgctxt "#30021" msgid "HTTP" @@ -91,15 +90,15 @@ msgctxt "#30022" msgid "Recordings / Timer" -msgstr "录制/计时器" +msgstr "录像/计时器" msgctxt "#30023" msgid "Recording folder on the receiver" -msgstr "接收器上的录制文件夹" +msgstr "接收器上的录像文件夹" msgctxt "#30024" msgid "Send DeepStandby-Command" -msgstr "发送DeepStandby命令" +msgstr "发送 DeepStandby 命令" msgctxt "#30025" msgid "Fetch only one TV bouquet" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "电视频道组" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "从 Web 界面获取 picons" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "断开到“%s”的连接" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Chinese (Traditional)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Chinese (Traditional)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Chinese (Traditional)/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Chinese (Traditional)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,29 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Chinese (Traditional) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/zh_TW/)\n" +"Language-Team: Chinese (Traditional) (http://www.transifex.com/projects/p/xbmc-main/language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0;\n" +msgctxt "#30000" +msgid "VU+ hostname or IP address" +msgstr "VU+主機名稱或IP位址" + +msgctxt "#30002" +msgid "Streaming Port" +msgstr "串流端口" + msgctxt "#30003" msgid "Username" msgstr "帳號" @@ -25,6 +32,46 @@ msgid "Password" msgstr "密碼" +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "回應超時(秒)" + +msgctxt "#30008" +msgid "Icon Path" +msgstr "圖示路徑" + +msgctxt "#30010" +msgid "Update Interval in minutes" +msgstr "以分鐘為單位的更新間隔" + +msgctxt "#30011" +msgid "Automatic Timerlist Cleanup" +msgstr "自動清除定時器清單" + +msgctxt "#30012" +msgid "Webinterface Port" +msgstr "Web介面端口" + +msgctxt "#30013" +msgid "Zap before channelswitch (i.e. for Single Tuner boxes)" +msgstr "頻道切換前修正 (i.e.針對單頻電視盒)" + +msgctxt "#30014" +msgid "Folder for channeldata" +msgstr "channeldata的資料夾" + +msgctxt "#30015" +msgid "Check for bouquett updates" +msgstr "檢查節目群組更新" + +msgctxt "#30016" +msgid "Check for channel updates" +msgstr "檢查頻道更新" + +msgctxt "#30017" +msgid "Use only the DVB boxes' current recording path" +msgstr "只使用DVB數位機上盒目前的錄影路徑" + msgctxt "#30018" msgid "General" msgstr "一般設定" @@ -32,3 +79,43 @@ msgctxt "#30019" msgid "Channels" msgstr "頻道" + +msgctxt "#30020" +msgid "Advanced" +msgstr "進階" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30022" +msgid "Recordings / Timer" +msgstr "錄影/定時器" + +msgctxt "#30023" +msgid "Recording folder on the receiver" +msgstr "接收器上的錄影資料夾" + +msgctxt "#30024" +msgid "Send DeepStandby-Command" +msgstr "傳送 DeepStandby-Command" + +msgctxt "#30025" +msgid "Fetch only one TV bouquet" +msgstr "只取單一電視節目群組" + +msgctxt "#30026" +msgid "TV-Bouquet" +msgstr "電視節目群組" + +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "從Web界面獲取picons" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "從 '%s' 斷開連線" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "從 '%s' 重新連線" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Croatian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Croatian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Croatian/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Croatian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,29 +1,76 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Croatian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/hr/)\n" +"Language-Team: Croatian (http://www.transifex.com/projects/p/xbmc-main/language/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +msgctxt "#30000" +msgid "VU+ hostname or IP address" +msgstr "VU+ naziv računala ili IP adresa" + +msgctxt "#30002" +msgid "Streaming Port" +msgstr "Ulaz stremanja" + msgctxt "#30003" msgid "Username" msgstr "Korisničko ime" msgctxt "#30004" msgid "Password" -msgstr "Zaporka" +msgstr "Lozinka" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Vrijeme odaziva u sekundama" + +msgctxt "#30008" +msgid "Icon Path" +msgstr "Putanja ikone" + +msgctxt "#30010" +msgid "Update Interval in minutes" +msgstr "Interval osvježavanja u minutama" + +msgctxt "#30011" +msgid "Automatic Timerlist Cleanup" +msgstr "Automatsko čišćenje popisa zadanih snimanja" + +msgctxt "#30012" +msgid "Webinterface Port" +msgstr "Ulaz web sučelja" + +msgctxt "#30013" +msgid "Zap before channelswitch (i.e. for Single Tuner boxes)" +msgstr "Isključi prije promjene programa (za uređaje s jednim prijemnikom)" + +msgctxt "#30014" +msgid "Folder for channeldata" +msgstr "Mapa za podatke programa" + +msgctxt "#30015" +msgid "Check for bouquett updates" +msgstr "Provjeri nadopune buketa" + +msgctxt "#30016" +msgid "Check for channel updates" +msgstr "Provjeri nadopune programa" + +msgctxt "#30017" +msgid "Use only the DVB boxes' current recording path" +msgstr "Koristi samo za DVB uređaje, trenutna putanja snimanja" msgctxt "#30018" msgid "General" @@ -31,8 +78,44 @@ msgctxt "#30019" msgid "Channels" -msgstr "Kanali" +msgstr "Programi" msgctxt "#30020" msgid "Advanced" msgstr "Napredno" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30022" +msgid "Recordings / Timer" +msgstr "Snimanja / Zakazana snimanja" + +msgctxt "#30023" +msgid "Recording folder on the receiver" +msgstr "Mapa snimanja na prijemniku" + +msgctxt "#30024" +msgid "Send DeepStandby-Command" +msgstr "Pošalji naredbu duboke pripravnosti" + +msgctxt "#30025" +msgid "Fetch only one TV bouquet" +msgstr "Dohvati samo jedan TV buket" + +msgctxt "#30026" +msgid "TV-Bouquet" +msgstr "TV buket" + +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Dohvati ikone iz web sučelja" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Odspojen s '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Ponovno povezan s '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Czech/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Czech/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Czech/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Czech/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Czech (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/cs/)\n" +"Language-Team: Czech (http://www.transifex.com/projects/p/xbmc-main/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "Oblíbená skupina TV programů" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Stáhnout pikony z webového rozhraní" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "Odpojeno od '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Danish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Danish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Danish/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Danish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Danish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/da/)\n" +"Language-Team: Danish (http://www.transifex.com/projects/p/xbmc-main/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "TV-buket" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Hent picons fra webinterfacet" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "Forbindelse afbrudt fra '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Dutch/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Dutch/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Dutch/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Dutch/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Dutch (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/nl/)\n" +"Language-Team: Dutch (http://www.transifex.com/projects/p/xbmc-main/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "TV-bouquet" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Haal picons op met de webinterface" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "Verbinding met '%s' verbroken" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/English/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/English/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/English/strings.po 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/English/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: English (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/en/)\n" +"Language-Team: English (http://www.transifex.com/projects/p/xbmc-main/language/en/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -118,7 +117,7 @@ msgstr "" msgctxt "#30027" -imsgid "Fetch picons from webinterface" +msgid "Fetch picons from webinterface" msgstr "" #empty strings from id 30028 to 30499 @@ -131,5 +130,3 @@ msgctxt "#30501" msgid "Reconnected to '%s'" msgstr "" - - diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/English (Australia)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/English (Australia)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/English (Australia)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/English (Australia)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,33 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (Australia) (http://www.transifex.com/projects/p/xbmc-main/language/en_AU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30003" +msgid "Username" +msgstr "Username" + +msgctxt "#30004" +msgid "Password" +msgstr "Password" + +msgctxt "#30018" +msgid "General" +msgstr "General" + +msgctxt "#30020" +msgid "Advanced" +msgstr "Advanced" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/English (New Zealand)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/English (New Zealand)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/English (New Zealand)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/English (New Zealand)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,117 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (New Zealand) (http://www.transifex.com/projects/p/xbmc-main/language/en_NZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_NZ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "VU+ hostname or IP address" +msgstr "VU+ hostname or IP address" + +msgctxt "#30002" +msgid "Streaming Port" +msgstr "Streaming Port" + +msgctxt "#30003" +msgid "Username" +msgstr "Username" + +msgctxt "#30004" +msgid "Password" +msgstr "Password" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Response timeout in seconds" + +msgctxt "#30008" +msgid "Icon Path" +msgstr "Icon Path" + +msgctxt "#30010" +msgid "Update Interval in minutes" +msgstr "Update Interval in minutes" + +msgctxt "#30011" +msgid "Automatic Timerlist Cleanup" +msgstr "Automatic Timerlist Cleanup" + +msgctxt "#30012" +msgid "Webinterface Port" +msgstr "Webinterface Port" + +msgctxt "#30013" +msgid "Zap before channelswitch (i.e. for Single Tuner boxes)" +msgstr "Zap before channelswitch (i.e. for Single Tuner boxes)" + +msgctxt "#30014" +msgid "Folder for channeldata" +msgstr "Folder for channeldata" + +msgctxt "#30016" +msgid "Check for channel updates" +msgstr "Check for channel updates" + +msgctxt "#30017" +msgid "Use only the DVB boxes' current recording path" +msgstr "Use only the DVB boxes' current recording path" + +msgctxt "#30018" +msgid "General" +msgstr "General" + +msgctxt "#30019" +msgid "Channels" +msgstr "Channels" + +msgctxt "#30020" +msgid "Advanced" +msgstr "Advanced" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30022" +msgid "Recordings / Timer" +msgstr "Recordings / Timer" + +msgctxt "#30023" +msgid "Recording folder on the receiver" +msgstr "Recording folder on the receiver" + +msgctxt "#30024" +msgid "Send DeepStandby-Command" +msgstr "Send DeepStandby-Command" + +msgctxt "#30025" +msgid "Fetch only one TV bouquet" +msgstr "Fetch only one TV bouquet" + +msgctxt "#30026" +msgid "TV-Bouquet" +msgstr "TV-Bouquet" + +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Fetch picons from webinterface" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Disconnected from '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Reconnected to '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/English (US)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/English (US)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/English (US)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/English (US)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,41 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (US) (http://www.transifex.com/projects/p/xbmc-main/language/en_US/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_US\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30003" +msgid "Username" +msgstr "Username" + +msgctxt "#30004" +msgid "Password" +msgstr "Password" + +msgctxt "#30018" +msgid "General" +msgstr "General" + +msgctxt "#30019" +msgid "Channels" +msgstr "Channels" + +msgctxt "#30020" +msgid "Advanced" +msgstr "Advanced" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Esperanto/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Esperanto/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Esperanto/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Esperanto/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Esperanto (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/eo/)\n" +"Language-Team: Esperanto (http://www.transifex.com/projects/p/xbmc-main/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Estonian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Estonian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Estonian/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Estonian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,29 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Estonian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/et/)\n" +"Language-Team: Estonian (http://www.transifex.com/projects/p/xbmc-main/language/et/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: et\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#30000" +msgid "VU+ hostname or IP address" +msgstr "VU+ hosti nimi või IP aadress" + +msgctxt "#30002" +msgid "Streaming Port" +msgstr "Voo port" + msgctxt "#30003" msgid "Username" msgstr "Kasutajanimi" @@ -25,6 +32,74 @@ msgid "Password" msgstr "Salasõna" +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Vastuse aegumine sekundites" + +msgctxt "#30008" +msgid "Icon Path" +msgstr "Ikooni asukoht" + +msgctxt "#30010" +msgid "Update Interval in minutes" +msgstr "Uuendamise intervall minutites" + +msgctxt "#30011" +msgid "Automatic Timerlist Cleanup" +msgstr "Ajamõõtja loendi automaatne puhastus" + +msgctxt "#30012" +msgid "Webinterface Port" +msgstr "Veebiliidese port" + +msgctxt "#30013" +msgid "Zap before channelswitch (i.e. for Single Tuner boxes)" +msgstr "Enne kanali vahetamist kustutage (nt üksiktuunerite puhul)" + +msgctxt "#30014" +msgid "Folder for channeldata" +msgstr "Kanali info kaust" + +msgctxt "#30015" +msgid "Check for bouquett updates" +msgstr "Kontrollige kanalite uuendusi" + +msgctxt "#30016" +msgid "Check for channel updates" +msgstr "Kontrolli kanali uuendusi" + +msgctxt "#30017" +msgid "Use only the DVB boxes' current recording path" +msgstr "Kasutage ainult praeguse DVB boksi salvestamisasukohta" + msgctxt "#30018" msgid "General" msgstr "Üldine" + +msgctxt "#30019" +msgid "Channels" +msgstr "Kanalid" + +msgctxt "#30020" +msgid "Advanced" +msgstr "Põhjalikumad seaded" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30022" +msgid "Recordings / Timer" +msgstr "Salvestamine / ajastus" + +msgctxt "#30023" +msgid "Recording folder on the receiver" +msgstr "Salvestus kaust vastuvõtjas" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "'%s' lahti ühendatud" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "'%s' uuesti ühendatud" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Faroese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Faroese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Faroese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Faroese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,33 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Faroese (http://www.transifex.com/projects/p/xbmc-main/language/fo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30003" +msgid "Username" +msgstr "Brúkaranavn" + +msgctxt "#30004" +msgid "Password" +msgstr "Loyniorð" + +msgctxt "#30018" +msgid "General" +msgstr "Vanligt" + +msgctxt "#30019" +msgid "Channels" +msgstr "Rás" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Finnish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Finnish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Finnish/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Finnish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Finnish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fi/)\n" +"Language-Team: Finnish (http://www.transifex.com/projects/p/xbmc-main/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -49,6 +48,10 @@ msgid "Channels" msgstr "Kanavat" +msgctxt "#30020" +msgid "Advanced" +msgstr "Lisäasetukset" + msgctxt "#30021" msgid "HTTP" msgstr "HTTP" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/French/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/French/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/French/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/French/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: French (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fr/)\n" +"Language-Team: French (http://www.transifex.com/projects/p/xbmc-main/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "Bouquet TV" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Récupérer les icônes de l'interface web " + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "Déconnecté de '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/French (Canada)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/French (Canada)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/French (Canada)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/French (Canada)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,121 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: French (Canada) (http://www.transifex.com/projects/p/xbmc-main/language/fr_CA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr_CA\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "VU+ hostname or IP address" +msgstr "Nom d'hôte ou adresse IP de VU+" + +msgctxt "#30002" +msgid "Streaming Port" +msgstr "Port de lecture en transit" + +msgctxt "#30003" +msgid "Username" +msgstr "Nom d'utilisateur" + +msgctxt "#30004" +msgid "Password" +msgstr "Mot de passe" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Délai d'attente de réponse en secondes" + +msgctxt "#30008" +msgid "Icon Path" +msgstr "Chemin des icônes" + +msgctxt "#30010" +msgid "Update Interval in minutes" +msgstr "Intervalle de mise à jour en minutes" + +msgctxt "#30011" +msgid "Automatic Timerlist Cleanup" +msgstr "Nettoyage automatique de la liste des minuteries" + +msgctxt "#30012" +msgid "Webinterface Port" +msgstr "Port de l'interface Web" + +msgctxt "#30013" +msgid "Zap before channelswitch (i.e. for Single Tuner boxes)" +msgstr "Passer les chaînes avant le changement effectif (c.-à-d. pour les boîtiers syntoniseurs simples)" + +msgctxt "#30014" +msgid "Folder for channeldata" +msgstr "Dossier des données de chaînes" + +msgctxt "#30015" +msgid "Check for bouquett updates" +msgstr "Vérifier les mises à jour du bouquet numérique" + +msgctxt "#30016" +msgid "Check for channel updates" +msgstr "Vérifier les mises à jour de chaînes" + +msgctxt "#30017" +msgid "Use only the DVB boxes' current recording path" +msgstr "Utiliser seulement le chemin d'enregistrement actuel du boîtier DVB" + +msgctxt "#30018" +msgid "General" +msgstr "Général" + +msgctxt "#30019" +msgid "Channels" +msgstr "Chaînes" + +msgctxt "#30020" +msgid "Advanced" +msgstr "Avancé" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30022" +msgid "Recordings / Timer" +msgstr " Enregistrements / minuterie" + +msgctxt "#30023" +msgid "Recording folder on the receiver" +msgstr "Dossier d'enregistrement du récepteur" + +msgctxt "#30024" +msgid "Send DeepStandby-Command" +msgstr "Envoyer la commande deepstandby" + +msgctxt "#30025" +msgid "Fetch only one TV bouquet" +msgstr "Ne récupérer qu'un bouquet télé" + +msgctxt "#30026" +msgid "TV-Bouquet" +msgstr "Bouquet télé" + +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Récupérer les icônes de l'interface Web" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Se déconnecter de « %s »" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Se reconnecter à « %s »" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Galician/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Galician/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Galician/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Galician/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Galician (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/gl/)\n" +"Language-Team: Galician (http://www.transifex.com/projects/p/xbmc-main/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "TV-Bouquet" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Obter picons da interface web" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "Desconectado dende '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Georgian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Georgian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Georgian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Georgian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,49 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Georgian (http://www.transifex.com/projects/p/xbmc-main/language/ka/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ka\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30003" +msgid "Username" +msgstr "მომხმარებელი" + +msgctxt "#30004" +msgid "Password" +msgstr "პაროლი" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "პასუხის დაგვიანება წამებში" + +msgctxt "#30012" +msgid "Webinterface Port" +msgstr "ვებ-ინტერფეისის პორტი" + +msgctxt "#30018" +msgid "General" +msgstr "მთავარი" + +msgctxt "#30020" +msgid "Advanced" +msgstr "დამატებით" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "'%s' გამოირთო" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "'%s' ისევ შეერთდა" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/German/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/German/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/German/strings.po 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/German/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: German (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/de/)\n" +"Language-Team: German (http://www.transifex.com/projects/p/xbmc-main/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,7 +18,7 @@ msgctxt "#30000" msgid "VU+ hostname or IP address" -msgstr "VU+ IP" +msgstr "VU+ Hostname oder IP-Adresse" msgctxt "#30002" msgid "Streaming Port" @@ -39,19 +38,19 @@ msgctxt "#30008" msgid "Icon Path" -msgstr "Picon-Pfad" +msgstr "Icon-Pfad" msgctxt "#30010" msgid "Update Interval in minutes" -msgstr "Aktualisierungsintervall (in Minuten)" +msgstr "Aktualisierungsintervall in Minuten" msgctxt "#30011" msgid "Automatic Timerlist Cleanup" -msgstr "Entferne abgeschlossene Timer" +msgstr "Entferne abgeschlossene Timer automatisch" msgctxt "#30012" msgid "Webinterface Port" -msgstr "Webinterface Port" +msgstr "Weboberfläche Port" msgctxt "#30013" msgid "Zap before channelswitch (i.e. for Single Tuner boxes)" @@ -71,11 +70,11 @@ msgctxt "#30017" msgid "Use only the DVB boxes' current recording path" -msgstr "Aktuellen Box-Aufnahmenpfad nutzen" +msgstr "Nur den aktuellen Box-Aufnahmenpfad nutzen" msgctxt "#30018" msgid "General" -msgstr "Allgemeines" +msgstr "Allgemein" msgctxt "#30019" msgid "Channels" @@ -83,7 +82,7 @@ msgctxt "#30020" msgid "Advanced" -msgstr "Fortgeschritten" +msgstr "Erweitert" msgctxt "#30021" msgid "HTTP" @@ -103,22 +102,19 @@ msgctxt "#30025" msgid "Fetch only one TV bouquet" -msgstr "Nur ein TV-Bouquet" +msgstr "Lade nur ein TV-Bouquet" msgctxt "#30026" msgid "TV-Bouquet" msgstr "TV-Bouquet" msgctxt "#30027" -imsgid "Fetch picons from webinterface" -msgstr "Lade Picons vom Web-Interface" - -#empty strings from id 30028 to 30499 -#notifications +msgid "Fetch picons from webinterface" +msgstr "Lade Picons aus der Weboberfläche" msgctxt "#30500" msgid "Disconnected from '%s'" -msgstr "Verbindung '%s' unterbrochen" +msgstr "Verbindung zu '%s' unterbrochen" msgctxt "#30501" msgid "Reconnected to '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Greek/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Greek/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Greek/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Greek/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Greek (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/el/)\n" +"Language-Team: Greek (http://www.transifex.com/projects/p/xbmc-main/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "Μπουκέτο TV" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Λήψη εικονιδίων από τη διεπαφή ιστού" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "Αποσύνδεση από '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Haitian (Haitian Creole)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Haitian (Haitian Creole)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Haitian (Haitian Creole)/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Haitian (Haitian Creole)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Haitian (Haitian Creole) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ht/)\n" +"Language-Team: Haitian (Haitian Creole) (http://www.transifex.com/projects/p/xbmc-main/language/ht/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Hebrew/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Hebrew/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Hebrew/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Hebrew/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hebrew (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/he/)\n" +"Language-Team: Hebrew (http://www.transifex.com/projects/p/xbmc-main/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,7 +18,7 @@ msgctxt "#30000" msgid "VU+ hostname or IP address" -msgstr "VU+ שם מארח או כתובת IP" +msgstr "שם מארח או כתובת IP של VU+‎" msgctxt "#30002" msgid "Streaming Port" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "תוכנית זרה" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "קבלת ה־picons ממנשק הדפדפן" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "התנתק מ '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Hindi (Devanagiri)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Hindi (Devanagiri)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Hindi (Devanagiri)/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Hindi (Devanagiri)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hindi (Devanagiri) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/hi/)\n" +"Language-Team: Hindi (Devanagiri) (http://www.transifex.com/projects/p/xbmc-main/language/hi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -24,3 +23,7 @@ msgctxt "#30018" msgid "General" msgstr "सामान्य" + +msgctxt "#30020" +msgid "Advanced" +msgstr "उन्नत" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Hungarian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Hungarian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Hungarian/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Hungarian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Hungarian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/hu/)\n" +"Language-Team: Hungarian (http://www.transifex.com/projects/p/xbmc-main/language/hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "TV-csatorna-csoport" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Webes ikonok használata" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "'%s': Kapcsolat bontva" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Icelandic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Icelandic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Icelandic/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Icelandic/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Icelandic (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/is/)\n" +"Language-Team: Icelandic (http://www.transifex.com/projects/p/xbmc-main/language/is/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -32,3 +31,15 @@ msgctxt "#30019" msgid "Channels" msgstr "Rásir" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Aftengdur frá '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Tengdur við '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Indonesian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Indonesian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Indonesian/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Indonesian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,29 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Indonesian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/id/)\n" +"Language-Team: Indonesian (http://www.transifex.com/projects/p/xbmc-main/language/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: id\n" "Plural-Forms: nplurals=1; plural=0;\n" +msgctxt "#30000" +msgid "VU+ hostname or IP address" +msgstr "Hostname atau alamat IP VU+" + +msgctxt "#30002" +msgid "Streaming Port" +msgstr "Port pengaliran" + msgctxt "#30003" msgid "Username" msgstr "NamaPengguna" @@ -25,6 +32,90 @@ msgid "Password" msgstr "Password" +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Timeout response dalam deti" + +msgctxt "#30008" +msgid "Icon Path" +msgstr "Path Ikon" + +msgctxt "#30010" +msgid "Update Interval in minutes" +msgstr "Interval update dalam menit" + +msgctxt "#30011" +msgid "Automatic Timerlist Cleanup" +msgstr "Pembersihan TImerlist secara otomatis" + +msgctxt "#30012" +msgid "Webinterface Port" +msgstr "Port antar-muka web" + +msgctxt "#30013" +msgid "Zap before channelswitch (i.e. for Single Tuner boxes)" +msgstr "Matikan sebelum pindah kanal (Contohnya untuk Tuner tunggal)" + +msgctxt "#30014" +msgid "Folder for channeldata" +msgstr "Folder untuk data kanal" + +msgctxt "#30015" +msgid "Check for bouquett updates" +msgstr "Cek untuk pemuktahiran buket" + +msgctxt "#30016" +msgid "Check for channel updates" +msgstr "Cek untuk pemuktahiran kanal" + +msgctxt "#30017" +msgid "Use only the DVB boxes' current recording path" +msgstr "Hanya gunakan path rekaman DVB yang digunakan saat ini" + msgctxt "#30018" msgid "General" msgstr "Umum" + +msgctxt "#30019" +msgid "Channels" +msgstr "Saluran" + +msgctxt "#30020" +msgid "Advanced" +msgstr "Tingkat Lanjut" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30022" +msgid "Recordings / Timer" +msgstr "Perekaman / Timer" + +msgctxt "#30023" +msgid "Recording folder on the receiver" +msgstr "Folder rekaman di penerima" + +msgctxt "#30024" +msgid "Send DeepStandby-Command" +msgstr "Kirim perintah DeepStandby-Command" + +msgctxt "#30025" +msgid "Fetch only one TV bouquet" +msgstr "Hanya ambil satu buket TV" + +msgctxt "#30026" +msgid "TV-Bouquet" +msgstr "Buket TV" + +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Ambil picons dan antarmuka web" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Terputus dari '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Tersambung lagi pada '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Italian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Italian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Italian/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Italian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Italian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/it/)\n" +"Language-Team: Italian (http://www.transifex.com/projects/p/xbmc-main/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -23,7 +22,7 @@ msgctxt "#30002" msgid "Streaming Port" -msgstr "Porta di streaming" +msgstr "Porta per lo streaming" msgctxt "#30003" msgid "Username" @@ -51,15 +50,15 @@ msgctxt "#30012" msgid "Webinterface Port" -msgstr "Porta interfaccia web" +msgstr "Porta dell'interfaccia web" msgctxt "#30013" msgid "Zap before channelswitch (i.e. for Single Tuner boxes)" -msgstr "Zap prima del cambio canale (e.g. per le postazioni con sintonizzatore singolo)" +msgstr "Zap prima del cambio canale (ad es: per i dispositivi con sintonizzatore singolo)" msgctxt "#30014" msgid "Folder for channeldata" -msgstr "Cartella dei dati canale" +msgstr "Cartella per i dati dei canali" msgctxt "#30015" msgid "Check for bouquett updates" @@ -71,7 +70,7 @@ msgctxt "#30017" msgid "Use only the DVB boxes' current recording path" -msgstr "Usa solo il percorso di registrazione corrente di DVB" +msgstr "Usa solo il percorso di registrazione corrente del dispositivo DVB" msgctxt "#30018" msgid "General" @@ -83,7 +82,7 @@ msgctxt "#30020" msgid "Advanced" -msgstr "Avanzato" +msgstr "Avanzate" msgctxt "#30021" msgid "HTTP" @@ -91,7 +90,7 @@ msgctxt "#30022" msgid "Recordings / Timer" -msgstr "Registrazioni/Timer" +msgstr "Registrazioni / Timer" msgctxt "#30023" msgid "Recording folder on the receiver" @@ -99,7 +98,7 @@ msgctxt "#30024" msgid "Send DeepStandby-Command" -msgstr "Spedisci DeepStandby-Command" +msgstr "Invia comando di DeepStandby" msgctxt "#30025" msgid "Fetch only one TV bouquet" @@ -107,7 +106,11 @@ msgctxt "#30026" msgid "TV-Bouquet" -msgstr "TV-Bouquet" +msgstr "Bouquet TV" + +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Raccogli picons dall'interfaccia web" msgctxt "#30500" msgid "Disconnected from '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Japanese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Japanese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Japanese/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Japanese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Japanese (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ja/)\n" +"Language-Team: Japanese (http://www.transifex.com/projects/p/xbmc-main/language/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -53,14 +52,26 @@ msgid "Webinterface Port" msgstr "Web インターフェースのポート番号" +msgctxt "#30013" +msgid "Zap before channelswitch (i.e. for Single Tuner boxes)" +msgstr "チャンネル切り替えの前にザッピングする (つまり、シングルチューナーボックス用)" + msgctxt "#30014" msgid "Folder for channeldata" msgstr "チャンネルデータのフォルダー" +msgctxt "#30015" +msgid "Check for bouquett updates" +msgstr "ブーケの更新を確認" + msgctxt "#30016" msgid "Check for channel updates" msgstr "チャンネル更新を確認" +msgctxt "#30017" +msgid "Use only the DVB boxes' current recording path" +msgstr "DVB ボックスの現在の録画パスのみ使用" + msgctxt "#30018" msgid "General" msgstr "一般" @@ -89,6 +100,18 @@ msgid "Send DeepStandby-Command" msgstr "ディープスタンバイコマンドを送る" +msgctxt "#30025" +msgid "Fetch only one TV bouquet" +msgstr "ひとつのTV ブーケのみ取得" + +msgctxt "#30026" +msgid "TV-Bouquet" +msgstr "TV-ブーケ" + +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "ウェブインターフェースからpiconを取得" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "'%s' との接続が切れました" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Korean/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Korean/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Korean/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Korean/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Korean (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ko/)\n" +"Language-Team: Korean (http://www.transifex.com/projects/p/xbmc-main/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -53,6 +52,10 @@ msgid "Webinterface Port" msgstr "웹인터페이스 포트" +msgctxt "#30013" +msgid "Zap before channelswitch (i.e. for Single Tuner boxes)" +msgstr "채널변경전 삭제 (Single Tuner boxes등을 위해)" + msgctxt "#30014" msgid "Folder for channeldata" msgstr "채널 데이터 폴더" @@ -105,6 +108,10 @@ msgid "TV-Bouquet" msgstr "TV 묶음" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "웹인터페이스로 부터 아이콘들을 가져옴" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "'%s'에서 연결 해제됨" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Latvian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Latvian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Latvian/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Latvian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,61 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Latvian (http://www.transifex.com/projects/p/xbmc-main/language/lv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +msgctxt "#30000" +msgid "VU+ hostname or IP address" +msgstr "VU+ saimniekvārds vai IP adrese" + +msgctxt "#30003" +msgid "Username" +msgstr "LIetotājvārds" + +msgctxt "#30004" +msgid "Password" +msgstr "Parole" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Atbildes noilgums sekundēs" + +msgctxt "#30012" +msgid "Webinterface Port" +msgstr "Tīmekļa saskarnes ports" + +msgctxt "#30018" +msgid "General" +msgstr "Vispārīgi" + +msgctxt "#30019" +msgid "Channels" +msgstr "Kanāli" + +msgctxt "#30020" +msgid "Advanced" +msgstr "Papildus" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Atvienots no '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Atkal savienots '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Lithuanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Lithuanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Lithuanian/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Lithuanian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Lithuanian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/lt/)\n" +"Language-Team: Lithuanian (http://www.transifex.com/projects/p/xbmc-main/language/lt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "TV-Plokštė" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Įkelti 'picons' iš interneto sąsajos" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "Atjungtas nuo '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Macedonian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Macedonian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Macedonian/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Macedonian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Macedonian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/mk/)\n" +"Language-Team: Macedonian (http://www.transifex.com/projects/p/xbmc-main/language/mk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "ТВ-Пакет" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Превземи икони од интернет" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "Деконектирано од '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Malay/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Malay/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Malay/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Malay/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,121 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Malay (http://www.transifex.com/projects/p/xbmc-main/language/ms/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "VU+ hostname or IP address" +msgstr "Nama hos atau alamat IP VU+" + +msgctxt "#30002" +msgid "Streaming Port" +msgstr "Port Penstriman" + +msgctxt "#30003" +msgid "Username" +msgstr "Nama Pengguna" + +msgctxt "#30004" +msgid "Password" +msgstr "Kata Laluan" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Had masa tamat respons dalam saat" + +msgctxt "#30008" +msgid "Icon Path" +msgstr "Laluan Ikon" + +msgctxt "#30010" +msgid "Update Interval in minutes" +msgstr "Sela kemaskini dalam minit" + +msgctxt "#30011" +msgid "Automatic Timerlist Cleanup" +msgstr "Pembersihan Senarai Pemasa Berautomatik" + +msgctxt "#30012" +msgid "Webinterface Port" +msgstr "Port " + +msgctxt "#30013" +msgid "Zap before channelswitch (i.e. for Single Tuner boxes)" +msgstr "Zap sebelum tukar saluran (cth. Kotak Penala Tunggal)" + +msgctxt "#30014" +msgid "Folder for channeldata" +msgstr "Folder untuk data saluran" + +msgctxt "#30015" +msgid "Check for bouquett updates" +msgstr "Semak unutk kemaskini bouquett" + +msgctxt "#30016" +msgid "Check for channel updates" +msgstr "Semak untuk kemaskini saluran" + +msgctxt "#30017" +msgid "Use only the DVB boxes' current recording path" +msgstr "Hanya guna laluan rakaman semasa kotak DVB" + +msgctxt "#30018" +msgid "General" +msgstr "Am" + +msgctxt "#30019" +msgid "Channels" +msgstr "Saluran" + +msgctxt "#30020" +msgid "Advanced" +msgstr "Lanjutan" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30022" +msgid "Recordings / Timer" +msgstr "Rakaman / Pemasa" + +msgctxt "#30023" +msgid "Recording folder on the receiver" +msgstr "Folder rakaman pada penerima" + +msgctxt "#30024" +msgid "Send DeepStandby-Command" +msgstr "Hantar " + +msgctxt "#30025" +msgid "Fetch only one TV bouquet" +msgstr "Hanya hantar satu TV bouquet" + +msgctxt "#30026" +msgid "TV-Bouquet" +msgstr "TV-Bouquet" + +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Dapatkan picons dari " + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Terputus dari '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Bersambung semula dengan '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Malayalam/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Malayalam/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Malayalam/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Malayalam/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Malayalam (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ml/)\n" +"Language-Team: Malayalam (http://www.transifex.com/projects/p/xbmc-main/language/ml/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Maltese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Maltese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Maltese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Maltese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Maltese (http://www.transifex.com/projects/p/xbmc-main/language/mt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mt\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);\n" + +msgctxt "#30003" +msgid "Username" +msgstr "Username" + +msgctxt "#30004" +msgid "Password" +msgstr "Sigriet" + +msgctxt "#30018" +msgid "General" +msgstr "Ġenerali" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Maori/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Maori/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Maori/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Maori/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,41 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Maori (http://www.transifex.com/projects/p/xbmc-main/language/mi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mi\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30003" +msgid "Username" +msgstr "Ingoa kaiwhakamahi" + +msgctxt "#30004" +msgid "Password" +msgstr "Kupuhipa" + +msgctxt "#30018" +msgid "General" +msgstr "Āhuawhānui" + +msgctxt "#30019" +msgid "Channels" +msgstr "Ngā hongere" + +msgctxt "#30020" +msgid "Advanced" +msgstr "Arā Atu Anō" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Norwegian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Norwegian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Norwegian/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Norwegian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Norwegian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/no/)\n" +"Language-Team: Norwegian (http://www.transifex.com/projects/p/xbmc-main/language/no/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Ossetic/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Ossetic/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Ossetic/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Ossetic/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,21 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Ossetic (http://www.transifex.com/projects/p/xbmc-main/language/os/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: os\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30018" +msgid "General" +msgstr "Сӕйраг" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Persian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Persian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Persian/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Persian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Persian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/fa/)\n" +"Language-Team: Persian (http://www.transifex.com/projects/p/xbmc-main/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -28,3 +27,7 @@ msgctxt "#30018" msgid "General" msgstr "عمومی" + +msgctxt "#30020" +msgid "Advanced" +msgstr "پیشرفته" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Persian (Iran)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Persian (Iran)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Persian (Iran)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Persian (Iran)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Persian (Iran) (http://www.transifex.com/projects/p/xbmc-main/language/fa_IR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa_IR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30003" +msgid "Username" +msgstr "نام کاربری" + +msgctxt "#30004" +msgid "Password" +msgstr "رمز عبور" + +msgctxt "#30018" +msgid "General" +msgstr "عمومی" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Polish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Polish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Polish/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Polish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Polish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pl/)\n" +"Language-Team: Polish (http://www.transifex.com/projects/p/xbmc-main/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "Bukiet" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Pobierz logo kanałów przez interfejs internetowy" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "Rozłączono od '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Portuguese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Portuguese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Portuguese/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Portuguese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Portuguese (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pt/)\n" +"Language-Team: Portuguese (http://www.transifex.com/projects/p/xbmc-main/language/pt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "TV-Bouquet" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Obter picons da webinterface" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "Desligado de '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Portuguese (Brazil)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Portuguese (Brazil)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Portuguese (Brazil)/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Portuguese (Brazil)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/pt_BR/)\n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/xbmc-main/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "TV-Bouquet" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Buscar picons da webinterface" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "Desconectado de '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Romanian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Romanian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Romanian/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Romanian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Romanian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ro/)\n" +"Language-Team: Romanian (http://www.transifex.com/projects/p/xbmc-main/language/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "Buchet TV" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Descarcă picons direct din interfața web" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "Deconectat de la '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Russian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Russian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Russian/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Russian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Russian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/ru/)\n" +"Language-Team: Russian (http://www.transifex.com/projects/p/xbmc-main/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "TV-букет" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Брать лого каналов из вебинтерфейса" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "Отсоединено от '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Serbian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Serbian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Serbian/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Serbian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,25 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Serbian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sr/)\n" +"Language-Team: Serbian (http://www.transifex.com/projects/p/xbmc-main/language/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +msgctxt "#30002" +msgid "Streaming Port" +msgstr "Порт за проток садржаја" + msgctxt "#30003" msgid "Username" msgstr "Korisničko ime" @@ -25,6 +28,10 @@ msgid "Password" msgstr "Lozinka" +msgctxt "#30012" +msgid "Webinterface Port" +msgstr "Порт веб интерфејса" + msgctxt "#30018" msgid "General" msgstr "Opšte" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Serbian (Cyrillic)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Serbian (Cyrillic)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Serbian (Cyrillic)/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Serbian (Cyrillic)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Serbian (Cyrillic) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sr_RS/)\n" +"Language-Team: Serbian (Cyrillic) (http://www.transifex.com/projects/p/xbmc-main/language/sr_RS/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Slovak/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Slovak/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Slovak/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Slovak/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Slovak (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sk/)\n" +"Language-Team: Slovak (http://www.transifex.com/projects/p/xbmc-main/language/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "Obľúbená skupina TV programov" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Získať logá TV staníc z webového rozhrania" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "Odpojený od '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Slovenian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Slovenian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Slovenian/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Slovenian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Slovenian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sl/)\n" +"Language-Team: Slovenian (http://www.transifex.com/projects/p/xbmc-main/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -35,7 +34,7 @@ msgctxt "#30007" msgid "Response timeout in seconds" -msgstr "Najdaljši čas odgovora v sekundah" +msgstr "Čas preteka odgovora v sekundah" msgctxt "#30008" msgid "Icon Path" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "Skupina programov" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Prenesi ikone s spletnega vmesnika" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "Povezava prekinjena z '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Spanish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Spanish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Spanish/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Spanish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es/)\n" +"Language-Team: Spanish (http://www.transifex.com/projects/p/xbmc-main/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "TV-Bouquet" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Obtener picons de la interfaz web" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "Desconectado de '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Spanish (Argentina)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Spanish (Argentina)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Spanish (Argentina)/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Spanish (Argentina)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es_AR/)\n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/xbmc-main/language/es_AR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "TV-Bouquet" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Obtener picons de la interfaz web" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "Desconectado de '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Spanish (Mexico)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Spanish (Mexico)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Spanish (Mexico)/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Spanish (Mexico)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/es_MX/)\n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/xbmc-main/language/es_MX/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -32,3 +31,19 @@ msgctxt "#30019" msgid "Channels" msgstr "Canales" + +msgctxt "#30020" +msgid "Advanced" +msgstr "Avanzado" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Desconectado desde '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Reconectado a '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Swedish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Swedish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Swedish/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Swedish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Swedish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/sv/)\n" +"Language-Team: Swedish (http://www.transifex.com/projects/p/xbmc-main/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -109,6 +108,10 @@ msgid "TV-Bouquet" msgstr "TV-bukett" +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Använd picons från webinterfacet" + msgctxt "#30500" msgid "Disconnected from '%s'" msgstr "Frånkopplad från '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Tajik/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Tajik/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Tajik/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Tajik/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,53 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Tajik (http://www.transifex.com/projects/p/xbmc-main/language/tg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30003" +msgid "Username" +msgstr "Номи корбар" + +msgctxt "#30004" +msgid "Password" +msgstr "Парол" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Хотимаи вақти посух дар сонияҳо" + +msgctxt "#30018" +msgid "General" +msgstr "Умумӣ" + +msgctxt "#30019" +msgid "Channels" +msgstr "Шабакаҳо" + +msgctxt "#30020" +msgid "Advanced" +msgstr "Иловагӣ" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Пайваст бо '%s' қатъ шудааст" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Пайваст бо '%s' барқарор шудааст" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Tamil (India)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Tamil (India)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Tamil (India)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Tamil (India)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,121 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Tamil (India) (http://www.transifex.com/projects/p/xbmc-main/language/ta_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30000" +msgid "VU+ hostname or IP address" +msgstr "VU+ பின்தள புரவலன் பெயர் அல்லது ஐபி" + +msgctxt "#30002" +msgid "Streaming Port" +msgstr "துறை" + +msgctxt "#30003" +msgid "Username" +msgstr "பயனர்பெயர்" + +msgctxt "#30004" +msgid "Password" +msgstr "அடையாளச் சொல்" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "எத்தனை நொடியில் பதில் எதிபார்ப்பை முடித்தல்" + +msgctxt "#30008" +msgid "Icon Path" +msgstr "படவுரு பாதை" + +msgctxt "#30010" +msgid "Update Interval in minutes" +msgstr "இடைவெளியை நிமிடங்களில் புதுப்பிக்க" + +msgctxt "#30011" +msgid "Automatic Timerlist Cleanup" +msgstr "தானியங்கி டைமர் பட்டியல் துப்புரவு" + +msgctxt "#30012" +msgid "Webinterface Port" +msgstr "வலை இடைமுக முனையம்" + +msgctxt "#30013" +msgid "Zap before channelswitch (i.e. for Single Tuner boxes)" +msgstr "Channelswitch முன் Zap (அதாவது ஒற்றை வானொலி பெட்டிகலுக்காக)" + +msgctxt "#30014" +msgid "Folder for channeldata" +msgstr "சேனல் தரவு கோப்புறை" + +msgctxt "#30015" +msgid "Check for bouquett updates" +msgstr "Bouquett புதுப்பித்தல் எதாவது உள்ளத என்று பார்" + +msgctxt "#30016" +msgid "Check for channel updates" +msgstr "சேனல் புதுப்பித்தல் எதாவது உள்ளத என்று பார்" + +msgctxt "#30017" +msgid "Use only the DVB boxes' current recording path" +msgstr "DVB பெட்டிக்கான 'தற்போதைய பதிவு பாதை மட்டுமே பயன்படுத்த" + +msgctxt "#30018" +msgid "General" +msgstr "பொதுவானவை" + +msgctxt "#30019" +msgid "Channels" +msgstr "சேனல்கள்" + +msgctxt "#30020" +msgid "Advanced" +msgstr "மேம்பட்ட" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30022" +msgid "Recordings / Timer" +msgstr "பதிவகள் / நேரம்" + +msgctxt "#30023" +msgid "Recording folder on the receiver" +msgstr "அலைவாங்கியில் உள்ள பதிவு கோப்புறை" + +msgctxt "#30024" +msgid "Send DeepStandby-Command" +msgstr "ஆழ் காத்திரு கட்டளை அனுப்ப" + +msgctxt "#30025" +msgid "Fetch only one TV bouquet" +msgstr "ஒரே ஒரு தொலைக்காட்சி bouquet எடுக்க" + +msgctxt "#30026" +msgid "TV-Bouquet" +msgstr "தொலைக்காட்சி-Bouquet" + +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "இணைய இடைமுகத்திலிருந்து சின்னங்கள் எடுக்க" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "'%s' இருந்து துண்டிக்கப்பட்டது" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "'%s' க்கு மறுஇணைப்பு" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Telugu/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Telugu/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Telugu/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Telugu/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,29 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Telugu (http://www.transifex.com/projects/p/xbmc-main/language/te/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: te\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#30003" +msgid "Username" +msgstr "వాడుకరి పేరు" + +msgctxt "#30004" +msgid "Password" +msgstr "సంకేతపదం" + +msgctxt "#30018" +msgid "General" +msgstr "సాధారణం" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Thai/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Thai/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Thai/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Thai/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,16 +1,15 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Thai (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/th/)\n" +"Language-Team: Thai (http://www.transifex.com/projects/p/xbmc-main/language/th/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -32,3 +31,11 @@ msgctxt "#30019" msgid "Channels" msgstr "ช่องสัญญาณ" + +msgctxt "#30020" +msgid "Advanced" +msgstr "ขั้นสูง" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Turkish/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Turkish/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Turkish/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Turkish/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,25 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Turkish (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/tr/)\n" +"Language-Team: Turkish (http://www.transifex.com/projects/p/xbmc-main/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=1; plural=0;\n" +msgctxt "#30002" +msgid "Streaming Port" +msgstr "Yayın Portu" + msgctxt "#30003" msgid "Username" msgstr "Kullanıcı adı" @@ -25,6 +28,26 @@ msgid "Password" msgstr "Parola" +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Saniye cinsinden yanıt zaman aşımı süresi" + +msgctxt "#30008" +msgid "Icon Path" +msgstr "Simge Yolu" + +msgctxt "#30012" +msgid "Webinterface Port" +msgstr "Web arayüzü Portu" + +msgctxt "#30014" +msgid "Folder for channeldata" +msgstr "Kanal verisi için klasör" + +msgctxt "#30016" +msgid "Check for channel updates" +msgstr "Kanal güncelleştirmelerini denetle" + msgctxt "#30018" msgid "General" msgstr "Genel" @@ -32,3 +55,19 @@ msgctxt "#30019" msgid "Channels" msgstr "Kanallar" + +msgctxt "#30020" +msgid "Advanced" +msgstr "Gelişmiş" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "'%s' Bağlantı kesilecek" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Tekrar bağlanmaya '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Ukrainian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Ukrainian/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Ukrainian/strings.po 2013-02-16 21:46:33.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Ukrainian/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -1,22 +1,29 @@ # XBMC Media Center language file # Addon Name: VU+ / Enigma2 Client # Addon id: pvr.vuplus -# Addon version: 1.6.6 # Addon Provider: Joerg Dembski msgid "" msgstr "" -"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Project-Id-Version: XBMC Main\n" "Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: XBMC Translation Team\n" -"Language-Team: Ukrainian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/uk/)\n" +"Language-Team: Ukrainian (http://www.transifex.com/projects/p/xbmc-main/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +msgctxt "#30000" +msgid "VU+ hostname or IP address" +msgstr "Сервер VU+ або адреса IP" + +msgctxt "#30002" +msgid "Streaming Port" +msgstr "Порт потоку" + msgctxt "#30003" msgid "Username" msgstr "Ім'я користувача" @@ -25,6 +32,90 @@ msgid "Password" msgstr "Пароль" +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Затримка відклику в секундах" + +msgctxt "#30008" +msgid "Icon Path" +msgstr "Шлях до іконки" + +msgctxt "#30010" +msgid "Update Interval in minutes" +msgstr "Інтервал оновлення в хвилинах" + +msgctxt "#30011" +msgid "Automatic Timerlist Cleanup" +msgstr "Автоматичне очищення списку таймерів" + +msgctxt "#30012" +msgid "Webinterface Port" +msgstr "Порт веб-інтерфейсу" + +msgctxt "#30013" +msgid "Zap before channelswitch (i.e. for Single Tuner boxes)" +msgstr "Схопити сигнал перед переключенням каналу (тобто для одного тюнера)" + +msgctxt "#30014" +msgid "Folder for channeldata" +msgstr "Тека для даних каналів" + +msgctxt "#30015" +msgid "Check for bouquett updates" +msgstr "Перевірка на букетне оновлення " + +msgctxt "#30016" +msgid "Check for channel updates" +msgstr "Перевірка оновлення каналів" + +msgctxt "#30017" +msgid "Use only the DVB boxes' current recording path" +msgstr "Використовувати тільки поточний шлях запису з DVB пристрою" + msgctxt "#30018" msgid "General" msgstr "Загальні" + +msgctxt "#30019" +msgid "Channels" +msgstr "Канали" + +msgctxt "#30020" +msgid "Advanced" +msgstr "Більше" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30022" +msgid "Recordings / Timer" +msgstr "Запис / Таймер" + +msgctxt "#30023" +msgid "Recording folder on the receiver" +msgstr "Тека записів на ресівері" + +msgctxt "#30024" +msgid "Send DeepStandby-Command" +msgstr "Вислати команду глибокої зупинки" + +msgctxt "#30025" +msgid "Fetch only one TV bouquet" +msgstr "Отримати тільки один TV bouquet" + +msgctxt "#30026" +msgid "TV-Bouquet" +msgstr "TV-Bouquet" + +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Отримати пікони з веб-інтерфейсу" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Від’єднано від '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Знову з’єднано з '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Uzbek/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Uzbek/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Uzbek/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Uzbek/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,33 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Uzbek (http://www.transifex.com/projects/p/xbmc-main/language/uz/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uz\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30003" +msgid "Username" +msgstr "Foydalanuvchi nomi" + +msgctxt "#30004" +msgid "Password" +msgstr "Maxfiy so'z" + +msgctxt "#30018" +msgid "General" +msgstr "Umumiy" + +msgctxt "#30019" +msgid "Channels" +msgstr "Kanallar" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Vietnamese/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Vietnamese/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Vietnamese/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Vietnamese/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,121 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Vietnamese (http://www.transifex.com/projects/p/xbmc-main/language/vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30000" +msgid "VU+ hostname or IP address" +msgstr "Tên miền hoặc địa chỉ IP của VU+" + +msgctxt "#30002" +msgid "Streaming Port" +msgstr "Cổng Streaming" + +msgctxt "#30003" +msgid "Username" +msgstr "Tên truy cập" + +msgctxt "#30004" +msgid "Password" +msgstr "Mật khẩu" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Số giây tự ngắt chờ kết nối" + +msgctxt "#30008" +msgid "Icon Path" +msgstr "Đường dẫn biểu tượng" + +msgctxt "#30010" +msgid "Update Interval in minutes" +msgstr "Số phút tự cập nhật lại" + +msgctxt "#30011" +msgid "Automatic Timerlist Cleanup" +msgstr "Tự động xoá danh sách hẹn giờ" + +msgctxt "#30012" +msgid "Webinterface Port" +msgstr "Cổng Webinterface" + +msgctxt "#30013" +msgid "Zap before channelswitch (i.e. for Single Tuner boxes)" +msgstr "Tắt trước khi chuyển kênh (ví dụ cho các Single Tuner box)" + +msgctxt "#30014" +msgid "Folder for channeldata" +msgstr "Thư mục đặt dữ liệu cho kênh" + +msgctxt "#30015" +msgid "Check for bouquett updates" +msgstr "Kiểm tra cập nhật bouquett" + +msgctxt "#30016" +msgid "Check for channel updates" +msgstr "Kiểm tra cập nhật kênh" + +msgctxt "#30017" +msgid "Use only the DVB boxes' current recording path" +msgstr "Chỉ sử dụng đương dẫn lưu hiện tại của DVB box" + +msgctxt "#30018" +msgid "General" +msgstr "Tổng Quan" + +msgctxt "#30019" +msgid "Channels" +msgstr "Kênh" + +msgctxt "#30020" +msgid "Advanced" +msgstr "Nâng cao" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30022" +msgid "Recordings / Timer" +msgstr "Thu / Hẹn giờ" + +msgctxt "#30023" +msgid "Recording folder on the receiver" +msgstr "Thư mục lưu trên thiết bị" + +msgctxt "#30024" +msgid "Send DeepStandby-Command" +msgstr "Gửi lệnh Chế Độ Chờ" + +msgctxt "#30025" +msgid "Fetch only one TV bouquet" +msgstr "Chỉ lấy một TV bouquet" + +msgctxt "#30026" +msgid "TV-Bouquet" +msgstr "TV-Bouquet" + +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Lấy các hình icon từ mạng" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Đã ngắt kết nối từ '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Đã kết nối lại tới '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Vietnamese (Viet Nam)/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Vietnamese (Viet Nam)/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Vietnamese (Viet Nam)/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Vietnamese (Viet Nam)/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,33 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/projects/p/xbmc-main/language/vi_VN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi_VN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#30004" +msgid "Password" +msgstr "Mật khẩu" + +msgctxt "#30018" +msgid "General" +msgstr "Chung" + +msgctxt "#30019" +msgid "Channels" +msgstr "Kênh" + +msgctxt "#30020" +msgid "Advanced" +msgstr "Nâng ca" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Welsh/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Welsh/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/language/Welsh/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/language/Welsh/strings.po 2014-05-04 06:40:43.000000000 +0000 @@ -0,0 +1,121 @@ +# XBMC Media Center language file +# Addon Name: VU+ / Enigma2 Client +# Addon id: pvr.vuplus +# Addon Provider: Joerg Dembski +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: Welsh (http://www.transifex.com/projects/p/xbmc-main/language/cy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" + +msgctxt "#30000" +msgid "VU+ hostname or IP address" +msgstr "Enw gwesteiwr neu gyfeiriad IP VU+" + +msgctxt "#30002" +msgid "Streaming Port" +msgstr "Porth Ffrydio" + +msgctxt "#30003" +msgid "Username" +msgstr "Enw defnyddiwr" + +msgctxt "#30004" +msgid "Password" +msgstr "Cyfrinair" + +msgctxt "#30007" +msgid "Response timeout in seconds" +msgstr "Ymateb amser allan mewn eiliadau" + +msgctxt "#30008" +msgid "Icon Path" +msgstr "Llwybr Eiconau" + +msgctxt "#30010" +msgid "Update Interval in minutes" +msgstr "Cyfnod diweddaru mewn munudau" + +msgctxt "#30011" +msgid "Automatic Timerlist Cleanup" +msgstr "Glanhau Amserlen yn Awtomatig" + +msgctxt "#30012" +msgid "Webinterface Port" +msgstr "Porth Rhyngwyneb Gwe" + +msgctxt "#30013" +msgid "Zap before channelswitch (i.e. for Single Tuner boxes)" +msgstr "Sapio cyn newid sianel (h.y. ar gyfer blychau Tiwniwr Unigol)" + +msgctxt "#30014" +msgid "Folder for channeldata" +msgstr "Ffolder ar gyfer data sianel" + +msgctxt "#30015" +msgid "Check for bouquett updates" +msgstr "Gwirio am ddiweddariad bouquett" + +msgctxt "#30016" +msgid "Check for channel updates" +msgstr "Gwirio am ddiweddariad sianeli" + +msgctxt "#30017" +msgid "Use only the DVB boxes' current recording path" +msgstr "Defnyddio llwybr recordio cyfredol y blwch DVB" + +msgctxt "#30018" +msgid "General" +msgstr "Cyffredinol" + +msgctxt "#30019" +msgid "Channels" +msgstr "Sianeli" + +msgctxt "#30020" +msgid "Advanced" +msgstr "Uwch" + +msgctxt "#30021" +msgid "HTTP" +msgstr "HTTP" + +msgctxt "#30022" +msgid "Recordings / Timer" +msgstr "Recordiadau / Amserydd" + +msgctxt "#30023" +msgid "Recording folder on the receiver" +msgstr "Ffolder recordio ar y derbynnydd" + +msgctxt "#30024" +msgid "Send DeepStandby-Command" +msgstr "Anfon DeepStandby-Command" + +msgctxt "#30025" +msgid "Fetch only one TV bouquet" +msgstr "Estyn dim ond un bouquet Teledu" + +msgctxt "#30026" +msgid "TV-Bouquet" +msgstr "TV-Bouquet" + +msgctxt "#30027" +msgid "Fetch picons from webinterface" +msgstr "Estyn piconau o'r rhyngwyneb gwe" + +msgctxt "#30500" +msgid "Disconnected from '%s'" +msgstr "Datgysylltwyd o '%s'" + +msgctxt "#30501" +msgid "Reconnected to '%s'" +msgstr "Ail gysylltwyd â '%s'" diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/settings.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/settings.xml --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/addon/resources/settings.xml 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/addon/resources/settings.xml 2014-01-04 10:28:12.000000000 +0000 @@ -4,7 +4,7 @@ - + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/Makefile.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/Makefile.am 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/Makefile.am 2014-01-04 10:28:12.000000000 +0000 @@ -10,7 +10,7 @@ LIBNAME = libvuplus-addon lib_LTLIBRARIES = libvuplus-addon.la -LIBS = @abs_top_builddir@/lib/tinyxml/libtinyxml.la +LIBS = @abs_top_srcdir@/lib/tinyxml/libtinyxml.la include ../Makefile.include.am diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/src/client.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/src/client.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/src/client.cpp 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/src/client.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -327,6 +327,10 @@ { } +void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +{ +} + /*********************************************************** * PVR Client AddOn specific public library functions ***********************************************************/ @@ -343,6 +347,18 @@ return strMinApiVersion; } +const char* GetGUIAPIVersion(void) +{ + static const char *strGuiApiVersion = XBMC_GUI_API_VERSION; + return strGuiApiVersion; +} + +const char* GetMininumGUIAPIVersion(void) +{ + static const char *strMinGuiApiVersion = XBMC_GUI_MIN_API_VERSION; + return strMinGuiApiVersion; +} + PVR_ERROR GetAddonCapabilities(PVR_ADDON_CAPABILITIES* pCapabilities) { pCapabilities->bSupportsEPG = true; @@ -569,7 +585,7 @@ void DemuxAbort(void) { return; } DemuxPacket* DemuxRead(void) { return NULL; } PVR_ERROR DialogChannelScan(void) { return PVR_ERROR_NOT_IMPLEMENTED; } -PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook) { return PVR_ERROR_NOT_IMPLEMENTED; } +PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_MENUHOOK_DATA &item) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR DeleteChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR RenameChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR MoveChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } @@ -588,10 +604,14 @@ long long PositionLiveStream(void) { return -1; } long long LengthLiveStream(void) { return -1; } PVR_ERROR SetRecordingPlayCount(const PVR_RECORDING &recording, int count) { return PVR_ERROR_NOT_IMPLEMENTED; } +PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY[], int*) { return PVR_ERROR_NOT_IMPLEMENTED; }; unsigned int GetChannelSwitchDelay(void) { return 0; } void PauseStream(bool bPaused) {} bool CanPauseStream(void) { return false; } bool CanSeekStream(void) { return false; } bool SeekTime(int,bool,double*) { return false; } void SetSpeed(int) {}; +time_t GetPlayingTime() { return 0; } +time_t GetBufferTimeStart() { return 0; } +time_t GetBufferTimeEnd() { return 0; } } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/src/client.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/src/client.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/src/client.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/src/client.h 2014-01-04 10:28:12.000000000 +0000 @@ -22,6 +22,7 @@ #include "libXBMC_addon.h" #include "libXBMC_pvr.h" +#include "libXBMC_gui.h" #define DEFAULT_HOST "127.0.0.1" #define DEFAULT_CONNECT_TIMEOUT 30 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/src/VuData.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/src/VuData.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.vuplus/src/VuData.cpp 2013-03-12 10:51:22.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.vuplus/src/VuData.cpp 2014-01-04 10:28:19.000000000 +0000 @@ -24,7 +24,7 @@ std::string& Vu::Escape(std::string &s, std::string from, std::string to) { - int pos = -1; + std::string::size_type pos = -1; while ( (pos = s.find(from, pos+1) ) != std::string::npos) s.erase(pos, from.length()).insert(pos, to); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/addon/addon.xml.in xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/addon/addon.xml.in --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/addon/addon.xml.in 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/addon/addon.xml.in 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,25 @@ + + + + + + + + + WMC PVR Client + An xbmc client to interface to Windows Media Center's record and EPG service. Thanks to JeffreyF, Tomba73, Riztnack, Staknhalo, Scarecrow420, Hoopsdavis, TheImmortal. Special thanks to DBurckh. + This is experimental software. Use at your own risk. + @OS@ + + Binary files /tmp/1FTPYs_Qq_/xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/addon/icon.png and /tmp/njK1ftphDV/xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/addon/icon.png differ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/addon/resources/language/English/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/addon/resources/language/English/strings.po --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/addon/resources/language/English/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/addon/resources/language/English/strings.po 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,166 @@ +# XBMC Media Center language file +# Addon Name: WMC PVR Client +# Addon id: pvr.wmc +# Addon version: 1.0.0 +# Addon Provider: V. Da Costa +msgid "" +msgstr "" +"Project-Id-Version: XBMC Main Translation Project (Frodo)\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: XBMC Translation Team\n" +"Language-Team: English (http://www.transifex.com/projects/p/XBMC-Main-Frodo/language/en/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +# Settings labels + +msgctxt "#30000" +msgid "Server Hostname or IP" +msgstr "" + +msgctxt "#30001" +msgid "Keep IP address to 127.0.0.1, if server is running on this same system" +msgstr "" + +msgctxt "#30002" +msgid "Port Number" +msgstr "" + +msgctxt "#30003" +msgid "Stream timeout, unknown problem" +msgstr "" + +msgctxt "#30004" +msgid "No video data found on this channel" +msgstr "" + +msgctxt "#30005" +msgid "Tuner is needed for recording" +msgstr "" + + +msgctxt "#30006" +msgid "Recording delete failed, file in use or write protected" +msgstr "" + +msgctxt "#30007" +msgid "Recording delete failed, recorded file doesn't exist" +msgstr "" + +msgctxt "#30008" +msgid "Recording file not found" +msgstr "" + +msgctxt "#30009" +msgid "Alternate channel chosen: " +msgstr "" + +msgctxt "#30010" +msgid "Alternate time chosen: " +msgstr "" + +msgctxt "#30011" +msgid "Can't start, tuner is no longer available" +msgstr "" + +msgctxt "#30012" +msgid "Channel content is protected" +msgstr "" + +msgctxt "#30013" +msgid "End time increased by " +msgstr "" + +msgctxt "#30014" +msgid "Enable SignalStatus calls" +msgstr "" + +msgctxt "#30015" +msgid "Refresh SignalStatus Interval (sec)" +msgstr "" + +msgctxt "#30016" +msgid "Store viewing resume times on server" +msgstr "" + +msgctxt "#30020" +msgid "All tuners for this channel are busy" +msgstr "" + +msgctxt "#30021" +msgid "LiveTV timed-out" +msgstr "" + +msgctxt "#30022" +msgid "LiveTV error, exited early" +msgstr "" + +msgctxt "#30023" +msgid "Recording stream timed-out" +msgstr "" + +msgctxt "#30024" +msgid "Recording stream exited early" +msgstr "" + +msgctxt "#30100" +msgid "Recording Preference" +msgstr "" + +msgctxt "#30101" +msgid "Record this episode only" +msgstr "" + +msgctxt "#30102" +msgid "Record the series" +msgstr "" + +msgctxt "#30103" +msgid "Show type:" +msgstr "" + +msgctxt "#30104" +msgid "New and rerun" +msgstr "" + +msgctxt "#30105" +msgid "New only" +msgstr "" + +msgctxt "#30106" +msgid "Live only" +msgstr "" + +msgctxt "#30107" +msgid "Channel:" +msgstr "" + +msgctxt "#30108" +msgid "Any Channel" +msgstr "" + +msgctxt "#30110" +msgid "Airtime:" +msgstr "" + +msgctxt "#30111" +msgid "Anytime" +msgstr "" + + +msgctxt "#30120" +msgid "Delete Timer" +msgstr "" + +msgctxt "#30121" +msgid "Delete this episode timer only" +msgstr "" + +msgctxt "#30122" +msgid "Delete the entire series" +msgstr "" \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/addon/resources/settings.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/addon/resources/settings.xml --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/addon/resources/settings.xml 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/addon/resources/settings.xml 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,8 @@ + + + + + + + + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/addon/resources/skins/skin.confluence/720p/DeleteTimer.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/addon/resources/skins/skin.confluence/720p/DeleteTimer.xml --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/addon/resources/skins/skin.confluence/720p/DeleteTimer.xml 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/addon/resources/skins/skin.confluence/720p/DeleteTimer.xml 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,153 @@ + + 10 + + 1 + 240 + 100 + + dialogeffect + + + background image + 0 + 0 + 800 + 300 + DialogBack.png + + + Dialog Header image + 40 + 16 + 720 + 40 + dialogheader.png + + + header label + 40 + 20 + 720 + 30 + font13_title + + center + center + selected + black + + + Close Window button + 710 + 15 + 64 + 32 + + - + + DialogCloseButton-focus.png + DialogCloseButton.png + 10 + 10 + 10 + 10 + system.getbool(input.enablemouse) + + + + + 40 + 60 + 720 + 30 + font13_title + + left + center + white + + + + + 40 + 100 + 720 + 100 + + episode recording + 0 + 0 + 40 + 720 + + font13 + grey2 + white + button-nofocus.png + button-focus2.png + 10 + 10 + 1 + 11 + + + + series recording + 0 + 45 + 40 + 720 + + font13 + grey2 + white + button-nofocus.png + button-focus2.png + 11 + 11 + 10 + 2 + + + + + 190 + 235 + + Ok Button + 0 + 0 + 200 + 40 + center + center + button-nofocus.png + button-focus.png + + font12_title + 11 + 2 + 2 + 10 + + + Cancel Button + 210 + 0 + 200 + 40 + center + center + button-nofocus.png + button-focus.png + + font12_title + 11 + 1 + 1 + 10 + + + + + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/addon/resources/skins/skin.confluence/720p/RecordPrefs.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/addon/resources/skins/skin.confluence/720p/RecordPrefs.xml --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/addon/resources/skins/skin.confluence/720p/RecordPrefs.xml 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/addon/resources/skins/skin.confluence/720p/RecordPrefs.xml 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,213 @@ + + 10 + + 1 + 240 + 100 + + dialogeffect + + + background image + 0 + 0 + 800 + 500 + DialogBack.png + + + Dialog Header image + 40 + 16 + 720 + 40 + dialogheader.png + + + header label + 40 + 20 + 720 + 30 + font13_title + + center + center + selected + black + + + Close Window button + 710 + 15 + 64 + 32 + + - + + DialogCloseButton-focus.png + DialogCloseButton.png + 10 + 10 + 10 + 10 + system.getbool(input.enablemouse) + + + + + 40 + 60 + 720 + 30 + font13_title + + left + center + white + + + + + 40 + 100 + 720 + 100 + + episode recording + 0 + 0 + 40 + 720 + + font13 + grey2 + white + button-nofocus.png + button-focus2.png + 10 + 10 + 1 + 11 + + + + series recording + 0 + 45 + 40 + 720 + + font13 + grey2 + white + button-nofocus.png + button-focus2.png + 11 + 11 + 10 + 12 + + + + + 340 + 190 + 420 + 150 + + series runtype + 0 + 0 + 420 + 40 + font13 + grey2 + white + button-nofocus.png + button-focus2.png + + 12 + 12 + 10 + 13 + + + + channel series choice + 0 + 45 + 420 + 40 + font13 + grey2 + white + button-nofocus.png + button-focus2.png + + 13 + 13 + 12 + 14 + + + + airtime series choice + 0 + 90 + 420 + 40 + font13 + grey2 + white + button-nofocus.png + button-focus2.png + + 14 + 14 + 13 + 1 + + + + + 190 + 435 + + Ok Button + 0 + 0 + 200 + 40 + center + center + button-nofocus.png + button-focus.png + + font12_title + 14 + 2 + 2 + 10 + + + Cancel Button + 210 + 0 + 200 + 40 + center + center + button-nofocus.png + button-focus.png + + font12_title + 14 + 1 + 1 + 10 + + + + + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/.gitignore xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/.gitignore --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/.gitignore 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/.gitignore 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,59 @@ +syntax: glob +src/sav/** +addon/addon.xml + +addon/XBMC_WMC.pvr +addon/XBMC_WMC_win32.dll +addon/XBMC_WMC_win32.exp +addon/libXBMC_WMC.so + +.deps/** +.libs/** +libpvrwmc-addon.la +Makefile +Makefile.in +*.tmp +*.obj +*.pdb +*.user +*.aps +*.pch +*.vspscc +*.vssscc +*_i.c +*_p.c +*.ncb +*.suo +*.sdf +*.tlb +*.tlh +*.bak +*.[Cc]ache +*.ilk +*.log +*.lib +*.sbr +*.scc +*.DotSettings +*.lo +*.o +*.tlog +*.idb +*.lastbuildstate +*.intermediate.manifest +[Bb]in +[Dd]ebug*/** +obj/ +[Rr]elease*/** +_ReSharper*/** +NDependOut/** +packages/** +[Tt]humbs.db +[Tt]est[Rr]esult* +[Bb]uild[Ll]og.* +*.[Pp]ublish.xml +ipch/** +*.resharper +*.ncrunch* +*.ndproj +*.csproj.user \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/Makefile.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/Makefile.am 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,24 @@ +# +# Makefile for the PVR Windows Media Center add-on for XBMC PVR +# +# See the README for copyright information and +# how to reach the author. +# + +ADDONBINNAME = XBMC_WMC +ADDONNAME = pvr.wmc +LIBNAME = libpvrwmc-addon +lib_LTLIBRARIES = libpvrwmc-addon.la + +LIBS = @abs_top_srcdir@/lib/tinyxml/libtinyxml.la + +include ../Makefile.include.am + +libpvrwmc_addon_la_SOURCES = src/DialogDeleteTimer.cpp \ + src/DialogRecordPref.cpp \ + src/client.cpp \ + src/pvr2wmc.cpp \ + src/Socket.cpp \ + src/utilities.cpp +libpvrwmc_addon_la_LDFLAGS = @TARGET_LDFLAGS@ + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/project/VS2010Express/pvrclient_wmc.vcxproj xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/project/VS2010Express/pvrclient_wmc.vcxproj --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/project/VS2010Express/pvrclient_wmc.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/project/VS2010Express/pvrclient_wmc.vcxproj 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,129 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {6834B003-2511-4745-818D-F418E87DD941} + pvr.wmc + pvr.wmc + + + + DynamicLibrary + true + MultiByte + + + DynamicLibrary + false + true + MultiByte + + + + + + + + + + + + + ..\..\addon\ + + + XBMC_WMC_win32 + + + ..\..\addon\ + + + XBMC_WMC_win32 + + + + Level3 + Disabled + ..\..\..\..\xbmc;..\..\..\..\lib;..\..\..\..\lib\platform\windows + _WINDLL;TARGET_WINDOWS;_CRT_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;_WINSOCKAPI_;%(PreprocessorDefinitions) + MultiThreadedDebug + + + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies) + LinkVerbose + + + + + + + + + + Level3 + MaxSpeed + true + true + ..\..\..\..\xbmc;..\..\..\..\lib;..\..\..\..\lib\platform\windows + _WINDLL;TARGET_WINDOWS;_CRT_SECURE_NO_WARNINGS;_USE_32BIT_TIME_T;_WINSOCKAPI_;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + + {fe4573f6-a794-4ad3-b37f-49e51f1140e6} + + + {bdc7d21d-9fd9-41aa-bec8-8b70e1448c50} + + + + + Designer + + + + + Designer + + + Designer + + + + + + \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/project/VS2010Express/pvrclient_wmc.vcxproj.filters xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/project/VS2010Express/pvrclient_wmc.vcxproj.filters --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/project/VS2010Express/pvrclient_wmc.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/project/VS2010Express/pvrclient_wmc.vcxproj.filters 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,67 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Source Files + + + + + + + + + + \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/client.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/client.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/client.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/client.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,660 @@ +/* +* Copyright (C) 2011 Pulse-Eight +* http://www.pulse-eight.com/ +* +* This Program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2, or (at your option) +* any later version. +* +* This Program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with XBMC; see the file COPYING. If not, write to +* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. +* http://www.gnu.org/copyleft/gpl.html +* +*/ + +#include "client.h" +#include "xbmc_pvr_dll.h" +#include "pvr2wmc.h" +#include "platform/util/util.h" + +using namespace std; +using namespace ADDON; + +#ifdef TARGET_WINDOWS +#define snprintf _snprintf +#endif + +#define DEFAULT_PORT 9080 +#define DEFAULT_SIGNAL_ENABLE false +#define DEFAULT_SIGNAL_THROTTLE 10 +#define DEFAULT_MULTI_RESUME true + +Pvr2Wmc* _wmc = NULL; +bool _bCreated = false; +ADDON_STATUS _CurStatus = ADDON_STATUS_UNKNOWN; +bool _bIsPlaying = false; +PVR_CHANNEL _currentChannel; +PVR_MENUHOOK *menuHook = NULL; + +CStdString g_strServerName; // the name of the server to connect to +CStdString g_strClientName; // the name of the computer running addon +int g_port; +bool g_bSignalEnable; +int g_signalThrottle; +bool g_bEnableMultiResume; +CStdString g_clientOS; // OS of client, passed to server + +/* User adjustable settings are saved here. +* Default values are defined inside client.h +* and exported to the other source files. +*/ +CStdString g_strUserPath = ""; +CStdString g_strClientPath = ""; + +CHelper_libXBMC_addon *XBMC = NULL; +CHelper_libXBMC_pvr *PVR = NULL; +CHelper_libXBMC_gui *GUI = NULL; + +#define LOCALHOST "127.0.0.1" + +extern "C" { + + void ADDON_ReadSettings(void) // todo: get settings for real + { + char buffer[512]; + + if (!XBMC) + return; + + g_strServerName = LOCALHOST; // either "mediaserver" OR "." / "127.0.0.1" + g_port = DEFAULT_PORT; + g_bSignalEnable = DEFAULT_SIGNAL_ENABLE; + g_signalThrottle = DEFAULT_SIGNAL_THROTTLE; + g_bEnableMultiResume = DEFAULT_MULTI_RESUME; + + /* Read setting "port" from settings.xml */ + if (!XBMC->GetSetting("port", &g_port)) + { + XBMC->Log(LOG_ERROR, "Couldn't get 'port' setting, using '%i'", DEFAULT_PORT); + } + + if (XBMC->GetSetting("host", &buffer)) + { + g_strServerName = buffer; + XBMC->Log(LOG_DEBUG, "Settings: host='%s', port=%i", g_strServerName.c_str(), g_port); + } + else + { + XBMC->Log(LOG_ERROR, "Couldn't get 'host' setting, using '127.0.0.1'"); + } + + if (!XBMC->GetSetting("signal", &g_bSignalEnable)) + { + XBMC->Log(LOG_ERROR, "Couldn't get 'signal' setting, using '%s'", DEFAULT_SIGNAL_ENABLE); + } + + if (!XBMC->GetSetting("signal_throttle", &g_signalThrottle)) + { + XBMC->Log(LOG_ERROR, "Couldn't get 'signal_throttle' setting, using '%s'", DEFAULT_SIGNAL_THROTTLE); + } + + if (!XBMC->GetSetting("multiResume", &g_bEnableMultiResume)) + { + XBMC->Log(LOG_ERROR, "Couldn't get 'multiResume' setting, using '%s'", DEFAULT_MULTI_RESUME); + } + + + // get the name of the computer client is running on +#ifdef TARGET_WINDOWS + gethostname(buffer, 50); + g_strClientName = buffer; // send this computers name to server + + // get windows version + OSVERSIONINFO osvi; + ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&osvi); + g_clientOS.Format("windows(%d.%d)", osvi.dwMajorVersion, osvi.dwMinorVersion); // set windows version string +#else + g_strClientName = ""; // empty string signals to server to display the IP address + g_clientOS = ""; // set to the client OS name +#endif + } + + // create this addon (called by xbmc) + ADDON_STATUS ADDON_Create(void* hdl, void* props) + { + if (!hdl || !props) + return ADDON_STATUS_UNKNOWN; + + PVR_PROPERTIES* pvrprops = (PVR_PROPERTIES*)props; + + // register the addon + XBMC = new CHelper_libXBMC_addon; + if (!XBMC->RegisterMe(hdl)) + { + SAFE_DELETE(XBMC); + return ADDON_STATUS_PERMANENT_FAILURE; + } + + // register gui + GUI = new CHelper_libXBMC_gui; + if (!GUI->RegisterMe(hdl)) + { + SAFE_DELETE(GUI); + SAFE_DELETE(XBMC); + return ADDON_STATUS_PERMANENT_FAILURE; + } + + // register as pvr + PVR = new CHelper_libXBMC_pvr; + if (!PVR->RegisterMe(hdl)) + { + SAFE_DELETE(PVR); + SAFE_DELETE(GUI); + SAFE_DELETE(XBMC); + return ADDON_STATUS_PERMANENT_FAILURE; + } + + XBMC->Log(LOG_DEBUG, "%s - Creating the PVR-WMC add-on", __FUNCTION__); + + _CurStatus = ADDON_STATUS_UNKNOWN; + g_strUserPath = pvrprops->strUserPath; + g_strClientPath = pvrprops->strClientPath; + + ADDON_ReadSettings(); + + _wmc = new Pvr2Wmc; // create interface to ServerWMC + if (_wmc->IsServerDown()) // check if server is down, if it is shut her down + { + SAFE_DELETE(_wmc); + SAFE_DELETE(PVR); + SAFE_DELETE(GUI); + SAFE_DELETE(XBMC); + _CurStatus = ADDON_STATUS_LOST_CONNECTION; + } + else + { + _bCreated = true; + _CurStatus = ADDON_STATUS_OK; + + } + return _CurStatus; + } + + // get status of addon's interface to wmc server + ADDON_STATUS ADDON_GetStatus() + { + // check whether we're still connected + if (_CurStatus == ADDON_STATUS_OK) + { + if (_wmc == NULL) + _CurStatus = ADDON_STATUS_LOST_CONNECTION; + else if (_wmc->IsServerDown()) + _CurStatus = ADDON_STATUS_LOST_CONNECTION; + } + + return _CurStatus; + } + + void ADDON_Destroy() + { + if (_wmc) + _wmc->UnLoading(); + SAFE_DELETE(PVR); + SAFE_DELETE(GUI); + _bCreated = false; + _CurStatus = ADDON_STATUS_UNKNOWN; + } + + bool ADDON_HasSettings() + { + return true; + } + + unsigned int ADDON_GetSettings(ADDON_StructSetting ***sSet) + { + return 0; + } + + // Called everytime a setting is changed by the user and to inform AddOn about + // new setting and to do required stuff to apply it. + ADDON_STATUS ADDON_SetSetting(const char *settingName, const void *settingValue) + { + if (!XBMC) + return ADDON_STATUS_OK; + + CStdString sName = settingName; + + if (sName == "host") + { + CStdString oldName = g_strServerName; + g_strServerName = (const char*)settingValue; + //if (g_strServerName == ".") + // g_strServerName = LOCALHOST; + XBMC->Log(LOG_INFO, "Setting 'host' changed from %s to %s", g_strServerName.c_str(), (const char*) settingValue); + if (oldName != g_strServerName) + return ADDON_STATUS_NEED_RESTART; + } + + return ADDON_STATUS_OK; + } + + void ADDON_Stop() + { + } + + void ADDON_FreeSettings() + { + } + + void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) + { + } + + /*********************************************************** + * PVR Client AddOn specific public library functions + ***********************************************************/ + + const char* GetPVRAPIVersion(void) + { + static const char *strApiVersion = XBMC_PVR_API_VERSION; + return strApiVersion; + } + + const char* GetMininumPVRAPIVersion(void) + { + static const char *strMinApiVersion = XBMC_PVR_MIN_API_VERSION; + return strMinApiVersion; + } + + const char* GetGUIAPIVersion(void) + { + static const char *strGuiApiVersion = XBMC_GUI_API_VERSION; + return strGuiApiVersion; + } + + const char* GetMininumGUIAPIVersion(void) + { + static const char *strMinGuiApiVersion = XBMC_GUI_MIN_API_VERSION; + return strMinGuiApiVersion; + } + + PVR_ERROR GetAddonCapabilities(PVR_ADDON_CAPABILITIES* pCapabilities) + { + pCapabilities->bSupportsEPG = true; + pCapabilities->bSupportsRecordings = true; + pCapabilities->bSupportsTimers = true; + pCapabilities->bSupportsTV = true; + pCapabilities->bSupportsRadio = false; + pCapabilities->bSupportsChannelGroups = true; + pCapabilities->bHandlesInputStream = true; + pCapabilities->bHandlesDemuxing = false; + pCapabilities->bSupportsChannelScan = false; + pCapabilities->bSupportsLastPlayedPosition = g_bEnableMultiResume; + + return PVR_ERROR_NO_ERROR; + } + + const char *GetBackendName(void) + { + static const char *strBackendName = "ServerWMC"; + return strBackendName; + } + + const char *GetBackendVersion(void) + { + if (_wmc) + return _wmc->GetBackendVersion(); + else + return "0.0"; + } + + const char *GetConnectionString(void) + { + static CStdString strConnectionString = "connected"; + return strConnectionString.c_str(); + } + + PVR_ERROR GetDriveSpace(long long *iTotal, long long *iUsed) + { + *iTotal = 1024 * 1024 * 1024; + *iUsed = 0; + return PVR_ERROR_NO_ERROR; + } + + PVR_ERROR GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart, time_t iEnd) + { + if (_wmc) + return _wmc->GetEPGForChannel(handle, channel, iStart, iEnd); + + return PVR_ERROR_SERVER_ERROR; + } + + int GetCurrentClientChannel(void) + { + return _currentChannel.iUniqueId; + } + + PVR_ERROR GetStreamProperties(PVR_STREAM_PROPERTIES* pProperties) + { + return PVR_ERROR_NOT_IMPLEMENTED; + } + + PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS &signalStatus) + { + if (_wmc) + return _wmc->SignalStatus(signalStatus); + + return PVR_ERROR_NO_ERROR; + } + + // channel functions + int GetChannelsAmount(void) + { + if (_wmc) + return _wmc->GetChannelsAmount(); + + return -1; + } + + PVR_ERROR GetChannels(ADDON_HANDLE handle, bool bRadio) + { + if (_wmc) + return _wmc->GetChannels(handle, bRadio); + + return PVR_ERROR_SERVER_ERROR; + } + + int GetChannelGroupsAmount(void) + { + if (_wmc) + return _wmc->GetChannelGroupsAmount(); + + return -1; + } + + PVR_ERROR GetChannelGroups(ADDON_HANDLE handle, bool bRadio) + { + if (_wmc) + return _wmc->GetChannelGroups(handle, bRadio); + + return PVR_ERROR_SERVER_ERROR; + } + + PVR_ERROR GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group) + { + if (_wmc) + return _wmc->GetChannelGroupMembers(handle, group); + + return PVR_ERROR_SERVER_ERROR; + } + + + // timer functions + int GetTimersAmount(void) + { + if (_wmc) + return _wmc->GetTimersAmount(); + + return PVR_ERROR_SERVER_ERROR; + } + + PVR_ERROR GetTimers(ADDON_HANDLE handle) + { + if (_wmc) + return _wmc->GetTimers(handle); + + return PVR_ERROR_SERVER_ERROR; + } + + PVR_ERROR AddTimer(const PVR_TIMER &timer) + { + if (_wmc) + return _wmc->AddTimer(timer); + + return PVR_ERROR_NO_ERROR; + } + + PVR_ERROR UpdateTimer(const PVR_TIMER &timer) + { + if (_wmc) + return _wmc->AddTimer(timer); + return PVR_ERROR_NO_ERROR; + } + + PVR_ERROR DeleteTimer(const PVR_TIMER &timer, bool bForceDelete) + { + if (_wmc) + return _wmc->DeleteTimer(timer, bForceDelete); + return PVR_ERROR_NO_ERROR; + } + + // recording file functions + PVR_ERROR GetRecordings(ADDON_HANDLE handle) + { + if (_wmc) + return _wmc->GetRecordings(handle); + return PVR_ERROR_NO_ERROR; + } + + int GetRecordingsAmount(void) + { + if (_wmc) + return _wmc->GetRecordingsAmount(); + + return -1; + } + + PVR_ERROR RenameRecording(const PVR_RECORDING &recording) + { + if (_wmc) + return _wmc->RenameRecording(recording); + return PVR_ERROR_NOT_IMPLEMENTED; + } + + //#define TRUESWITCH + + bool SwitchChannel(const PVR_CHANNEL &channel) + { + //CloseLiveStream(); +#ifdef TRUESWITCH + + if (_wmc) + { + return _wmc->SwitchChannel(channel); + } + return false; +#else + return OpenLiveStream(channel); // this will perform the closing of a current live stream itself +#endif + } + + // live stream functions + bool OpenLiveStream(const PVR_CHANNEL &channel) + { + if (_wmc) + { + //CloseLiveStream(); + if (_wmc->OpenLiveStream(channel)) + { + _bIsPlaying = true; + return true; + } + } + return false; + } + + int ReadLiveStream(unsigned char *pBuffer, unsigned int iBufferSize) + { + if (_wmc) + { + return _wmc->ReadLiveStream(pBuffer, iBufferSize); + } + return -1; + } + + void CloseLiveStream(void) + { + _bIsPlaying = false; + if (_wmc) + { + _wmc->CloseLiveStream(); + } + } + + long long SeekLiveStream(long long iPosition, int iWhence /* = SEEK_SET */) + { + if (_wmc) + return _wmc->SeekLiveStream(iPosition, iWhence); + else + return -1; + } + + long long PositionLiveStream(void) + { + if (_wmc) + return _wmc->PositionLiveStream(); + else + return -1; + } + + long long LengthLiveStream(void) + { + if (_wmc) + return _wmc->LengthLiveStream(); + else + return -1; + } + + void PauseStream(bool bPaused) + { + if (_wmc) + return _wmc->PauseStream(bPaused); + } + + bool CanPauseStream(void) + { + return true; + } + + bool CanSeekStream(void) + { + return true; + } + + // recorded stream functions (other "Open" these just call the live stream functions) + bool OpenRecordedStream(const PVR_RECORDING &recording) + { + if (_wmc) + { + CloseLiveStream(); + if (_wmc->OpenRecordedStream(recording)) + { + _bIsPlaying = true; + return true; + } + } + return false; + } + + int ReadRecordedStream(unsigned char *pBuffer, unsigned int iBufferSize) + { + if (_wmc) + { + return _wmc->ReadLiveStream(pBuffer, iBufferSize); + } + return -1; + } + + void CloseRecordedStream(void) + { + _bIsPlaying = false; + if (_wmc) + { + _wmc->CloseLiveStream(); + } + } + + long long SeekRecordedStream(long long iPosition, int iWhence /* = SEEK_SET */) + { + if (_wmc) + return _wmc->SeekLiveStream(iPosition, iWhence); + else + return -1; + } + + long long PositionRecordedStream(void) + { + if (_wmc) + return _wmc->PositionLiveStream(); + else + return -1; + } + + long long LengthRecordedStream(void) + { + if (_wmc) + return _wmc->LengthLiveStream(); + else + return -1; + } + + // recorded file functions + PVR_ERROR DeleteRecording(const PVR_RECORDING &recording) + { + if (_wmc) + return _wmc->DeleteRecording(recording); + return PVR_ERROR_NO_ERROR; + } + + + PVR_ERROR SetRecordingLastPlayedPosition(const PVR_RECORDING &recording, int lastplayedposition) + { + if (_wmc && g_bEnableMultiResume) + return _wmc->SetRecordingLastPlayedPosition(recording, lastplayedposition); + return PVR_ERROR_NOT_IMPLEMENTED; + } + int GetRecordingLastPlayedPosition(const PVR_RECORDING &recording) + { + if (_wmc && g_bEnableMultiResume) + return _wmc->GetRecordingLastPlayedPosition(recording); + return -1; + } + + + PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_MENUHOOK_DATA &item) + { + return PVR_ERROR_NOT_IMPLEMENTED; + } + + /** UNUSED API FUNCTIONS */ + PVR_ERROR DialogChannelScan(void) { return PVR_ERROR_NOT_IMPLEMENTED; } + PVR_ERROR DeleteChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } + PVR_ERROR RenameChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } + PVR_ERROR MoveChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } + PVR_ERROR DialogChannelSettings(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } + PVR_ERROR DialogAddChannel(const PVR_CHANNEL &channel) { return PVR_ERROR_NOT_IMPLEMENTED; } + void DemuxReset(void) {} + void DemuxFlush(void) {} + PVR_ERROR SetRecordingPlayCount(const PVR_RECORDING &recording, int count) { return PVR_ERROR_NOT_IMPLEMENTED; } + void DemuxAbort(void) {} + DemuxPacket* DemuxRead(void) { return NULL; } + unsigned int GetChannelSwitchDelay(void) { return 0; } + const char * GetLiveStreamURL(const PVR_CHANNEL &channel) { return ""; } + bool SeekTime(int,bool,double*) { return false; } + void SetSpeed(int) {}; + + PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY[], int*) { return PVR_ERROR_NOT_IMPLEMENTED; }; + time_t GetPlayingTime() { return 0; } + time_t GetBufferTimeStart() { return 0; } + time_t GetBufferTimeEnd() { return 0; } + +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/client.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/client.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/client.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/client.h 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,42 @@ +#pragma once +/* + * Copyright (C) 2011 Pulse-Eight + * http://www.pulse-eight.com/ + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#include "libXBMC_addon.h" +#include "libXBMC_pvr.h" +#include "libXBMC_gui.h" +#include "platform/util/StdString.h" + +#include "clientversion.h" + +extern bool m_bCreated; +extern CStdString g_strUserPath; +extern CStdString g_strClientPath; +extern CStdString g_strServerName; // the name of the server to connect to +extern CStdString g_strClientName; // the name of the computer running addon +extern CStdString g_clientOS; // OS of client, passed to server +extern int g_port; +extern bool g_bSignalEnable; +extern int g_signalThrottle; +extern bool g_bEnableMultiResume; +extern ADDON::CHelper_libXBMC_addon *XBMC; +extern CHelper_libXBMC_pvr *PVR; +extern CHelper_libXBMC_gui *GUI; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/clientversion.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/clientversion.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/clientversion.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/clientversion.h 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,26 @@ +#pragma once +/* + * Copyright (C) 2011 Pulse-Eight + * http://www.pulse-eight.com/ + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +inline CStdString PVRWMC_GetClientVersion() +{ + return "0.2.93"; // ALSO CHANGE IN REV NUMBER in 'addon.xml.in' +} \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/DialogDeleteTimer.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/DialogDeleteTimer.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/DialogDeleteTimer.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/DialogDeleteTimer.cpp 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2005-2011 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#include "DialogDeleteTimer.h" +#include "libXBMC_gui.h" + +#define BUTTON_OK 1 +#define BUTTON_CANCEL 2 +#define BUTTON_CLOSE 22 + +#define RADIO_BUTTON_EPISODE 10 +#define RADIO_BUTTON_SERIES 11 +#define LABEL_SHOWNAME 20 + + +CDialogDeleteTimer::CDialogDeleteTimer( bool delSeries, std::string showName) +{ + DeleteSeries = delSeries; + _showName = showName; + + // specify the xml of the window here + _confirmed = -1; + _window = GUI->Window_create("DeleteTimer.xml", "Confluence", false, true); + + // needed for every dialog + _window->m_cbhdl = this; + _window->CBOnInit = OnInitCB; + _window->CBOnFocus = OnFocusCB; + _window->CBOnClick = OnClickCB; + _window->CBOnAction = OnActionCB; +} + +CDialogDeleteTimer::~CDialogDeleteTimer() +{ + GUI->Window_destroy(_window); +} + +bool CDialogDeleteTimer::OnInit() +{ + // display the show name in the window + _window->SetControlLabel(LABEL_SHOWNAME, _showName.c_str()); + + // init radio buttons + _radioDelEpisode = GUI->Control_getRadioButton(_window, RADIO_BUTTON_EPISODE); + _radioDelSeries = GUI->Control_getRadioButton(_window, RADIO_BUTTON_SERIES); + _radioDelEpisode->SetText(XBMC->GetLocalizedString(30121)); + _radioDelSeries->SetText(XBMC->GetLocalizedString(30122)); + _radioDelEpisode->SetSelected(!DeleteSeries); + _radioDelSeries->SetSelected(DeleteSeries); + + return true; +} + +bool CDialogDeleteTimer::OnClick(int controlId) +{ + switch(controlId) + { + case BUTTON_OK: // save value from GUI, then FALLS THROUGH TO CANCEL + DeleteSeries = _radioDelSeries->IsSelected(); + case BUTTON_CANCEL: // handle releasing of objects + case BUTTON_CLOSE: + if (_confirmed == -1) // if not previously confirmed, set to cancel value + _confirmed = 0; + _window->Close(); + GUI->Control_releaseRadioButton(_radioDelEpisode); + GUI->Control_releaseRadioButton(_radioDelSeries); + break; + case RADIO_BUTTON_EPISODE: + DeleteSeries = !_radioDelEpisode->IsSelected(); + _radioDelSeries->SetSelected(DeleteSeries); + break; + case RADIO_BUTTON_SERIES: + DeleteSeries = _radioDelSeries->IsSelected(); + _radioDelEpisode->SetSelected(!DeleteSeries); + break; + } + + return true; +} + +bool CDialogDeleteTimer::OnInitCB(GUIHANDLE cbhdl) +{ + CDialogDeleteTimer* dialog = static_cast(cbhdl); + return dialog->OnInit(); +} + +bool CDialogDeleteTimer::OnClickCB(GUIHANDLE cbhdl, int controlId) +{ + CDialogDeleteTimer* dialog = static_cast(cbhdl); + if (controlId == BUTTON_OK) + dialog->_confirmed = 1; + //dialog->_confirmed = (controlId == BUTTON_OK); + return dialog->OnClick(controlId); +} + +bool CDialogDeleteTimer::OnFocusCB(GUIHANDLE cbhdl, int controlId) +{ + CDialogDeleteTimer* dialog = static_cast(cbhdl); + return dialog->OnFocus(controlId); +} + +bool CDialogDeleteTimer::OnActionCB(GUIHANDLE cbhdl, int actionId) +{ + CDialogDeleteTimer* dialog = static_cast(cbhdl); + return dialog->OnAction(actionId); +} + +bool CDialogDeleteTimer::Show() +{ + if (_window) + return _window->Show(); + + return false; +} + +void CDialogDeleteTimer::Close() +{ + if (_window) + _window->Close(); +} + +int CDialogDeleteTimer::DoModal() +{ + if (_window) + _window->DoModal(); + return _confirmed; // return true if user didn't cancel dialog +} + +bool CDialogDeleteTimer::OnFocus(int controlId) +{ + return true; +} + +bool CDialogDeleteTimer::OnAction(int actionId) +{ + if (actionId == ADDON_ACTION_CLOSE_DIALOG || actionId == ADDON_ACTION_PREVIOUS_MENU || actionId == 92/*back*/) + return OnClick(BUTTON_CANCEL); + else + return false; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/DialogDeleteTimer.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/DialogDeleteTimer.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/DialogDeleteTimer.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/DialogDeleteTimer.h 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,76 @@ +#pragma once + +/* + * Copyright (C) 2005-2012 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#include "client.h" +#include "pvr2wmc.h" + +//struct TimerInfo +//{ +// bool isSeries; +// int runType; +// bool anyChannel; +// bool anyTime; +// std::string currentChannelName; +// std::string currentAirTime; +// std::string showName; +//} + +class CDialogDeleteTimer +{ + +public: + CDialogDeleteTimer(bool recSeries, std::string showName); + virtual ~CDialogDeleteTimer(); + + bool Show(); + void Close(); + int DoModal(); //-1=>dialog load failed, 0=>canceled, 1=>confirmed + + // dialog specific return params + bool DeleteSeries; // values returned + + +private: + CAddonGUIRadioButton *_radioDelEpisode; + CAddonGUIRadioButton *_radioDelSeries; + + std::string _showName; + + // following is needed for every dialog +private: + CAddonGUIWindow *_window; + int _confirmed; //-1=>dialog load failed, 0=>canceled, 1=>confirmed + + bool OnClick(int controlId); + bool OnFocus(int controlId); + bool OnInit(); + bool OnAction(int actionId); + + static bool OnClickCB(GUIHANDLE cbhdl, int controlId); + static bool OnFocusCB(GUIHANDLE cbhdl, int controlId); + static bool OnInitCB(GUIHANDLE cbhdl); + static bool OnActionCB(GUIHANDLE cbhdl, int actionId); + + +}; + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/DialogRecordPref.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/DialogRecordPref.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/DialogRecordPref.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/DialogRecordPref.cpp 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2005-2011 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#include "DialogRecordPref.h" +#include "libXBMC_gui.h" + +#define BUTTON_OK 1 +#define BUTTON_CANCEL 2 +#define BUTTON_CLOSE 22 + +#define RADIO_BUTTON_EPISODE 10 +#define RADIO_BUTTON_SERIES 11 +#define SPIN_CONTROLRunType 12 +#define SPIN_CONTROL_CHANNEL 13 +#define SPIN_CONTROL_AIRTIME 14 +#define LABEL_SHOWNAME 20 + +CDialogRecordPref::CDialogRecordPref( bool recSeries, int runtype, bool anyChannel, bool anyTime, + std::string currentChannelName, std::string currentAirTime, std::string showName) +{ + RecSeries = recSeries; + RunType = runtype; + AnyChannel = anyChannel; + AnyTime = anyTime; + _currentChannel = currentChannelName; + _currentAirTime = currentAirTime; + _showName = showName; + + // needed for every dialog + _confirmed = -1; // init to failed load value (due to xml file not being found) + _window = GUI->Window_create("RecordPrefs.xml", "Confluence", false, true); + _window->m_cbhdl = this; + _window->CBOnInit = OnInitCB; + _window->CBOnFocus = OnFocusCB; + _window->CBOnClick = OnClickCB; + _window->CBOnAction = OnActionCB; +} + +CDialogRecordPref::~CDialogRecordPref() +{ + GUI->Window_destroy(_window); +} + +bool CDialogRecordPref::OnInit() +{ + // display the show name in the window + _window->SetControlLabel(LABEL_SHOWNAME, _showName.c_str()); + + // init radio buttons + _radioRecEpisode = GUI->Control_getRadioButton(_window, RADIO_BUTTON_EPISODE); + _radioRecSeries = GUI->Control_getRadioButton(_window, RADIO_BUTTON_SERIES); + _radioRecEpisode->SetText(XBMC->GetLocalizedString(30101)); + _radioRecSeries->SetText(XBMC->GetLocalizedString(30102)); + _radioRecEpisode->SetSelected(!RecSeries); + _radioRecSeries->SetSelected(RecSeries); + + // init runtype spin control + _spinRunType = GUI->Control_getSpin(_window, SPIN_CONTROLRunType); + _spinRunType->AddLabel(XBMC->GetLocalizedString(30104), 0); // any show type + _spinRunType->AddLabel(XBMC->GetLocalizedString(30105), 1); // first run only + _spinRunType->AddLabel(XBMC->GetLocalizedString(30106), 2); // live only + _spinRunType->SetValue(RunType); + + // init channel spin control + _spinChannel = GUI->Control_getSpin(_window, SPIN_CONTROL_CHANNEL); + _spinChannel->AddLabel(_currentChannel.c_str(), 0); // add current channel + _spinChannel->AddLabel(XBMC->GetLocalizedString(30108), 1); // add "Any channel" + _spinChannel->SetValue(AnyChannel ? 1:0); + + // init airtime spin control + _spinAirTime = GUI->Control_getSpin(_window, SPIN_CONTROL_AIRTIME); + _spinAirTime->AddLabel(_currentAirTime.c_str(), 0); // current air time + _spinAirTime->AddLabel(XBMC->GetLocalizedString(30111), 1); // "Anytime" + _spinAirTime->SetValue(AnyTime ? 1:0); + + // set visibility of spin controls based on whether dialog is set to rec a series + _spinRunType->SetVisible(RecSeries); + _spinChannel->SetVisible(RecSeries); + _spinAirTime->SetVisible(RecSeries); + + return true; +} + +bool CDialogRecordPref::OnClick(int controlId) +{ + switch(controlId) + { + case BUTTON_OK: // save value from GUI, then FALLS THROUGH TO CANCEL + RecSeries = _radioRecSeries->IsSelected(); + RunType = _spinRunType->GetValue(); + AnyChannel = _spinChannel->GetValue() == 1; + AnyTime = _spinAirTime->GetValue() == 1; + case BUTTON_CANCEL: + case BUTTON_CLOSE: + if (_confirmed == -1) // if not previously confirmed, set to cancel value + _confirmed = 0; + _window->Close(); + GUI->Control_releaseRadioButton(_radioRecEpisode); + GUI->Control_releaseRadioButton(_radioRecSeries); + GUI->Control_releaseSpin(_spinRunType); + GUI->Control_releaseSpin(_spinChannel); + GUI->Control_releaseSpin(_spinAirTime); + break; + case RADIO_BUTTON_EPISODE: + RecSeries = !_radioRecEpisode->IsSelected(); + _radioRecSeries->SetSelected(RecSeries); + _spinRunType->SetVisible(RecSeries); + _spinChannel->SetVisible(RecSeries); + _spinAirTime->SetVisible(RecSeries); + break; + case RADIO_BUTTON_SERIES: + RecSeries = _radioRecSeries->IsSelected(); + _radioRecEpisode->SetSelected(!RecSeries); + _spinRunType->SetVisible(RecSeries); + _spinChannel->SetVisible(RecSeries); + _spinAirTime->SetVisible(RecSeries); + break; + } + + return true; +} + +bool CDialogRecordPref::OnInitCB(GUIHANDLE cbhdl) +{ + CDialogRecordPref* dialog = static_cast(cbhdl); + return dialog->OnInit(); +} + +bool CDialogRecordPref::OnClickCB(GUIHANDLE cbhdl, int controlId) +{ + CDialogRecordPref* dialog = static_cast(cbhdl); + if (controlId == BUTTON_OK) + dialog->_confirmed = 1; + return dialog->OnClick(controlId); +} + +bool CDialogRecordPref::OnFocusCB(GUIHANDLE cbhdl, int controlId) +{ + CDialogRecordPref* dialog = static_cast(cbhdl); + return dialog->OnFocus(controlId); +} + +bool CDialogRecordPref::OnActionCB(GUIHANDLE cbhdl, int actionId) +{ + CDialogRecordPref* dialog = static_cast(cbhdl); + return dialog->OnAction(actionId); +} + +bool CDialogRecordPref::Show() +{ + if (_window) + return _window->Show(); + + return false; +} + +void CDialogRecordPref::Close() +{ + if (_window) + _window->Close(); +} + +int CDialogRecordPref::DoModal() +{ + if (_window) + _window->DoModal(); + return _confirmed; // return true if user didn't cancel dialog +} + +bool CDialogRecordPref::OnFocus(int controlId) +{ + return true; +} + +bool CDialogRecordPref::OnAction(int actionId) +{ + if (actionId == ADDON_ACTION_CLOSE_DIALOG || actionId == ADDON_ACTION_PREVIOUS_MENU || actionId == 92/*back*/) + return OnClick(BUTTON_CANCEL); + else + return false; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/DialogRecordPref.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/DialogRecordPref.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/DialogRecordPref.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/DialogRecordPref.h 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,85 @@ +#pragma once + +/* + * Copyright (C) 2005-2012 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#include "client.h" +#include "pvr2wmc.h" + +//struct TimerInfo +//{ +// bool isSeries; +// int runType; +// bool anyChannel; +// bool anyTime; +// std::string currentChannelName; +// std::string currentAirTime; +// std::string showName; +//} + +class CDialogRecordPref +{ + +public: + CDialogRecordPref(bool recSeries, int runtype, bool anyChannel, bool anyTime, + std::string currentChannelName, std::string currentAirTime, std::string showName); + virtual ~CDialogRecordPref(); + + bool Show(); + void Close(); + int DoModal(); // returns -1=> load failed, 0=>canceled, 1=>confirmed + //bool LoadFailed(); + + // dialog specific params + bool RecSeries; // values returned + int RunType; + bool AnyChannel; + bool AnyTime; +private: + std::string _currentChannel; // these are just used for dialog display + std::string _currentAirTime; + std::string _showName; + +private: + CAddonGUIRadioButton *_radioRecEpisode; + CAddonGUIRadioButton *_radioRecSeries; + CAddonGUISpinControl *_spinRunType; + CAddonGUISpinControl *_spinChannel; + CAddonGUISpinControl *_spinAirTime; + + // following is needed for every dialog +private: + CAddonGUIWindow *_window; + int _confirmed; //-1=> load failed, 0=>canceled, 1=>confirmed + + bool OnClick(int controlId); + bool OnFocus(int controlId); + bool OnInit(); + bool OnAction(int actionId); + + static bool OnClickCB(GUIHANDLE cbhdl, int controlId); + static bool OnFocusCB(GUIHANDLE cbhdl, int controlId); + static bool OnInitCB(GUIHANDLE cbhdl); + static bool OnActionCB(GUIHANDLE cbhdl, int actionId); + + +}; + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/pvr2wmc.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/pvr2wmc.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/pvr2wmc.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/pvr2wmc.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,1112 @@ +/* +* Copyright (C) 2011 Pulse-Eight +* http://www.pulse-eight.com/ +* +* This Program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2, or (at your option) +* any later version. +* +* This Program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with XBMC; see the file COPYING. If not, write to +* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. +* http://www.gnu.org/copyleft/gpl.html +* +*/ + +#include "tinyxml/XMLUtils.h" +#include "pvr2wmc.h" +#include "utilities.h" +#include "DialogRecordPref.h" +#include "DialogDeleteTimer.h" +#include "platform/util/timeutils.h" + +using namespace std; +using namespace ADDON; +using namespace PLATFORM; + +#define null NULL + +#define STRCPY(dest, src) strncpy(dest, src, sizeof(dest)-1); +#define FOREACH(ss, vv) for(std::vector::iterator ss = vv.begin(); ss != vv.end(); ++ss) + +int64_t _lastRecordingUpdateTime; + +Pvr2Wmc::Pvr2Wmc(void) +{ + _iEpgStart = -1; + _strDefaultIcon = "http://www.royalty-free.tv/news/wp-content/uploads/2011/06/cc-logo1.jpg"; + _strDefaultMovie = ""; + + _socketClient.SetServerName(g_strServerName); + _socketClient.SetClientName(g_strClientName); + _socketClient.SetServerPort(g_port); + + _signalStatusCount = 0; + _discardSignalStatus = false; + + _lastRecordingUpdateTime = 0; + _streamFile = 0; // handle to a streamed file + _streamFileName = ""; + _initialStreamResetCnt = 0; // used to count how many times we reset the stream position (due to 2 pass demuxer) + _initialStreamPosition = 0; // used to set an initial position (multiple clients watching the same live tv buffer) + _lostStream = false; // set to true if stream is lost + _lastStreamSize = 0; + _isStreamFileGrowing = false; + _streamWTV = true; // by default, assume we are streaming Wtv files (not ts files) +} + +Pvr2Wmc::~Pvr2Wmc(void) +{ + _channels.clear(); + _groups.clear(); +} + +bool Pvr2Wmc::IsServerDown() +{ + CStdString request; + request.Format("GetServiceStatus|%s|%s", PVRWMC_GetClientVersion(), g_clientOS); + _socketClient.SetTimeOut(10); // set a timout interval for checking if server is down + bool res = _socketClient.GetBool(request, true); + return !res; +} + +void Pvr2Wmc::UnLoading() +{ + _socketClient.GetBool("ClientGoingDown", true); // returns true if server is up +} + +const char *Pvr2Wmc::GetBackendVersion(void) +{ + if (!IsServerDown()) + { + CStdString request; + request.Format("GetServerVersion"); + vector results = _socketClient.GetVector(request, true); + if (results.size() > 1) + { + _serverBuild = atoi(results[1]); + return results[0].c_str(); + } + } + return "0.0"; +} + +int Pvr2Wmc::GetChannelsAmount(void) +{ + return _socketClient.GetInt("GetChannelCount", true); +} + +// test for returned error vector from server, handle accompanying messages if any +bool isServerError(vector results) +{ + if (results[0] == "error") + { + if (results.size() > 1 && results[1].length() != 0) + { + XBMC->Log(LOG_ERROR, results[1].c_str()); // log more info on error + } + if (results.size() > 2 != 0) + { + int errorID = atoi(results[2].c_str()); + if (errorID != 0) + { + CStdString errStr = XBMC->GetLocalizedString(errorID); + XBMC->QueueNotification(QUEUE_ERROR, errStr.c_str()); + } + } + return true; + } + else + return false; +} + +// look at result vector from server and perform any updates requested +void TriggerUpdates(vector results) +{ + FOREACH(response, results) + { + if (*response == "updateTimers") + PVR->TriggerTimerUpdate(); + else if (*response == "updateRecordings") + PVR->TriggerRecordingUpdate(); + else if (*response == "updateChannels") + PVR->TriggerChannelUpdate(); + else if (*response == "updateChannelGroups") + PVR->TriggerChannelGroupsUpdate(); + } +} + +// xbmc call: get all channels for either tv or radio +PVR_ERROR Pvr2Wmc::GetChannels(ADDON_HANDLE handle, bool bRadio) +{ + if (IsServerDown()) + return PVR_ERROR_SERVER_ERROR; + + vector results = _socketClient.GetVector("GetChannels", true); + + FOREACH(response, results) + { + PVR_CHANNEL xChannel; + + memset(&xChannel, 0, sizeof(PVR_CHANNEL)); // set all mem to zero + vector v = split(*response, "|"); + // packing: id, bradio, c.OriginalNumber, c.CallSign, c.IsEncrypted, imageStr, c.IsBlocked + + if (v.size() < 7) + { + XBMC->Log(LOG_DEBUG, "Wrong number of fields xfered for channel group data"); + continue; + } + + xChannel.iUniqueId = strtoul(v[0].c_str(), 0, 10); // convert to unsigned int + xChannel.bIsRadio = Str2Bool(v[1]); + xChannel.iChannelNumber = atoi(v[2].c_str()); + STRCPY(xChannel.strChannelName, v[3].c_str()); + //CStdString test = "C:\\Users\\Public\\Recorded TV\\dump.mpg"; + //STRCPY(xChannel.strStreamURL, test.c_str()); + //STRCPY(xChannel.strInputFormat, "video/wtv"); + xChannel.iEncryptionSystem = Str2Bool(v[4]); + if (v[5].compare("NULL") != 0) // if icon path is null + STRCPY(xChannel.strIconPath, v[5].c_str()); + xChannel.bIsHidden = Str2Bool(v[6]); + + PVR->TransferChannelEntry(handle, &xChannel); + } + return PVR_ERROR_NO_ERROR; +} + +int Pvr2Wmc::GetChannelGroupsAmount(void) +{ + return _socketClient.GetInt("GetChannelGroupCount", true); +} + +PVR_ERROR Pvr2Wmc::GetChannelGroups(ADDON_HANDLE handle, bool bRadio) +{ + if (IsServerDown()) + return PVR_ERROR_SERVER_ERROR; + + CStdString request; + request.Format("GetChannelGroups|%s", bRadio ? "True" : "False"); + vector results = _socketClient.GetVector(request, true); + + FOREACH(response, results) + { + PVR_CHANNEL_GROUP xGroup; + memset(&xGroup, 0, sizeof(PVR_CHANNEL_GROUP)); + + vector v = split(*response, "|"); + + if (v.size() < 1) + { + XBMC->Log(LOG_DEBUG, "Wrong number of fields xfered for channel group data"); + continue; + } + + xGroup.bIsRadio = bRadio; + strncpy(xGroup.strGroupName, v[0].c_str(), sizeof(xGroup.strGroupName) - 1); + + PVR->TransferChannelGroup(handle, &xGroup); + } + + return PVR_ERROR_NO_ERROR; +} + +PVR_ERROR Pvr2Wmc::GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group) +{ + if (IsServerDown()) + return PVR_ERROR_SERVER_ERROR; + + CStdString request; + request.Format("GetChannelGroupMembers|%s|%s", group.bIsRadio ? "True" : "False", group.strGroupName); + vector results = _socketClient.GetVector(request, true); + + FOREACH(response, results) + { + PVR_CHANNEL_GROUP_MEMBER xGroupMember; + memset(&xGroupMember, 0, sizeof(PVR_CHANNEL_GROUP_MEMBER)); + + vector v = split(*response, "|"); + + if (v.size() < 2) + { + XBMC->Log(LOG_DEBUG, "Wrong number of fields xfered for channel group member data"); + continue; + } + + strncpy(xGroupMember.strGroupName, group.strGroupName, sizeof(xGroupMember.strGroupName) - 1); + xGroupMember.iChannelUniqueId = strtoul(v[0].c_str(), 0, 10); // convert to unsigned int + xGroupMember.iChannelNumber = atoi(v[1].c_str()); + + PVR->TransferChannelGroupMember(handle, &xGroupMember); + } + + return PVR_ERROR_NO_ERROR; +} + +PVR_ERROR Pvr2Wmc::GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart, time_t iEnd) +{ + if (IsServerDown()) + return PVR_ERROR_SERVER_ERROR; + + CStdString request; + request.Format("GetEntries|%d|%d|%d", channel.iUniqueId, iStart, iEnd); // build the request string + + vector results = _socketClient.GetVector(request, true); // get entries from server + + FOREACH(response, results) + { + EPG_TAG xEpg; + memset(&xEpg, 0, sizeof(EPG_TAG)); // set all mem to zero + vector v = split(*response, "|"); // split to unpack string + + if (v.size() < 16) + { + XBMC->Log(LOG_DEBUG, "Wrong number of fields xfered for epg data"); + continue; + } + + // e.Id, e.Program.Title, c.OriginalNumber, start_t, end_t, + // e.Program.ShortDescription, e.Program.Description, + // origAirDate, e.TVRating, e.Program.StarRating, + // e.Program.SeasonNumber, e.Program.EpisodeNumber, + // e.Program.EpisodeTitle + xEpg.iUniqueBroadcastId = atoi(v[0].c_str()); // entry ID + xEpg.strTitle = v[1].c_str(); // entry title + xEpg.iChannelNumber = atoi(v[2].c_str()); // channel number + xEpg.startTime = atol(v[3].c_str()); // start time + xEpg.endTime = atol(v[4].c_str()); // end time + xEpg.strPlotOutline = v[5].c_str(); // short plot description (currently using episode name, if there is one) + xEpg.strPlot = v[6].c_str(); // long plot description + xEpg.firstAired = atol(v[7].c_str()); // orig air date + xEpg.iParentalRating = atoi(v[8].c_str()); // tv rating + xEpg.iStarRating = atoi(v[9].c_str()); // star rating + xEpg.iSeriesNumber = atoi(v[10].c_str()); // season (?) number + xEpg.iEpisodeNumber = atoi(v[11].c_str()); // episode number + xEpg.iGenreType = atoi(v[12].c_str()); // season (?) number + xEpg.iGenreSubType = atoi(v[13].c_str()); // general genre type + xEpg.strIconPath = v[14].c_str(); // the icon url + xEpg.strEpisodeName = v[15].c_str(); // the episode name + xEpg.strGenreDescription = ""; + + PVR->TransferEpgEntry(handle, &xEpg); + + } + return PVR_ERROR_NO_ERROR; +} + + +// timer functions ------------------------------------------------------------- +int Pvr2Wmc::GetTimersAmount(void) +{ + return _socketClient.GetInt("GetTimerCount", true); +} + +#ifdef TARGET_WINDOWS +UINT_PTR _recTimer = null; // holds the recording update timer + +// this function is a callback for Pvr2Wmc::UpdateRecordingTimer +VOID CALLBACK RecUpdateTimerFunc( + HWND hwnd, // handle to window for timer messages + UINT message, // WM_TIMER message + UINT idTimer, // timer identifier + DWORD dwTime) // current system time +{ + PVR->TriggerRecordingUpdate(); // tell xbmc to update recordings display + assert(KillTimer(NULL, idTimer)); // stop timer from going again + _recTimer = null; + XBMC->Log(LOG_DEBUG, "Recording Files updated by function timer"); +} + +// activate recording file update after the input number of msec +void Pvr2Wmc::UpdateRecordingTimer(int msec) +{ + if (_recTimer == null) // if timer is already running do nothing + { + _recTimer = SetTimer( + null, // hWnd + 0, // id (if hWnd is null, the id is assigned) + msec, // time till timer goes off + RecUpdateTimerFunc // update rec file function + ); + } +} +#endif + +PVR_ERROR Pvr2Wmc::AddTimer(const PVR_TIMER &xTmr) +{ + if (IsServerDown()) + return PVR_ERROR_SERVER_ERROR; + + // TODO: haven't figured out how implement changes to timers that aren't SE based + if (xTmr.iClientIndex != -1) // != -1 means user is trying to change params of an existing timer + { + return PVR_ERROR_NOT_IMPLEMENTED; + } + + bool isSeries = false; // whether show being requested is a series + + // series specific params for recording + bool recSeries = false; // if true, request a series recording + int runType; // the type of episodes to record (all, new, live) + bool anyChannel; // whether to rec series from ANY channel + bool anyTime; // whether to rec series at ANY time + + CStdString command; + CStdString timerStr = Timer2String(xTmr); // convert timer to string + + if (xTmr.startTime != 0 && xTmr.iEpgUid != -1) // if we are NOT doing an 'instant' record (=0) AND not a 'manual' record (=-1) + { + + command = "GetShowInfo" + timerStr; // request data about the show that will be recorded by the timer + vector info; // holds results from server + info = _socketClient.GetVector(command, true); // get results from server + + if (isServerError(info)) + { + return PVR_ERROR_SERVER_ERROR; + } + else + { + isSeries = info[0] == "True"; // first string determines if show is a series (all that is handled for now) + if (isSeries) // if the show is a series, next string contains record params for series + { + vector v = split(info[1].c_str(), "|"); // split to unpack string containing series params + + if (v.size() < 7) + { + XBMC->Log(LOG_DEBUG, "Wrong number of fields xfered for AddTimer data"); + return PVR_ERROR_NO_ERROR; + } + + // fill in params for dialog windows + recSeries = v[0] == "True"; // get reset of params for dialog windows + runType = atoi(v[1].c_str()); // any=0, firstRun=1, live=2 + anyChannel = v[2] == "True"; + anyTime = v[3] == "True"; + // start dialogwindow + CDialogRecordPref vWindow( recSeries, runType, anyChannel, anyTime, + v[4]/*channelName*/, v[5]/*=startTimeStr*/, v[6]/*showName*/); + + int dlogResult = vWindow.DoModal(); + if (dlogResult == 1) // present dialog with recording options + { + recSeries = vWindow.RecSeries; + if (recSeries) + { + runType = vWindow.RunType; // the type of episodes to record (0->all, 1->new, 2->live) + anyChannel = vWindow.AnyChannel; // whether to rec series from ANY channel + anyTime = vWindow.AnyTime; // whether to rec series at ANY time + } + } + else if (dlogResult == 0) + return PVR_ERROR_NO_ERROR; // user canceled timer in dialog + else + { + } + } + } + } + + command = "SetTimer" + timerStr; // create setTimer request + + // if recording a series append series info request + CStdString extra; + if (recSeries) + extra.Format("|%d|%d|%d|%d", recSeries, runType, anyChannel, anyTime); + else + extra.Format("|%d", recSeries); + + command.append(extra); + + vector results = _socketClient.GetVector(command, false); // get results from server + + PVR->TriggerTimerUpdate(); // update timers regardless of whether there is an error + + if (isServerError(results)) + { + return PVR_ERROR_SERVER_ERROR; + } + else + { + XBMC->Log(LOG_DEBUG, "recording added for timer '%s', with rec state %s", xTmr.strTitle, results[0].c_str()); + + if (results.size() > 1) // if there is extra results sent from server... + { + FOREACH(result, results) + { + vector splitResult = split(*result, "|"); // split to unpack extra info on each result + CStdString infoStr; + + if (splitResult[0] == "recordingNow") // recording is active now + { +#ifdef TARGET_WINDOWS + UpdateRecordingTimer(10000); // give time for the recording to start, then update recordings list +#endif + } + else if (splitResult[0] == "recordingChannel") // service picked a different channel for timer + { + XBMC->Log(LOG_DEBUG, "timer channel changed by wmc to '%s'", splitResult[1].c_str()); + // build info string and notify user of channel change + infoStr = XBMC->GetLocalizedString(30009) + splitResult[1]; + XBMC->QueueNotification(QUEUE_ERROR, infoStr.c_str()); + } + else if (splitResult[0] == "recordingTime") // service picked a different start time for timer + { + XBMC->Log(LOG_DEBUG, "timer start time changed by wmc to '%s'", splitResult[1].c_str()); + // build info string and notify user of time change + infoStr = XBMC->GetLocalizedString(30010) + splitResult[1]; + XBMC->QueueNotification(QUEUE_ERROR, infoStr.c_str()); + } + else if (splitResult[0] == "increasedEndTime") // end time has been increased on an instant record + { + XBMC->Log(LOG_DEBUG, "instant record end time increased by '%s' minutes", splitResult[1].c_str()); + // build info string and notify user of time increase + infoStr = XBMC->GetLocalizedString(30013) + splitResult[1] + " min"; + XBMC->QueueNotification(QUEUE_ERROR, infoStr.c_str()); + } + } + } + + return PVR_ERROR_NO_ERROR; + } +} + +CStdString Pvr2Wmc::Timer2String(const PVR_TIMER &xTmr) +{ + CStdString tStr; + + tStr.Format("|%d|%d|%d|%d|%d|%s|%d|%d|%d|%d|%d", // format for 11 params: + xTmr.iClientIndex, xTmr.iClientChannelUid, xTmr.startTime, xTmr.endTime, PVR_TIMER_STATE_NEW, // 5 params + xTmr.strTitle, xTmr.iPriority, xTmr.iMarginStart, xTmr.iMarginEnd, xTmr.bIsRepeating, // 5 params + xTmr.iEpgUid); // 1 param + + return tStr; +} + +PVR_ERROR Pvr2Wmc::DeleteTimer(const PVR_TIMER &xTmr, bool bForceDelete) +{ + if (IsServerDown()) + return PVR_ERROR_SERVER_ERROR; + + bool deleteSeries = false; + + if (xTmr.bIsRepeating) // if timer is a series timer, ask if want to cancel series + { + CDialogDeleteTimer vWindow(deleteSeries, xTmr.strTitle); + int dlogResult = vWindow.DoModal(); + if (dlogResult == 1) // present dialog with delete timer options + { + deleteSeries = vWindow.DeleteSeries; + } + else if (dlogResult == 0) + return PVR_ERROR_NO_ERROR; // user canceled in delete timer dialog + //else if dialog fails, just delete the episode + } + + CStdString command = "DeleteTimer" + Timer2String(xTmr); + + CStdString eStr; // append whether to delete the series or episode + eStr.Format("|%d", deleteSeries); + command.append(eStr); + + vector results = _socketClient.GetVector(command, false); // get results from server + + PVR->TriggerTimerUpdate(); // update timers regardless of whether there is an error + + if (isServerError(results)) // did the server do it? + { + return PVR_ERROR_SERVER_ERROR; + } + else + { + if (deleteSeries) + XBMC->Log(LOG_DEBUG, "deleted series timer '%s', with rec state %s", xTmr.strTitle, results[0].c_str()); + else + XBMC->Log(LOG_DEBUG, "deleted timer '%s', with rec state %s", xTmr.strTitle, results[0].c_str()); + return PVR_ERROR_NO_ERROR; + } +} + +PVR_ERROR Pvr2Wmc::GetTimers(ADDON_HANDLE handle) +{ + if (IsServerDown()) + return PVR_ERROR_SERVER_ERROR; + + vector responses = _socketClient.GetVector("GetTimers", true); + + FOREACH(response, responses) + { + PVR_TIMER xTmr; + memset(&xTmr, 0, sizeof(PVR_TIMER)); // set all struct to zero + + vector v = split(*response, "|"); // split to unpack string + // eId, chId, start_t, end_t, pState, + // rp.Program.Title, ""/*recdir*/, rp.Program.EpisodeTitle/*summary?*/, rp.Priority, rp.Request.IsRecurring, + // eId, preMargin, postMargin, genre, subgenre + + if (v.size() < 15) + { + XBMC->Log(LOG_DEBUG, "Wrong number of fields xfered for timer data"); + continue; + } + + xTmr.iClientIndex = atoi(v[0].c_str()); // timer index (set to same as Entry ID) + xTmr.iClientChannelUid = atoi(v[1].c_str()); // channel id + xTmr.startTime = atoi(v[2].c_str()); // start time + xTmr.endTime = atoi(v[3].c_str()); // end time + xTmr.state = (PVR_TIMER_STATE)atoi(v[4].c_str()); // current state of time + + STRCPY(xTmr.strTitle, v[5].c_str()); // timer name (set to same as Program title) + STRCPY(xTmr.strDirectory, v[6].c_str()); // rec directory + STRCPY(xTmr.strSummary, v[7].c_str()); // currently set to episode title + xTmr.iPriority = atoi(v[8].c_str()); // rec priority + xTmr.bIsRepeating = Str2Bool(v[9].c_str()); // repeating rec (set to series flag) + + xTmr.iEpgUid = atoi(v[10].c_str()); // epg ID (same as client ID, except for a 'manual' record) + xTmr.iMarginStart = atoi(v[11].c_str()); // rec margin at start (sec) + xTmr.iMarginEnd = atoi(v[12].c_str()); // rec margin at end (sec) + xTmr.iGenreType = atoi(v[13].c_str()); // genre ID + xTmr.iGenreSubType = atoi(v[14].c_str()); // sub genre ID + + PVR->TransferTimerEntry(handle, &xTmr); + } + + // check time since last time Recordings were updated, update if it has been awhile + if ( PLATFORM::GetTimeMs() > _lastRecordingUpdateTime + 20000) + { + PVR->TriggerRecordingUpdate(); + } + return PVR_ERROR_NO_ERROR; +} + +// recording functions ------------------------------------------------------------------------ +int Pvr2Wmc::GetRecordingsAmount(void) +{ + return _socketClient.GetInt("GetRecordingsAmount", true); +} + +// recording file functions +PVR_ERROR Pvr2Wmc::GetRecordings(ADDON_HANDLE handle) +{ + if (IsServerDown()) + return PVR_ERROR_SERVER_ERROR; + + vector responses = _socketClient.GetVector("GetRecordings", true); + + FOREACH(response, responses) + { + PVR_RECORDING xRec; + memset(&xRec, 0, sizeof(PVR_RECORDING)); // set all struct to zero + + vector v = split(*response, "|"); // split to unpack string + + // r.Id, r.Program.Title, r.FileName, recDir, plotOutline, + // plot, r.Channel.CallSign, ""/*icon path*/, ""/*thumbnail path*/, ToTime_t(r.RecordingTime), + // duration, r.RequestedProgram.Priority, r.KeepLength.ToString(), genre, subgenre + + if (v.size() < 16) + { + XBMC->Log(LOG_DEBUG, "Wrong number of fields xfered for recording data"); + continue; + } + + STRCPY(xRec.strRecordingId, v[0].c_str()); + STRCPY(xRec.strTitle, v[1].c_str()); + STRCPY(xRec.strStreamURL, v[2].c_str()); + STRCPY(xRec.strDirectory, v[3].c_str()); + STRCPY(xRec.strPlotOutline, v[4].c_str()); + STRCPY(xRec.strPlot, v[5].c_str()); + STRCPY(xRec.strChannelName, v[6].c_str()); + STRCPY(xRec.strIconPath, v[7].c_str()); + STRCPY(xRec.strThumbnailPath, v[8].c_str()); + xRec.recordingTime = atol(v[9].c_str()); + xRec.iDuration = atoi(v[10].c_str()); + xRec.iPriority = atoi(v[11].c_str()); + xRec.iLifetime = atoi(v[12].c_str()); + xRec.iGenreType = atoi(v[13].c_str()); + xRec.iGenreSubType = atoi(v[14].c_str()); + if (g_bEnableMultiResume) + xRec.iLastPlayedPosition = atoi(v[15].c_str()); + + PVR->TransferRecordingEntry(handle, &xRec); + } + + _lastRecordingUpdateTime = PLATFORM::GetTimeMs(); + + return PVR_ERROR_NO_ERROR; +} + +PVR_ERROR Pvr2Wmc::DeleteRecording(const PVR_RECORDING &recording) +{ + if (IsServerDown()) + return PVR_ERROR_SERVER_ERROR; + + CStdString command;// = format("DeleteRecording|%s|%s|%s", recording.strRecordingId, recording.strTitle, recording.strStreamURL); + command.Format("DeleteRecording|%s|%s|%s", recording.strRecordingId, recording.strTitle, recording.strStreamURL); + + vector results = _socketClient.GetVector(command, false); // get results from server + + + if (isServerError(results)) // did the server do it? + { + return PVR_ERROR_NO_ERROR; // report "no error" so our error shows up + } + else + { + TriggerUpdates(results); + //PVR->TriggerRecordingUpdate(); // tell xbmc to update recording display + XBMC->Log(LOG_DEBUG, "deleted recording '%s'", recording.strTitle); + + //if (results.size() == 2 && results[0] == "updateTimers") // if deleted recording was actually recording a the time + // PVR->TriggerTimerUpdate(); // update timer display too + + return PVR_ERROR_NO_ERROR; + } +} + + +PVR_ERROR Pvr2Wmc::RenameRecording(const PVR_RECORDING &recording) +{ + if (IsServerDown()) + return PVR_ERROR_SERVER_ERROR; + + CStdString command;// = format("RenameRecording|%s|%s", recording.strRecordingId, recording.strTitle); + command.Format("RenameRecording|%s|%s", recording.strRecordingId, recording.strTitle); + + vector results = _socketClient.GetVector(command, false); // get results from server + + if (isServerError(results)) // did the server do it? + { + return PVR_ERROR_NO_ERROR; // report "no error" so our error shows up + } + else + { + TriggerUpdates(results); + XBMC->Log(LOG_DEBUG, "deleted recording '%s'", recording.strTitle); + return PVR_ERROR_NO_ERROR; + } +} + +// set the recording resume position in the wmc database +PVR_ERROR Pvr2Wmc::SetRecordingLastPlayedPosition(const PVR_RECORDING &recording, int lastplayedposition) +{ + CStdString command; + command.Format("SetResumePosition|%s|%d", recording.strRecordingId, lastplayedposition); + vector results = _socketClient.GetVector(command, false); + PVR->TriggerRecordingUpdate(); // this is needed to get the new resume point actually used by the player (xbmc bug) + return PVR_ERROR_NO_ERROR; +} + +// get the rercording resume position from the wmc database +// note: although this resume point time will be displayed to the user in the gui (in the resume dlog) +// the return value is ignored by the xbmc player. That's why TriggerRecordingUpdate is required in the setting above +int Pvr2Wmc::GetRecordingLastPlayedPosition(const PVR_RECORDING &recording) +{ + CStdString command; + command.Format("GetResumePosition|%s", recording.strRecordingId); + int pos = _socketClient.GetInt(command, true); + return pos; +} + + +CStdString Pvr2Wmc::Channel2String(const PVR_CHANNEL &xCh) +{ + // packing: id, bradio, c.OriginalNumber, c.CallSign, c.IsEncrypted, imageStr, c.IsBlocked + CStdString chStr; + chStr.Format("|%d|%d|%d|%s", xCh.iUniqueId, xCh.bIsRadio, xCh.iChannelNumber, xCh.strChannelName); + return chStr; +} + +// live/recorded stream functions -------------------------------------------------------------- + +bool Pvr2Wmc::OpenLiveStream(const PVR_CHANNEL &channel) +{ + if (IsServerDown()) + return false; + + _lostStream = true; // init + + CloseLiveStream(false); // close current stream (if any) + + CStdString request = "OpenLiveStream" + Channel2String(channel); // request a live stream using channel + vector results = _socketClient.GetVector(request, false); // try to open live stream, get path to stream file + + if (isServerError(results)) // test if server reported an error + { + return false; + } + else + { + _streamFileName = results[0]; // get path of streamed file + _streamWTV = EndsWith(results[0], "wtv"); // true if stream file is a wtv file + + if (results.size() > 1) + XBMC->Log(LOG_DEBUG, "OpenLiveStream> opening stream: " + results[1]); // log password safe path of client if available + else + XBMC->Log(LOG_DEBUG, "OpenLiveStream> opening stream: " + _streamFileName); + + // Initialise variables for starting stream at an offset + _initialStreamResetCnt = 0; + _initialStreamPosition = 0; + + // Check for a specified initial position and save it for the first ReadLiveStream command to use + if (results.size() > 2) + { + _initialStreamPosition = atoll(results[2]); + } + + _streamFile = XBMC->OpenFile(_streamFileName.c_str(), 0); // open the video file for streaming, same handle + + if (!_streamFile) // something went wrong + { + CStdString lastError; +#ifdef TARGET_WINDOWS + int errorVal = GetLastError(); + lastError.Format("Error opening stream file, Win32 error code: %d", errorVal); +#else + lastError.Format("Error opening stream file"); +#endif + XBMC->Log(LOG_ERROR, lastError.c_str()); // log more info on error + + _socketClient.GetBool("StreamStartError|" + _streamFileName, true); // tell server stream did not start + + return false; + } + else + { + _discardSignalStatus = false; // reset signal status discard flag + XBMC->Log(LOG_DEBUG, "OpenLiveStream> stream file opened successfully"); + } + + _lostStream = false; // if we got to here, stream started ok + _lastStreamSize = 0; + _isStreamFileGrowing = true; + return true; // stream is up + } +} + +bool Pvr2Wmc::SwitchChannel(const PVR_CHANNEL &channel) +{ + CStdString request = "SwitchChannel|" + g_strClientName + Channel2String(channel); // request a live stream using channel + return _socketClient.GetBool(request, false); // try to open live stream, get path to stream file +} + +// read from the live stream file opened in OpenLiveStream +int Pvr2Wmc::ReadLiveStream(unsigned char *pBuffer, unsigned int iBufferSize) +{ + if (_lostStream) // if stream has already been flagged as lost, return 0 bytes + return 0; // after this happens a few time, xbmc will call CloseLiveStream + + if (!_streamWTV) // if NOT streaming wtv, make sure stream is big enough before it is read + { + int timeout = 0; // reset timeout counter + + // If we are trying to skip to an initial start position (eg we are watching an existing live stream + // in a multiple client scenario), we need to do it here, as the Seek command didnt work in OpenLiveStream, + // XBMC just started playing from the start of the file anyway. But once the stream is open, XBMC repeatedly + // calls ReadLiveStream and a Seek() command done here DOES get actioned. + // + // So the first time we come in here, we can Seek() to our desired start offset. + // + // However I found the XBMC demuxer makes an initial pass first and then sets the position back to 0 again and makes a 2nd pass, + // So we actually need to Seek() to our initial start position more than once. Because there are other situations where we can end up + // at the start of the file (such as the user rewinding) the easiest option at this point is to simply assume the demuxer makes 2 passes, + // and to reset the Seek position twice before clearing the stored value and thus no longer performing the reset. + + // Seek to initial file position if OpenLiveStream stored a starting offset and we are at position 0 (start of the file) + if (_initialStreamPosition > 0 && PositionLiveStream() == 0) + { + long long newPosition = XBMC->SeekFile(_streamFile, _initialStreamPosition, SEEK_SET); + if (newPosition == _initialStreamPosition) + { + XBMC->Log(LOG_DEBUG, "ReadLiveStream> stream file seek to initial position %llu successful", _initialStreamPosition); + } + else + { + XBMC->Log(LOG_DEBUG, "ReadLiveStream> stream file seek to initial position %llu failed (new position: %llu)", _initialStreamPosition, newPosition); + } + + _initialStreamResetCnt++; + if (_initialStreamResetCnt >= 2) + { + _initialStreamPosition = 0; // reset stored value to 0 once we have performed 2 resets (2 pass demuxer) + } + } + + long long totalRead = PositionLiveStream(); // get the current file position + + long long fileSize = _lastStreamSize; // use the last fileSize found, rather than querying host + + if (_isStreamFileGrowing && totalRead + iBufferSize > fileSize) // if its not big enough for the readsize + fileSize = ActualFileSize(timeout); // get the current size of the stream file + + // if the stream file is growing, see if the stream file is big enough to accomodate this read + // if its not, wait until it is + while (_isStreamFileGrowing && totalRead + iBufferSize > fileSize) + { + usleep(600000); // wait a little (600ms) before we try again + timeout++; + fileSize = ActualFileSize(timeout); // get new file size after delay + + if (!_isStreamFileGrowing) // if streamfile is no longer growing... + { + if (CheckErrorOnServer()) // see if server says there is an error + { + _lostStream = true; // if an error was posted, close the stream down + return -1; + } + else + break; // terminate loop since stream file isn't growing no sense in waiting + } + else if (fileSize == -1) // if fileSize -1, server is reporting an 'unkown' error with the stream + { + XBMC->QueueNotification(QUEUE_ERROR, XBMC->GetLocalizedString(30003)); // display generic error with stream + XBMC->Log(LOG_DEBUG, "live tv error, server reported error"); + _lostStream = true; // flag that stream is down + return -1; + } + + if (timeout > 50 ) // if after 30 sec the file has not grown big enough, timeout + { + _lostStream = true; // flag that stream is down + if (totalRead == 0 && fileSize == 0) // if no data was ever read, assume no video signal + { + XBMC->QueueNotification(QUEUE_ERROR, XBMC->GetLocalizedString(30004)); + XBMC->Log(LOG_DEBUG, "no video found for stream"); + } + else // a mysterious reason caused timeout + { + XBMC->QueueNotification(QUEUE_ERROR, XBMC->GetLocalizedString(30003)); // otherwise display generic error + XBMC->Log(LOG_DEBUG, "live tv timed out, unknown reason"); + } + return -1; // this makes xbmc call closelivestream + } + } + } + + // read from stream file + unsigned int lpNumberOfBytesRead = XBMC->ReadFile(_streamFile, pBuffer, iBufferSize); + + return lpNumberOfBytesRead; +} + +// see if server posted an error for this client +// if server has not posted an error, return False +bool Pvr2Wmc::CheckErrorOnServer() +{ + if (!IsServerDown()) + { + CStdString request; + request.Format("CheckError"); + //request.Format("CheckError|%d|%d|%d", checkCnt, (long)streamPos, (long)streamfileSize); + vector results = _socketClient.GetVector(request, true); // see if server posted an error for active stream + return isServerError(results); + } + return false; +} + +//#define SEEK_SET 0 +//#define SEEK_CUR 1 +//#define SEEK_END 2 +long long Pvr2Wmc::SeekLiveStream(long long iPosition, int iWhence /* = SEEK_SET */) +{ + int64_t lFilePos = 0; + if (_streamFile != 0) + { + lFilePos = XBMC->SeekFile(_streamFile, iPosition, iWhence); + } + return lFilePos; +} + +// return the current file pointer position +long long Pvr2Wmc::PositionLiveStream(void) +{ + int64_t lFilePos = -1; + if (_streamFile != 0) + { + lFilePos = XBMC->GetFilePosition(_streamFile); + } + return lFilePos; +} + +long long Pvr2Wmc::ActualFileSize(int count) +{ + long long lFileSize = 0; + + if (_lostStream) // if stream was lost, return 0 file size (may not be needed) + return 0; + + if (!_isStreamFileGrowing) // if stream file is no longer growing, return the last stream size + { + lFileSize = _lastStreamSize; + } + else + { + CStdString request; + request.Format("StreamFileSize|%d", count); // request stream size form client, passing number of consecutive queries + lFileSize = _socketClient.GetLL(request, true); + + if (lFileSize < -1) // if server returns a negative file size, it means the stream file is no longer growing (-1 => error) + { + lFileSize = -lFileSize; // make stream file length positive + _isStreamFileGrowing = false; // flag that stream file is no longer growing + } + _lastStreamSize = lFileSize; // save this stream size + } + return lFileSize; +} + +// return the length of the current stream file +long long Pvr2Wmc::LengthLiveStream(void) +{ + if (_lastStreamSize > 0) + return _lastStreamSize; + return -1; +} + +void Pvr2Wmc::PauseStream(bool bPaused) +{ +} + +bool Pvr2Wmc::CloseLiveStream(bool notifyServer /*=true*/) +{ + if (IsServerDown()) + return false; + + if (_streamFile != 0) // if file is still open, close it + XBMC->CloseFile(_streamFile); + + _streamFile = 0; // file handle now closed + _streamFileName = ""; + + _lostStream = true; // for cleanliness + + if (notifyServer) + { + return _socketClient.GetBool("CloseLiveStream", false); // tell server to close down stream + } + else + return true; +} + +// this is only called if a recording is actively being recorded, xbmc detects this when the server +// doesn't enter a path in the strStreamURL field during a "GetRecordings" +bool Pvr2Wmc::OpenRecordedStream(const PVR_RECORDING &recording) +{ + if (IsServerDown()) + return false; + + _lostStream = true; // init + + // request an active recording stream + CStdString request;// = format("OpenRecordingStream|%s", recording.strRecordingId); + request.Format("OpenRecordingStream|%s", recording.strRecordingId); + vector results = _socketClient.GetVector(request, false); // try to open recording stream, get path to stream file + + if (isServerError(results)) // test if server reported an error + { + return false; + } + else + { + _streamFileName = results[0]; + _streamWTV = EndsWith(_streamFileName, "wtv"); // true if stream file is a wtv file + + if (results.size() > 1) + XBMC->Log(LOG_DEBUG, "OpenRecordedStream> rec stream type: " + results[1]); // either a 'passive' or 'active' WTV OR a TS file + + if (results.size() > 2) + XBMC->Log(LOG_DEBUG, "OpenRecordedStream> opening stream: " + results[2]); // log password safe path of client if available + else + XBMC->Log(LOG_DEBUG, "OpenRecordedStream> opening stream: " + _streamFileName); + + _streamFile = XBMC->OpenFile(_streamFileName.c_str(), 0); // open the video file for streaming, same handle + + if (!_streamFile) // something went wrong + { + CStdString lastError; +#ifdef TARGET_WINDOWS + int errorVal = GetLastError(); + lastError.Format("Error opening stream file, Win32 error code: %d", errorVal); +#else + lastError.Format("Error opening stream file"); +#endif + XBMC->Log(LOG_ERROR, lastError.c_str()); // log more info on error + _socketClient.GetBool("StreamStartError|" + _streamFileName, true); // tell server stream did not start + return false; + } + else + XBMC->Log(LOG_DEBUG, "OpenRecordedStream> stream file opened successfully"); + + _lostStream = false; // stream is open + _lastStreamSize = 0; + _isStreamFileGrowing = true; + + return true; // if we got to here, stream started ok + } +} + +PVR_ERROR Pvr2Wmc::SignalStatus(PVR_SIGNAL_STATUS &signalStatus) +{ + if (IsServerDown()) + return PVR_ERROR_SERVER_ERROR; + + if (!g_bSignalEnable || _discardSignalStatus) + { + return PVR_ERROR_NO_ERROR; + } + + static PVR_SIGNAL_STATUS cachedSignalStatus; + + // Only send request to backend every N times + if (_signalStatusCount-- <= 0) + { + // Reset count to throttle value + _signalStatusCount = g_signalThrottle; + + CStdString command; + command.Format("SignalStatus"); + + vector results = _socketClient.GetVector(command, true); // get results from server + + // strDeviceName, strDeviceStatus, strProvider, strService, strMux + // iSignal, dVideoBitrate, dAudioBitrate, Error + + if (isServerError(results)) // did the server do it? + { + return PVR_ERROR_SERVER_ERROR; // report "no error" so our error shows up + } + else + { + if (results.size() >= 9) + { + memset(&cachedSignalStatus, 0, sizeof(cachedSignalStatus)); + snprintf(signalStatus.strAdapterName, sizeof(signalStatus.strAdapterName), results[0]); + snprintf(signalStatus.strAdapterStatus, sizeof(signalStatus.strAdapterStatus), results[1]); + snprintf(signalStatus.strProviderName, sizeof(signalStatus.strProviderName), results[2]); + snprintf(signalStatus.strServiceName, sizeof(signalStatus.strServiceName), results[3]); + snprintf(signalStatus.strMuxName, sizeof(signalStatus.strMuxName), results[4]); + signalStatus.iSignal = atoi(results[5]) * 655.35; + signalStatus.dVideoBitrate = atof(results[6]); + signalStatus.dAudioBitrate = atof(results[7]); + + bool error = atoi(results[8]) == 1; + if (error) + { + // Backend indicates it can't provide SignalStatus for this channel + // Set flag to discard further attempts until a channel change + _discardSignalStatus = true; + } + } + } + } + + signalStatus = cachedSignalStatus; + return PVR_ERROR_NO_ERROR; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/pvr2wmc.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/pvr2wmc.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/pvr2wmc.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/pvr2wmc.h 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,114 @@ +#pragma once +/* +* Copyright (C) 2011 Pulse-Eight +* http://www.pulse-eight.com/ +* +* This Program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2, or (at your option) +* any later version. +* +* This Program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with XBMC; see the file COPYING. If not, write to +* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. +* http://www.gnu.org/copyleft/gpl.html +* +*/ + +#include +#include "platform/util/StdString.h" +#include "client.h" +#include "Socket.h" + +struct PVR_CHANNELGroup +{ + bool bRadio; + int iGroupId; + std::string strGroupName; + std::vector members; +}; + +class Pvr2Wmc +{ +public: + Pvr2Wmc(void); + virtual ~Pvr2Wmc(void); + + virtual bool IsServerDown(); + virtual void UnLoading(); + const char *GetBackendVersion(void); + + // channels + virtual int GetChannelsAmount(void); + virtual PVR_ERROR GetChannels(ADDON_HANDLE handle, bool bRadio); + + virtual int GetChannelGroupsAmount(void); + virtual PVR_ERROR GetChannelGroups(ADDON_HANDLE handle, bool bRadio); + virtual PVR_ERROR GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group); + + // epg + virtual PVR_ERROR GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart, time_t iEnd); + + // timers + virtual PVR_ERROR GetTimers(ADDON_HANDLE handle); + virtual PVR_ERROR AddTimer(const PVR_TIMER &timer); + virtual PVR_ERROR DeleteTimer(const PVR_TIMER &timer, bool bForceDelete); + virtual int GetTimersAmount(void); + + // recording files + virtual PVR_ERROR GetRecordings(ADDON_HANDLE handle); + PVR_ERROR DeleteRecording(const PVR_RECORDING &recording); + PVR_ERROR RenameRecording(const PVR_RECORDING &recording); + PVR_ERROR SetRecordingLastPlayedPosition(const PVR_RECORDING &recording, int lastplayedposition); + int GetRecordingLastPlayedPosition(const PVR_RECORDING &recording); + + // recording streams + bool OpenRecordedStream(const PVR_RECORDING &recording); + virtual int GetRecordingsAmount(void); + void UpdateRecordingTimer(int msec); + + // live tv + bool OpenLiveStream(const PVR_CHANNEL &channel); + bool CloseLiveStream(bool notifyServer = true); + int ReadLiveStream(unsigned char *pBuffer, unsigned int iBufferSize); + void PauseStream(bool bPaused); + long long SeekLiveStream(long long iPosition, int iWhence /* = SEEK_SET */) ; + long long PositionLiveStream(void) ; + bool SwitchChannel(const PVR_CHANNEL &channel); + long long LengthLiveStream(void) ; + long long ActualFileSize(int count); + PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS &signalStatus); + + bool CheckErrorOnServer(); + +private: + std::vector _groups; + std::vector _channels; + int _serverBuild; + time_t _iEpgStart; + CStdString _strDefaultIcon; + CStdString _strDefaultMovie; + CStdString Timer2String(const PVR_TIMER &xTmr); + CStdString Channel2String(const PVR_CHANNEL &xTmr); + + Socket _socketClient; + + int _signalStatusCount; // call backend for signal status every N calls (because XBMC calls every 1 second!) + bool _discardSignalStatus; // flag to discard signal status for channels where the backend had an error + + void* _streamFile; // handle to a streamed file + CStdString _streamFileName; // the name of the stream file + bool _lostStream; // set to true if stream is lost + + bool _streamWTV; // if true, stream wtv files + long long _lastStreamSize; // last value found for file stream + bool _isStreamFileGrowing; // true if server reports that a live/rec stream is still growing + + int _initialStreamResetCnt; // used to count how many times we reset the stream position (due to 2 pass demuxer) + long long _initialStreamPosition; // used to set an initial position (multiple clients watching the same live tv buffer) +}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/Socket.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/Socket.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/Socket.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/Socket.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,684 @@ +/* +* Copyright (C) 2005-2011 Team XBMC +* http://www.xbmc.org +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +*/ +#include "libXBMC_addon.h" +#include +#include "platform/os.h" +#include "client.h" +#include "Socket.h" + +#include "utilities.h" +#include "platform/util/timeutils.h" +#include "platform/threads/mutex.h" + +using namespace std; +using namespace ADDON; + +PLATFORM::CMutex m_mutex; + +/* Master defines for client control */ +//#define RECEIVE_TIMEOUT 6 //sec + +Socket::Socket(const enum SocketFamily family, const enum SocketDomain domain, const enum SocketType type, const enum SocketProtocol protocol) +{ + _sd = INVALID_SOCKET; + _family = family; + _domain = domain; + _type = type; + _protocol = protocol; + memset (&_sockaddr, 0, sizeof( _sockaddr ) ); + //set_non_blocking(1); +} + +Socket::Socket() +{ + // Default constructor, default settings + _sd = INVALID_SOCKET; + _family = af_inet; + _domain = pf_inet; + _type = sock_stream; + _protocol = tcp; + memset (&_sockaddr, 0, sizeof( _sockaddr ) ); +} + +Socket::~Socket() +{ + close(); +} + +bool Socket::setHostname ( const CStdString& host ) +{ + if (isalpha(host.c_str()[0])) + { + // host address is a name + struct hostent *he = NULL; + if ((he = gethostbyname( host.c_str() )) == 0) + { + errormessage( getLastError(), "Socket::setHostname"); + return false; + } + + _sockaddr.sin_addr = *((in_addr *) he->h_addr); + } + else + { + _sockaddr.sin_addr.s_addr = inet_addr(host.c_str()); + } + return true; +} + +bool Socket::close() +{ + if (is_valid()) + { + if (_sd != SOCKET_ERROR) +#ifdef TARGET_WINDOWS + closesocket(_sd); +#else + ::close(_sd); +#endif + _sd = INVALID_SOCKET; + osCleanup(); + return true; + } + return false; +} + +int _timeout = 0; + +bool Socket::create() +{ + if( is_valid() ) + { + close(); + } + + if(!osInit()) + { + return false; + } + + _sd = socket(_family, _type, _protocol ); + //0 indicates that the default protocol for the type selected is to be used. + //For example, IPPROTO_TCP is chosen for the protocol if the type was set to + //SOCK_STREAM and the address family is AF_INET. + + if (_sd == INVALID_SOCKET) + { + errormessage( getLastError(), "Socket::create" ); + return false; + } + + // if requested set a timeout for receiving data + if (_timeout != 0) + { + struct timeval tv; + + tv.tv_sec = _timeout; // set the receive timeout desired + tv.tv_usec = 0; // Not init'ing this can cause strange errors + setsockopt(_sd, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv,sizeof(struct timeval)); // set a receive timeout for this new socket + _timeout = 0; // reset to default state of no timeout + } + + return true; +} + +int Socket::send( const CStdString& data ) +{ + if (!is_valid()) + { + return 0; + } + + int status = Socket::send( (const char*) data.c_str(), (const unsigned int) data.size()); + + return status; +} + +int Socket::send ( const char* data, const unsigned int len ) +{ + fd_set set_w, set_e; + struct timeval tv; + int result; + + if (!is_valid()) + { + return 0; + } + + // fill with new data + tv.tv_sec = 0; + tv.tv_usec = 0; + + FD_ZERO(&set_w); + FD_ZERO(&set_e); + FD_SET(_sd, &set_w); + FD_SET(_sd, &set_e); + + result = select(FD_SETSIZE, &set_w, NULL, &set_e, &tv); + + if (result < 0) + { + XBMC->Log(LOG_ERROR, "Socket::send - select failed"); + _sd = INVALID_SOCKET; + return 0; + } + if (FD_ISSET(_sd, &set_w)) + { + XBMC->Log(LOG_ERROR, "Socket::send - failed to send data"); + _sd = INVALID_SOCKET; + return 0; + } + + int status = ::send(_sd, data, len, 0 ); + + if (status == -1) + { + errormessage( getLastError(), "Socket::send"); + XBMC->Log(LOG_ERROR, "Socket::send - failed to send data"); + _sd = INVALID_SOCKET; + } + return status; +} + +//Receive until error or \n +bool Socket::ReadResponses(int &code, vector &lines) +{ + int result; + char buffer[4096]; // this buff size has to be known in server + code = 0; + + bool readComplete = false; + CStdString bigString = ""; + + do + { + result = recv(_sd, buffer, sizeof(buffer) - 1, 0); + if (result < 0) // if result is negative, the socket is bad + { +#ifdef TARGET_WINDOWS + int errorCode = WSAGetLastError(); + XBMC->Log(LOG_DEBUG, "ReadResponse ERROR - recv failed, Err: %d", errorCode); +#else + XBMC->Log(LOG_DEBUG, "ReadResponse ERROR - recv failed"); +#endif + code = 1; + _sd = INVALID_SOCKET; + return false; + } + + if (result > 0) // if we got data from the server in this last pass + { + buffer[result] = 0; // insert end of string marker + bigString.append(buffer); // accumulate all the reads + } + + } while (result > 0); // keep reading until result returns '0', meaning server is done sending reponses + + if (EndsWith(bigString, "")) + { + readComplete = true; // all server data has benn read + lines = split(bigString, "", true); // split each reponse by delimiters + lines.erase(lines.end() - 1); // erase at end + } + else + { + XBMC->Log(LOG_DEBUG, "ReadResponse ERROR - in read reponses not found"); + _sd = INVALID_SOCKET; + } + + + return readComplete; +} + +bool Socket::connect ( const CStdString& host, const unsigned short port ) +{ + if ( !is_valid() ) + { + return false; + } + + _sockaddr.sin_family = (sa_family_t) _family; + _sockaddr.sin_port = htons ( port ); + + if ( !setHostname( host ) ) + { + XBMC->Log(LOG_ERROR, "Socket::setHostname(%s) failed.\n", host.c_str()); + return false; + } + + int status = ::connect ( _sd, reinterpret_cast(&_sockaddr), sizeof ( _sockaddr ) ); + + if ( status == SOCKET_ERROR ) + { + XBMC->Log(LOG_ERROR, "Socket::connect %s:%u\n", host.c_str(), port); + errormessage( getLastError(), "Socket::connect" ); + return false; + } + + return true; +} + +bool Socket::reconnect() +{ + if ( _sd != INVALID_SOCKET ) + { + return true; + } + + if( !create() ) + return false; + + int status = ::connect ( _sd, reinterpret_cast(&_sockaddr), sizeof ( _sockaddr ) ); + + if ( status == SOCKET_ERROR ) + { + errormessage( getLastError(), "Socket::connect" ); + return false; + } + + return true; +} + +bool Socket::is_valid() const +{ + return (_sd != INVALID_SOCKET); +} + +#if defined(TARGET_WINDOWS) +bool Socket::set_non_blocking ( const bool b ) +{ + u_long iMode; + + if ( b ) + iMode = 1; // enable non_blocking + else + iMode = 0; // disable non_blocking + + if (ioctlsocket(_sd, FIONBIO, &iMode) == -1) + { + XBMC->Log(LOG_ERROR, "Socket::set_non_blocking - Can't set socket condition to: %i", iMode); + return false; + } + + return true; +} + +void Socket::errormessage( int errnum, const char* functionname) const +{ + const char* errmsg = NULL; + + switch (errnum) + { + case WSANOTINITIALISED: + errmsg = "A successful WSAStartup call must occur before using this function."; + break; + case WSAENETDOWN: + errmsg = "The network subsystem or the associated service provider has failed"; + break; + case WSA_NOT_ENOUGH_MEMORY: + errmsg = "Insufficient memory available"; + break; + case WSA_INVALID_PARAMETER: + errmsg = "One or more parameters are invalid"; + break; + case WSA_OPERATION_ABORTED: + errmsg = "Overlapped operation aborted"; + break; + case WSAEINTR: + errmsg = "Interrupted function call"; + break; + case WSAEBADF: + errmsg = "File handle is not valid"; + break; + case WSAEACCES: + errmsg = "Permission denied"; + break; + case WSAEFAULT: + errmsg = "Bad address"; + break; + case WSAEINVAL: + errmsg = "Invalid argument"; + break; + case WSAENOTSOCK: + errmsg = "Socket operation on nonsocket"; + break; + case WSAEDESTADDRREQ: + errmsg = "Destination address required"; + break; + case WSAEMSGSIZE: + errmsg = "Message too long"; + break; + case WSAEPROTOTYPE: + errmsg = "Protocol wrong type for socket"; + break; + case WSAENOPROTOOPT: + errmsg = "Bad protocol option"; + break; + case WSAEPFNOSUPPORT: + errmsg = "Protocol family not supported"; + break; + case WSAEAFNOSUPPORT: + errmsg = "Address family not supported by protocol family"; + break; + case WSAEADDRINUSE: + errmsg = "Address already in use"; + break; + case WSAECONNRESET: + errmsg = "Connection reset by peer"; + break; + case WSAHOST_NOT_FOUND: + errmsg = "Authoritative answer host not found"; + break; + case WSATRY_AGAIN: + errmsg = "Nonauthoritative host not found, or server failure"; + break; + case WSAEISCONN: + errmsg = "Socket is already connected"; + break; + case WSAETIMEDOUT: + errmsg = "Connection timed out"; + break; + case WSAECONNREFUSED: + errmsg = "Connection refused"; + break; + case WSANO_DATA: + errmsg = "Valid name, no data record of requested type"; + break; + default: + errmsg = "WSA Error"; + } + XBMC->Log(LOG_ERROR, "%s: (Winsock error=%i) %s\n", functionname, errnum, errmsg); +} + +int Socket::getLastError() const +{ + return WSAGetLastError(); +} + +int Socket::win_usage_count = 0; //Declared static in Socket class + +bool Socket::osInit() +{ + win_usage_count++; + // initialize winsock: + if (WSAStartup(MAKEWORD(2,2),&_wsaData) != 0) + { + return false; + } + + WORD wVersionRequested = MAKEWORD(2,2); + + // check version + if (_wsaData.wVersion != wVersionRequested) + { + return false; + } + + return true; +} + +void Socket::osCleanup() +{ + win_usage_count--; + if(win_usage_count == 0) + { + WSACleanup(); + } +} + +#elif defined TARGET_LINUX || defined TARGET_DARWIN || defined TARGET_FREEBSD +bool Socket::set_non_blocking ( const bool b ) +{ + int opts; + + opts = fcntl(_sd, F_GETFL); + + if ( opts < 0 ) + { + return false; + } + + if ( b ) + opts = ( opts | O_NONBLOCK ); + else + opts = ( opts & ~O_NONBLOCK ); + + if(fcntl (_sd , F_SETFL, opts) == -1) + { + XBMC->Log(LOG_ERROR, "Socket::set_non_blocking - Can't set socket flags to: %i", opts); + return false; + } + return true; +} + +void Socket::errormessage( int errnum, const char* functionname) const +{ + const char* errmsg = NULL; + + switch ( errnum ) + { + case EAGAIN: //same as EWOULDBLOCK + errmsg = "EAGAIN: The socket is marked non-blocking and the requested operation would block"; + break; + case EBADF: + errmsg = "EBADF: An invalid descriptor was specified"; + break; + case ECONNRESET: + errmsg = "ECONNRESET: Connection reset by peer"; + break; + case EDESTADDRREQ: + errmsg = "EDESTADDRREQ: The socket is not in connection mode and no peer address is set"; + break; + case EFAULT: + errmsg = "EFAULT: An invalid userspace address was specified for a parameter"; + break; + case EINTR: + errmsg = "EINTR: A signal occurred before data was transmitted"; + break; + case EINVAL: + errmsg = "EINVAL: Invalid argument passed"; + break; + case ENOTSOCK: + errmsg = "ENOTSOCK: The argument is not a valid socket"; + break; + case EMSGSIZE: + errmsg = "EMSGSIZE: The socket requires that message be sent atomically, and the size of the message to be sent made this impossible"; + break; + case ENOBUFS: + errmsg = "ENOBUFS: The output queue for a network interface was full"; + break; + case ENOMEM: + errmsg = "ENOMEM: No memory available"; + break; + case EPIPE: + errmsg = "EPIPE: The local end has been shut down on a connection oriented socket"; + break; + case EPROTONOSUPPORT: + errmsg = "EPROTONOSUPPORT: The protocol type or the specified protocol is not supported within this domain"; + break; + case EAFNOSUPPORT: + errmsg = "EAFNOSUPPORT: The implementation does not support the specified address family"; + break; + case ENFILE: + errmsg = "ENFILE: Not enough kernel memory to allocate a new socket structure"; + break; + case EMFILE: + errmsg = "EMFILE: Process file table overflow"; + break; + case EACCES: + errmsg = "EACCES: Permission to create a socket of the specified type and/or protocol is denied"; + break; + case ECONNREFUSED: + errmsg = "ECONNREFUSED: A remote host refused to allow the network connection (typically because it is not running the requested service)"; + break; + case ENOTCONN: + errmsg = "ENOTCONN: The socket is associated with a connection-oriented protocol and has not been connected"; + break; + //case E: + // errmsg = ""; + // break; + default: + break; + } + XBMC->Log(LOG_ERROR, "%s: (errno=%i) %s\n", functionname, errnum, errmsg); +} + +int Socket::getLastError() const +{ + return errno; +} + +bool Socket::osInit() +{ + // Not needed for Linux + return true; +} + +void Socket::osCleanup() +{ + // Not needed for Linux +} +#endif //TARGET_WINDOWS || TARGET_LINUX || TARGET_DARWIN || TARGET_FREEBSD + + +void Socket::SetServerName(CStdString strServerName) +{ + _serverName = strServerName; +} + +void Socket::SetClientName(CStdString strClientName) +{ + _clientName = strClientName; +} + +void Socket::SetServerPort(int port) +{ + _port = port; +} + +int Socket::SendRequest(CStdString requestStr) +{ + CStdString sRequest; + sRequest.Format("%s|%s", _clientName.c_str(), requestStr.c_str()); // build the request string + int status = send(sRequest); + return status; +} + +// set a timeout for the next socket operation called, otherwise no timout is set +void Socket::SetTimeOut(int tSec) +{ + _timeout = tSec; +} + +std::vector Socket::GetVector(const CStdString &request, bool allowRetry) +{ + int maxAttempts = 3; + int sleepAttempts = 1000; + + PLATFORM::CLockObject lock(m_mutex); // only process one request at a time + + int code; + std::vector reponses; + + int cntAttempts = 1; + while (cntAttempts <= maxAttempts) + { + XBMC->Log(LOG_DEBUG, "Socket::GetVector> Send request \"%s\"", request.c_str()); + reponses.clear(); + + if (!create()) // create the socket + { + XBMC->Log(LOG_ERROR, "Socket::GetVector> error could not create socket"); + reponses.push_back("SocketError"); // set a SocketError message (not fatal) + } + else // socket created OK + { + if (!connect(_serverName, (unsigned short)_port)) // if this fails, it is likely due to server down + { + XBMC->Log(LOG_ERROR, "Socket::GetVector> Server is down"); + reponses.push_back("ServerDown"); // set a server down error message (not fatal) + } + else // connected to server + { + int bytesSent = SendRequest(request.c_str()); // send request to server + + if (bytesSent > 0) // if request was sent successfully + { + if (!ReadResponses(code, reponses)) + { + XBMC->Log(LOG_ERROR, "Socket::GetVector> error getting responses"); + reponses.clear(); + reponses.push_back("SocketError"); + } + else + { + break; + } + } + else // error sending request + { + XBMC->Log(LOG_ERROR, "Socket::GetVector> error sending server request"); + reponses.push_back("SocketError"); + } + } + } + + if (!allowRetry) + { + break; + } + + cntAttempts++; + XBMC->Log(LOG_DEBUG, "Socket::GetVector> Retrying in %ims", sleepAttempts); + usleep(sleepAttempts); + } + + close(); // close socket + return reponses; // return responses +} + +CStdString Socket::GetString(const CStdString &request, bool allowRetry) +{ + std::vector result = GetVector(request, allowRetry); + return result[0]; +} + +bool Socket::GetBool(const CStdString &request, bool allowRetry) +{ + return GetString(request, allowRetry) == "True"; +} + + +int Socket::GetInt(const CStdString &request, bool allowRetry) +{ + CStdString valStr = GetString(request, allowRetry); + long val = strtol(valStr, 0, 10); + return val; +} + +long long Socket::GetLL(const CStdString &request, bool allowRetry) +{ + CStdString valStr = GetString(request, allowRetry); +#ifdef TARGET_WINDOWS + long long val = _strtoi64(valStr, 0, 10); +#else + long long val = strtoll(valStr, NULL, 10); +#endif + return val; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/Socket.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/Socket.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/Socket.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/Socket.h 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,275 @@ +/* + * Copyright (C) 2005-2011 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + + +//Include platform specific datatypes, header files, defines and constants: +#if defined TARGET_WINDOWS + #define WIN32_LEAN_AND_MEAN // Enable LEAN_AND_MEAN support + #pragma warning(disable:4005) // Disable "warning C4005: '_WINSOCKAPI_' : macro redefinition" + #include + #pragma warning(default:4005) + #include + + #ifndef NI_MAXHOST + #define NI_MAXHOST 1025 + #endif + + #ifndef socklen_t + typedef int socklen_t; + #endif + #ifndef ipaddr_t + typedef unsigned long ipaddr_t; + #endif + #ifndef port_t + typedef unsigned short port_t; + #endif + #ifndef sa_family_t + #define sa_family_t ADDRESS_FAMILY + #endif +#elif defined TARGET_LINUX || defined TARGET_DARWIN || defined TARGET_FREEBSD +#ifdef SOCKADDR_IN +#undef SOCKADDR_IN +#endif + #include /* for socket,connect */ + #include /* for socket,connect */ + #include /* for Unix socket */ + #include /* for inet_pton */ + #include /* for gethostbyname */ + #include /* for htons */ + #include /* for read, write, close */ + #include + #include + + typedef int SOCKET; + typedef sockaddr SOCKADDR; + typedef sockaddr_in SOCKADDR_IN; + #ifndef INVALID_SOCKET + #define INVALID_SOCKET (-1) + #endif + #define SOCKET_ERROR (-1) +#else + #error Platform specific socket support is not yet available on this platform! +#endif + +using namespace std; + +#include + +#define MAXCONNECTIONS 1 ///< Maximum number of pending connections before "Connection refused" +#define MAXRECV 1500 ///< Maximum packet size + +enum SocketFamily +{ + #ifdef CONFIG_SOCKET_IPV6 + af_inet6 = AF_INET6, + af_unspec = AF_UNSPEC, ///< Either INET or INET6 + #endif + af_inet = AF_INET +}; + +enum SocketDomain +{ + #if defined TARGET_LINUX || defined TARGET_DARWIN || defined TARGET_FREEBSD + pf_unix = PF_UNIX, + pf_local = PF_LOCAL, + #endif + #ifdef CONFIG_SOCKET_IPV6 + pf_inet6 = PF_INET6, + pf_unspec = PF_UNSPEC, //< Either INET or INET6 + #endif + pf_inet = PF_INET +}; + +enum SocketType +{ + sock_stream = SOCK_STREAM, + sock_dgram = SOCK_DGRAM +}; + +enum SocketProtocol +{ + tcp = IPPROTO_TCP, + udp = IPPROTO_UDP + #ifdef CONFIG_SOCKET_IPV6 + , ipv6 = IPPROTO_IPV6 + #endif +}; + +class Socket +{ + public: + + /*! + * An unconnected socket may be created directly on the local + * machine. The socket type (SOCK_STREAM, SOCK_DGRAM) and + * protocol may also be specified. + * If the socket cannot be created, an exception is thrown. + * + * \param family Socket family (IPv4 or IPv6) + * \param domain The domain parameter specifies a communications domain within which communication will take place; + * this selects the protocol family which should be used. + * \param type base type and protocol family of the socket. + * \param protocol specific protocol to apply. + */ + Socket(const enum SocketFamily family, const enum SocketDomain domain, const enum SocketType type, const enum SocketProtocol protocol = tcp); + Socket(void); + virtual ~Socket(); + + //Socket settings + + /*! + * Socket setFamily + * \param family Can be af_inet or af_inet6. Default: af_inet + */ + void setFamily(const enum SocketFamily family) + { + _family = family; + }; + + /*! + * Socket setDomain + * \param domain Can be pf_unix, pf_local, pf_inet or pf_inet6. Default: pf_inet + */ + void setDomain(const enum SocketDomain domain) + { + _domain = domain; + }; + + /*! + * Socket setType + * \param type Can be sock_stream or sock_dgram. Default: sock_stream. + */ + void setType(const enum SocketType type) + { + _type = type; + }; + + /*! + * Socket setProtocol + * \param protocol Can be tcp or udp. Default: tcp. + */ + void setProtocol(const enum SocketProtocol protocol) + { + _protocol = protocol; + }; + + /*! + * Socket setPort + * \param port port number for socket communication + */ + void setPort (const unsigned short port) + { + _sockaddr.sin_port = htons ( port ); + }; + + bool setHostname ( const CStdString& host ); + + // Server initialization + + /*! + * Socket create + * Create a new socket + * \return True if succesful + */ + bool create(); + + /*! + * Socket close + * Close the socket + * \return True if succesful + */ + bool close(); + + /*! + * Socket bind + */ + //bool bind ( const unsigned short port ); + //bool listen() const; + //bool accept ( Socket& socket ) const; + + // Client initialization + bool connect ( const CStdString& host, const unsigned short port ); + + bool reconnect(); + + // Data Transmission + + /*! + * Socket send function + * + * \param data Reference to a std::string with the data to transmit + * \return Number of bytes send or -1 in case of an error + */ + int send ( const CStdString& data ); + + /*! + * Socket send function + * + * \param data Pointer to a character array of size 'size' with the data to transmit + * \param size Length of the data to transmit + * \return Number of bytes send or -1 in case of an error + */ + int send ( const char* data, const unsigned int size ); + + bool set_non_blocking ( const bool ); + + bool ReadResponses(int &code, vector &lines); + + bool is_valid() const; + + private: + + SOCKET _sd; ///< Socket Descriptor + SOCKADDR_IN _sockaddr; ///< Socket Address + + enum SocketFamily _family; ///< Socket Address Family + enum SocketProtocol _protocol; ///< Socket Protocol + enum SocketType _type; ///< Socket Type + enum SocketDomain _domain; ///< Socket domain + + #ifdef TARGET_WINDOWS + WSADATA _wsaData; ///< Windows Socket data + static int win_usage_count; ///< Internal Windows usage counter used to prevent a global WSACleanup when more than one Socket object is used + #endif + + void errormessage( int errornum, const char* functionname = NULL) const; + int getLastError(void) const; + bool osInit(); + void osCleanup(); + + // client interface + private: + CStdString _serverName; + CStdString _clientName; + int _port; + int SendRequest(CStdString requestStr); + public: + void SetServerName(CStdString strServerName); + void SetClientName(CStdString strClientName); + void SetServerPort(int port); + std::vector GetVector(const CStdString &request, bool allowRetry); + CStdString GetString(const CStdString &request, bool allowRetry); + bool GetBool(const CStdString &request, bool allowRetry); + int GetInt(const CStdString &request, bool allowRetry); + long long GetLL(const CStdString &request, bool allowRetry); + + void SetTimeOut(int tSec); +}; + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/utilities.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/utilities.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/utilities.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/utilities.cpp 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,59 @@ + +#include "tinyxml/XMLUtils.h" +#include "utilities.h" + +#include +#include +#include +#ifdef TARGET_WINDOWS + #include +#else + #include +#endif + +// format related string functions taken from: +// http://www.flipcode.com/archives/Safe_sprintf.shtml + +bool Str2Bool(const CStdString str) +{ + return str.compare("True") == 0 ? true:false; +} + +std::vector split(const CStdString& s, const CStdString& delim, const bool keep_empty) { + std::vector result; + if (delim.empty()) { + result.push_back(s); + return result; + } + CStdString::const_iterator substart = s.begin(), subend; + while (true) { + subend = search(substart, s.end(), delim.begin(), delim.end()); + CStdString temp(substart, subend); + if (keep_empty || !temp.empty()) { + result.push_back(temp); + } + if (subend == s.end()) { + break; + } + substart = subend + delim.size(); + } + return result; +} + +bool EndsWith(CStdString const &fullString, CStdString const &ending) +{ + if (fullString.length() >= ending.length()) { + return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending)); + } else { + return false; + } +} + +bool StartsWith(CStdString const &fullString, CStdString const &starting) +{ + if (fullString.length() >= starting.length()) { + return (0 == fullString.compare(0, starting.length(), starting)); + } else { + return false; + } +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/utilities.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/utilities.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/addons/pvr.wmc/src/utilities.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/src/utilities.h 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,13 @@ +#pragma once + +#include +#include + + +std::vector split(const CStdString& s, const CStdString& delim, const bool keep_empty = true); + +bool Str2Bool(const CStdString str); + +bool EndsWith(CStdString const &fullString, CStdString const &ending); +bool StartsWith(CStdString const &fullString, CStdString const &starting); + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/configure.ac xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/configure.ac --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/configure.ac 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/configure.ac 2014-05-04 06:40:43.000000000 +0000 @@ -22,13 +22,6 @@ [use_release=$enableval], [use_release=no]) -### External libraries options -AC_ARG_ENABLE([external-ffmpeg], - [AS_HELP_STRING([--enable-external-ffmpeg], - [enable use of external ffmpeg libraries (default is no) 'Linux only'])], - [use_external_ffmpeg=$enableval], - [use_external_ffmpeg=no]) - ### External dependencies option AC_ARG_ENABLE([addons-with-dependencies], [AS_HELP_STRING([--enable-addons-with-dependencies], @@ -48,10 +41,6 @@ fi AC_CHECK_PROG(HAVE_PKG_CONFIG, pkg-config, yes) -if test "x$HAVE_PKG_CONFIG" != "xyes" ; then - AC_MSG_WARN([pkg-config was not found on your system. external ffmpeg will be disabled]) - use_external_ffmpeg="no" -fi OS="unknown" ARCHITECTURE="unknown" @@ -70,6 +59,13 @@ BIN_EXT=".so" BINPREFIX="lib" ;; + i*86-*-linux-android) + TARGET_LDFLAGS="-avoid-version -no-undefined" + OS="android" + ARCHITECTURE="i486" + BIN_EXT=".so" + BINPREFIX="lib" + ;; arm*-*-linux*) OS="linux" ARCHITECTURE="arm" @@ -115,28 +111,33 @@ ARCH_DEFINES="-DTARGET_POSIX -DTARGET_DARWIN -D_LINUX" DYN_LIB_EXT="dylib" ;; - *-freebsd*) + amd64-*-freebsd*) OS="freebsd" + ARCHITECTURE="x86_64" + ARCH_DEFINES="-DTARGET_POSIX -DTARGET_FREEBSD -D_LINUX" + ;; + i386-*-freebsd*) + OS="freebsd" + ARCHITECTURE="i486" ARCH_DEFINES="-DTARGET_POSIX -DTARGET_FREEBSD -D_LINUX" ;; esac ### External libraries checks -# FFmpeg -if test "$use_external_ffmpeg" = "yes"; then - PKG_CHECK_MODULES([FFMPEG], [libavcodec], - [FFMPEG_INCLUDES="$FFMPEG_CFLAGS"; LIBS="$LIBS $FFMPEG_LIBS"], - AC_MSG_ERROR(cannot find libavcodec)) - - # Possible places the ffmpeg headers may be - AC_CHECK_HEADERS([libavcodec/avcodec.h],[FFMPEG_INCLUDES="-I$($PKG_CONFIG --variable=includedir libavcodec)/libavcodec"], - [AC_CHECK_HEADERS([ffmpeg/avcodec.h],[FFMPEG_INCLUDES="-I$($PKG_CONFIG --variable=includedir libavcodec)/ffmpeg"], - [AC_MSG_ERROR(avcodec.h not found)]) - ]) - - echo "FFMPEG_INCLUDES: $FFMPEG_INCLUDES" +AC_CHECK_LIB([GL],[main],have_gl=yes, have_gl=no) +if test "$have_gl" = "yes"; then + AC_DEFINE([HAVE_GL],[1],["Define to 1 if we have gl"]) +fi +echo "GL: $have_gl" + +AC_CHECK_LIB([GLESv2],[main],[AC_CHECK_HEADER([GLES2/gl2.h], have_gles2=yes, have_gles2=no, )], have_gles2=no) +if test "$have_gles2" = "yes"; then + AC_DEFINE([HAVE_GLES2],[1],["Define to 1 if we have gles2"]) + AM_CONDITIONAL(HAVE_GLES2, true) +else + AM_CONDITIONAL(HAVE_GLES2, false) fi -AC_SUBST(FFMPEG_INCLUDES) +echo "GLES2: $have_gles2" ### End external Libraries @@ -270,6 +271,8 @@ lib/cmyth/Makefile \ lib/cmyth/libcmyth/Makefile \ lib/cmyth/librefmem/Makefile \ + lib/tinyxml2/Makefile \ + lib/libdvblinkremote/Makefile \ addons/Makefile \ addons/pvr.demo/Makefile \ addons/pvr.dvbviewer/Makefile \ @@ -281,6 +284,8 @@ addons/pvr.vuplus/Makefile \ addons/pvr.vdr.vnsi/Makefile \ addons/pvr.mythtv.cmyth/Makefile \ + addons/pvr.dvblink/Makefile \ + addons/pvr.wmc/Makefile \ addons/pvr.iptvsimple/Makefile \ addons/pvr.argustv/addon/addon.xml addons/pvr.demo/addon/addon.xml @@ -292,6 +297,8 @@ addons/pvr.njoy/addon/addon.xml addons/pvr.vdr.vnsi/addon/addon.xml addons/pvr.vuplus/addon/addon.xml + addons/pvr.dvblink/addon/addon.xml + addons/pvr.wmc/addon/addon.xml addons/pvr.iptvsimple/addon/addon.xml]) AC_OUTPUT diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/changelog xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/changelog --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/changelog 2013-12-13 13:17:34.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/changelog 2014-05-04 07:05:20.000000000 +0000 @@ -1,7 +1,124 @@ -xbmc-pvr-addons (1.0.0~git20131213.1417-e1c3fb1-0~saucy) saucy; urgency=high +xbmc-pvr-addons (1.0.0~git20140504.0903-2955e1d-0~saucy) saucy; urgency=high + + [manuel] + * [dvbviewer] pump version to 1.9.14 + + [manuel] + * [dvbviewer] don't use timezone offset for timers + + [manuel] + * [dvbviewer] tsbuffer: remove hungarian notations + + [manuel] + * [dvbviewer] reduce implicit calls to SwitchChannel + + [manuel] + * [dvbviewer] remove even more of the hungarian notations + + [manuel] + * [dvbviewer] remove more of the hungarian notations + + [manuel] + * [dvbviewer] implement low performance mode + + [manuel] + * [dvbviewer] don't fetch epg language any more + + [manuel] + * [dvbviewer] get rid of external XML parser library + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: move to own repo https://github.com/FernetMenta/vdr-plugin-vnsiserver + + + [manuel] + * [dvbviewer] pump version to 1.9.14 + + [manuel] + * [dvbviewer] don't use timezone offset for timers + + [manuel] + * [dvbviewer] tsbuffer: remove hungarian notations + + [manuel] + * [dvbviewer] reduce implicit calls to SwitchChannel + + [manuel] + * [dvbviewer] remove even more of the hungarian notations + + [manuel] + * [dvbviewer] remove more of the hungarian notations + + [manuel] + * [dvbviewer] implement low performance mode + + [manuel] + * [dvbviewer] don't fetch epg language any more + + [manuel] + * [dvbviewer] get rid of external XML parser library + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: move to own repo https://github.com/FernetMenta/vdr-plugin-vnsiserver + + + [manuel] + * [dvbviewer] pump version to 1.9.14 + + [manuel] + * [dvbviewer] don't use timezone offset for timers + + [manuel] + * [dvbviewer] tsbuffer: remove hungarian notations + + [manuel] + * [dvbviewer] reduce implicit calls to SwitchChannel + + [manuel] + * [dvbviewer] remove even more of the hungarian notations + + [manuel] + * [dvbviewer] remove more of the hungarian notations + + [manuel] + * [dvbviewer] implement low performance mode + + [manuel] + * [dvbviewer] don't fetch epg language any more + + [manuel] + * [dvbviewer] get rid of external XML parser library + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: move to own repo https://github.com/FernetMenta/vdr-plugin-vnsiserver + + + [Lars Op den Kamp] + * [pvr.hts] bump add-on version + + [Marcel Groothuis] + * [MediaPortal] Fixed: recording playback over rtsp in ffmpeg mode + + [Marcel Groothuis] + * [MediaPortal] Update Changelog and version number to v1.9.13 + + [Marcel Groothuis] + * [MediaPortal] Recordings: Check for in progress recordings and use play them always via the PVR addon + + [Marcel Groothuis] + * [MediaPortal] Properly close an ongoing timeshift when opening fails. + + [Marcel Groothuis] + * [MediaPortal] Add better debug/error logging [Marcel Groothuis] - * [MediaPortal] Update changelog and PVR addon version number + * [MediaPortal] Reduce the signal status calls to once every 10s. + + [Marcel Groothuis] + * [MediaPortal] Detect and report permission denied errors on Live/Recording access + + [Marcel Groothuis] + * [MediaPortal] Add missing GPL headers [Marcel Groothuis] * [MediaPortal] Check for command execution errors @@ -16,34 +133,454 @@ * [MediaPortal] Channel thumbnails: replace more invalid file name characters in the channel name by a _ [Marcel Groothuis] - * [MediaPortal] Better error logging on failures PVR addon version number increase + update changelog + * [MediaPortal] Fix gcc compiler and CPPcheck warnings [Marcel Groothuis] - * [MediaPortal] TSReader: Add translation functions to translate Windows and UNC paths to and from XBMC paths + * [MediaPortal] Enable fast channel switching by default. The already added PAT detection searches for the start of the new channel in the timeshift buffer file. - [Marcel Groothuis] - * [MediaPortal] TSReader: updated to return smb:// URI's instead of \UNC paths to XBMC (also for Windows) + [Fred Hoogduin] + * [argustv] Fix: use EPG data to retrieve original title, this improves timer conflict detection (much!) [argustv] Fix: threads now working as intented on OSX + + [Stefan Saraev] + * vnsi5: confluence color fixes + + [manuel] + * [dvbviewer] pump version to 1.9.14 + + [manuel] + * [dvbviewer] don't use timezone offset for timers + + [manuel] + * [dvbviewer] tsbuffer: remove hungarian notations + + [manuel] + * [dvbviewer] reduce implicit calls to SwitchChannel + + [manuel] + * [dvbviewer] remove even more of the hungarian notations + + [manuel] + * [dvbviewer] remove more of the hungarian notations + + [manuel] + * [dvbviewer] implement low performance mode + + [manuel] + * [dvbviewer] don't fetch epg language any more + + [manuel] + * [dvbviewer] get rid of external XML parser library + + [Rainer Hochecker] + * check for gl2 header when checking for GLES + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: move to own repo https://github.com/FernetMenta/vdr-plugin-vnsiserver + + [alanwww1] + * [lang] update of language files from Transifex + + [Sam Stenvall] + * [pvr.hts] populate channel icon for recordings + + [Chris "Koying" Browet] + * FIX: android x86 build + + [Rainer Hochecker] + * vnsi: allow protocol version of server to be higher + + [Rainer Hochecker] + * vnsi: bump version + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix thread priorities + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: correct flag for GetDevice, credits to manio + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: implement status msg channelchange + + [Rainer Hochecker] + * vnsi: add skin file for AEON NOX 5, thanks to BigNoid + + + [alanwww1] + * [lang] update of language files from Transifex + + [kendrak24] + * Implemented GetRecordingEdl for pvr.hts addon. + + [amet] + * [pvr.hts] fix issue where "client specific settings" window would not open + + [Fred Hoogduin] + * [argustv] added monitor thread to aggregate and handle ARGUS TV service events + + + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix compile error after vdr 2.1.4 + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: drop old debug logging + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: bump version to 0.9.4 + + [Rainer Hochecker] + * vnsi: bump version to 1.9.6 + + [Ryan Gribble] + * up Gotham addon version to 0.2.93 and update to new icon + + [Ryan Gribble] + * Add retry functionality, enabled only for Read operations Add guarding against incorrect number of fields in responses + + [Ryan Gribble] + * Implement Channel Groups + + [Bernhard Froehlich] + * Add FreeBSD defines to the Socket code + + [Bernhard Froehlich] + * Add ADDON_HELPER_ARCH for FreeBSD + + [Bernhard Froehlich] + * Teach configure how to distinguish between FreeBSD amd64 and i386 + + [Bernhard Froehlich] + * freebsd: Add FreeBSD platform to the addon.xml files + + [Christian Fetzer] + * [mythtv-cmyth] Release v1.9.14 + + [WiSo] + * [WIN32] fixed linking of pvr.dvblink + + [Rainer Hochecker] + * vnsi: update length of recording + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: update length of recording + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: detect latm and adts by parsing + + [Anton Fedchin] + * [iptvsimple] new version. see changelog.txt for details. + + + [Lars Op den Kamp] + * delete crap that shouldn't be in here + + [Sam Stenvall] + * fix some compiler warnings + + [Sam Stenvall] + * [pvr.hts] only add subtitle stream identifier for DVB subtitles + + [Sam Stenvall] + * don't ignore TEXTSUB streams + + [Sam Stenvall] + * always copy existing streams, otherwise stream property changes like language won't propagate + + [Sam Stenvall] + * reuse GetStreamId() so we can get rid of one operator overload + + [Sam Stenvall] + * add xbmc_codec_descriptor.hpp to reduce code duplication + + [Sam Stenvall] + * remove unused class definition + + [Sam Stenvall] + * refactoring xbmc_stream_utils.hpp completely in order to fix a bunch of outstanding issues. [Marcel Groothuis] - * [MediaPortal] Simplify and fix socket receive/send code + * [pvr.wmc] win32: Fix PVR addon DLL name in release build and remove unneeded build events [Marcel Groothuis] - * [MediaPortal] Add additional checks to prevent potential crashes + * [pvr.wmc] Windows: Fix @ARCHITECTURE@ replacement in addon.xml.in [Marcel Groothuis] - * [MediaPortal] TSReader: fix channel switching behavior when switching across tsbuffer files + * [pvr.wmc] Fix Windows release build + + [Rainer Hochecker] + * vnsi: fix build error on Windowns + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix incorrect language on audio and subs + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix latm, wrong codec name + + [Fred Hoogduin] + * [argustv] Create new timers based on default schedule retrieved from ARGUS server. Removed warnings about unused parameters in ADDON_Announce + + [Ryan Gribble] + * Add quotes to Platform project pre build event + + [Ryan Gribble] + * add build artefacts to gitignore file + + [Ryan Gribble] + * Add pvr.wmc addon to Makefile, configure, and VS solution + + [Ryan Gribble] + * Add pvr.wmc addon code to github and prepare for official XBMC repo + + [Fred Hoogduin] + * remove redundant Kai Toast + + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: check and reset modified flag for channels instead of looking at file + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: update change log + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix a bug in epg auto update + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: raise nice level for vnsi threads + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: do not set pts for dts on video streams + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: add channel filter + + [Rainer Hochecker] + * VNSI: add channel filter + + [dfdario] + * Update addon.xml.in + + [Rainer Hochecker] + * VNSI: adapt skin files to left, top instead of posx, posy + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: bump version to 0.9.3 + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: bump protocol version to 5 + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: add edl support + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: send buffer times for timeshift + + [Rainer Hochecker] + * VNSI: bump protocol version to 5 + + [Rainer Hochecker] + * VNSI: bump version to 1.9.5 + + [Rainer Hochecker] + * VNSI: add edl support + + [Rainer Hochecker] + * VNSI: add new timeshift functions + + [Graeme Blackley] + * - added dialog to set recurring recordings, including recurrence type, padding, number of recordings to keep, and recording directory - added support for EDL - added support for retrieving and storing last playback position - now requires NextPVR 3.1.1 or higher - fixed a bug that could cause an EPG event with no description to have a copy of last show's description, or cause a crash if the user was unlucky. - more flexible approach to genre + + + [Rainer Hochecker] + * VNSI: fix incorrect version of addon.gui + + [Rainer Hochecker] + * addongui: fix incorrect version + + + [Rainer Hochecker] + * nextpvr: add missing stubs after a4550db9372fac5521f03b01fa01dd4adfebd983 + + [Lars Op den Kamp] + * bump add-ons to 1.9.0. added stubs in dvblink + + [Lars Op den Kamp] + * sync copyright notices + + [Lars Op den Kamp] + * bump pvr add-ons to 1.9.0 + + [Rainer Hochecker] + * adapt addons to pvr api change, add timeshift buffer methods + + [Rainer Hochecker] + * sync pvr api with mainline repo + + [Sam Stenvall] + * populate service/provider name and mux in PVR_SIGNAL_STATUS + + [Christian Fetzer] + * [mythtv-cmyth] Release v1.8.13 + + [Fred Hoogduin] + * [argustv-fix] Fix deletion of recordings (regression); Improve the load time of all recordings; Cleanup and remove redundant code + + [Fred Hoogduin] + * Fixes playing recordings on Windows; All UNC share name versus CIFS name handling is now isolated into two methods + + [Stefan Saraev] + * vdr 2.1.2 buildfix + + [Palle Rosendahl Ehmsen] + * DVBLink Connect! Server PVR Addon + + + + + + + + + + [Rainer Hochecker] + * vnsi: fix loading on android by linking GLESv2 + + [Rainer Hochecker] + * vnsi: bump version to 1.8.4 + + [Rainer Hochecker] + * vnsi: add guilib as required addon xml + + [Rainer Hochecker] + * vnsi: fix wrong format specifier in error log + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix seeking, only consider audio and video streams for searching + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: FreeBSD patches, credits to Juergen Lock + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: check all timers for active recordings when opening a channel + + [Fred Hoogduin] + * [argustv-new] log the actual amount of time the TV server takes to tune, log the amount of time it takes to retreive the recordings + + [Fred Hoogduin] + * [argustv-new] Implementing the new integer id's now provided by ARGUS TV + + [Lars Op den Kamp] + * [hts] bump to 1.8.22 + + [Lars Op den Kamp] + * [hts] cosmetics + + [Lars Op den Kamp] + * [hts] use a timeout in CHTSPDemux::GetStreamProperties() so we don't block forever when we can't tune to a channel. closes #220 + + [Rainer Hochecker] + * fix potential wrong error code in posix socket + + [Rainer Hochecker] + * port socket fix from 918f59fbe26571f78231f380f3304fd164b19b10 to Windows [Marcel Groothuis] * [MediaPortal] Update TVServer enums and put them in the TvDatabase namespace [Marcel Groothuis] - * [MediaPortal] More verbose log messages + * [MediaPortal] Update genre translation table with missing strings (based on the id-to-string translation table in the MediaPortal epgDecoder sources) + + [Fred Hoogduin] + * [argustv-fix] Live-TV was not working on XBMC Gotham Windows + + [manuel] + * [dvbviewer] update changelog + + [manuel] + * [dvbviewer] fix channel numbers for favourites + + [manuel] + * [dvbviewer] make BuildExtURL work for schemes other than http/https + + [manuel] + * [dvbviewer] sync with PVR API v1.8.1 + + [manuel] + * [dvbviewer] avoid double encodes of format specifiers + + [manuel] + * [dvbviewer] use c_str() just to make sure + + [manuel] + * [dvbviewer] fix channel index in GenerateTimer + + [manuel] + * [dvbviewer] force channel sync on start + + [manuel] + * [dvbviewer] make RTSP working + + [manuel] + * [dvbviewer] require addon restart after changing usetimeshift/usertsp + + [manuel] + * [dvbviewer] avoid an unnecessary copy + + [manuel] + * [dvbviewer] fix possible crash + + [manuel] + * [dvbviewer] fix possible crash + + [manuel] + * [dvbviewer] make channel group creation more sane + + [manuel] + * [dvbviewer] rewrite channel + favourite list parsing + + [manuel] + * [dvbviewer] update delete record api url + + [manuel] + * [dvbviewer] get rid of some hungarian notation. more to follow + + [manuel] + * [dvbviewer] clean up dtor + + [manuel] + * [dvbviewer] rewrote recording parsing + + [manuel] + * [dvbviewer] use generic methods for building urls to backend + + [manuel] + * [dvbviewer] minor code cleanup + + [manuel] + * [dvbviewer] use RS api to get timezone/language + + [manuel] + * [dvbviewer] more method renaming to be in line with the PVR API + + [manuel] + * [dvbviewer] rename GetDeviceInfo to GetBackendVersion + + [manuel] + * [dvbviewer] remove signal status, fix version parsing + + [manuel] + * [dvbviewer] pump version to 1.8.10 + + [Anton Fedchin] + * [iptvsimple] Release v1.8.1 + + [Christian Fetzer] + * [mythtv-cmyth] Release v1.8.12 [Marcel Groothuis] - * [MediaPortal] Update genre translation table with missing strings (based on the id-to-string translation table in the MediaPortal epgDecoder sources) + * [MediaPortal] Debugging: Add/change log notifications [Marcel Groothuis] - * [MediaPortal] TSReader code cleanup + * [MediaPortal] Code cleanup: drop support for TVServerXBMC builds older than 1.x.x.107 [Marcel Groothuis] * [MediaPortal] Hide smb password in debug xbmc.log file @@ -52,149 +589,431 @@ * [MediaPortal] Added: support for retrieving channels from multiple specified groups (>1, < All groups) Requires at least TVServerXBMC 1.2.3.122 or 1.3.0.122 [Marcel Groothuis] - * [MediaPortal] TSReader: Show buffer file errors/changes in the debug log - - [Marcel Groothuis] - * [MediaPortal] iLastPlayedPosition is not available in Frodo's PVR_RECORDING struct + * [MediaPortal] use ADDON_STATUS return value in Connect() [Marcel Groothuis] - * [MediaPortal] use ADDON_STATUS return value in Connect() + * [MediaPortal] Fix possible out-of-bounds access on the m_cCards array [Marcel Groothuis] * [MediaPortal] changed CCards::ParseLines code a bit. One user experienced a crash inside this function. [Marcel Groothuis] - * [MediaPortal] cleanup: remove references to VTPTranceiver + * [MediaPortal] Trigger a recording list update when the backend couldn't find the selected recording [Marcel Groothuis] * [MediaPortal] Recordings: Add support for LastPlayedPosition (requires TVServerXBMC build 121 or higher) [Marcel Groothuis] - * [MediaPortal] TSReader: add PAT detection to find the start of the new channel in the timeshift buffer file. This should fix SD<->HD channel switching with "fast channel switching" enabled. + * [MediaPortal] simplify and cleanup receive code [Marcel Groothuis] - * [MediaPortal] Trigger a recording list update when the backend couldn't find the selected recording + * [MediaPortal] Update addon version number and changelog to 1.8.9 [Marcel Groothuis] - * [MediaPortal] disable RTSP pause (locks up XBMC on continue) + * [MediaPortal] TSReader: OnZap: Enable PAT change detection also on non-Windows systems [Marcel Groothuis] - * [MediaPortal] tsreader code cleanup + * [MediaPortal] TSReader: fix channel switching behavior when switching across tsbuffer files - [Stephan Raue] - * add support to build in a seperate builddir like OpenELEC does per standard with the new packageformat. For this its needed to change @abs_top_srcdir@ (the sourcedir) to @abs_top_builddir@ (the real builddir) and changing all relative paths to absolute paths with help of $(srcdir) in includes. + [Marcel Groothuis] + * [MediaPortal] TSReader: updated to return smb:// URI's instead of \UNC paths to XBMC (also for Windows) + [Marcel Groothuis] + * [MediaPortal] TSReader: Add translation functions to translate Windows and UNC paths to and from XBMC paths + [Marcel Groothuis] + * [MediaPortal] TSReader code cleanup - [Anton Fedchin] - * [iptvsimple] new pvr.iptvsimple addon. + [Marcel Groothuis] + * [MediaPortal] TSReader: add PAT detection to find the start of the new channel in the timeshift buffer file. This should fix SD<->HD channel switching with "fast channel switching" enabled. - [Christian Fetzer] - * [mythtv-cmyth] Release v1.6.10 - [Graeme Blackley] - * Fixed a bug that could cause an EPG event with no description to have a copy of last show's description, or cause a crash if the user was unlucky. - [Graeme Blackley] - * Fixed several bugs: - Reducing logging during live tv and playback of recordings. - Now explicitly telling backend when live tv viewing ends, rather than relying on detection of the socket closing. This solves a problem some users were having with live tv buffer files left on the disk. - Fixed broken genre. + [Rainer Hochecker] + * vnsi: bump version - [Fred Hoogduin] - * [argustv-fix] fixed error that occurred when adding a Timer with " in the title + [Rainer Hochecker] + * vnsi: fix ReadMessage + [Lars Op den Kamp] + * [hts] bump add-on version [Lars Op den Kamp] - * updated README for windows + * [hts] if we read less than 4 bytes in the initial packet size read, don't discard it but wait for the rest to come in within iDatapacketTimeout. issue #181 - [Adam Sutton] - * [tvheadend] fix return PTS when skipping + [Lars Op den Kamp] + * don't return early when poll failed, but do another read. issue #181 - [Adam Sutton] - * [tvheadend] update addon version info + [Lars Op den Kamp] + * [hts] tvheadend uses it's own byte order. don't use ntohl. credits @dezi. issue #181 - [Adam Sutton] - * [tvheadend] correct previous mistaken fix to webroot processing + [Lars Op den Kamp] + * return nb bytes read instead of the error code when data was read. credits @dezi. issue #181 - [Adam Sutton] - * [tvheadend] update subscriptionSeek call to use abs PTS + [Lars Op den Kamp] + * removed avcodec.h and use callback methods from XBMC to get codec IDs instead. removed external ffmpeg check + + + + [Rainer Hochecker] + * vnsi: fix Makefile.am, did not include all objs [Christian Fetzer] - * [mythtv-cmyth] Release v1.6.9 + * [mythtv-cmyth] win32: Add TARGET_WINDOWS for release builds - [Adam Sutton] - * [tvheadend] ensure timeshiftStatus does not spam logs + [Lars Op den Kamp] + * vnsi: fix compilation after 298fcd35917190edb72d8b6f9715c268aff494a4 + + [Anton Fedchin] + * [iptvsimple] new pvr.iptvsimple addon. - [Adam Sutton] - * [tvheadend] added working seek support. [Christian Fetzer] - * [mythtv-cmyth] Fix crash when starting Live TV after a failed attempt + * win32: Make sure that all addon projects define TARGET_WINDOWS - [Jörg Dembski] - * [vuplus]: increment version number in addon.xml.in + [Lars Op den Kamp] + * bump add-on versions after PVR API change - [Jörg Dembski] - * [vuplus]: Add several new features + [Lars Op den Kamp] + * sync pvr api headers + + [Christian Fetzer] + * sync: Adapt CallMenuHook to API change + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: do not assume a pes header right after pusi for video streams + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: h264 parser - reset stream data on error [Rainer Hochecker] - * vdr-plugin-vnsiserver: bump version + * vdr-plugin-vnsiserver: allow timeshift buffer in RAM to larger than 2 GB, change size_t to off_t - [Lucian Muresan] - * vdr-vnsiserver Makefile vdr-1.7.36 + [Rainer Hochecker] + * vdr-plugin-vnsiserver: silence compiler warning + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix layer for mpeg audio + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: squash to specific errors + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: present specific parser errors to user [Rainer Hochecker] - * vdr-plugin-vnsiserver: redesign for timeshift, revised parsers + * vdr-plugin-vnsiserver: fix potential segfault when reading incorrent pes header size [Rainer Hochecker] - * vdr-plugin-vnsiserver: revised socket + * vdr-plugin-vnsiserver: recplayer, drop NOATIME flag on open + + [xbmc] + * vnsi: disable callback PVRRecording, fixes deadlock [Rainer Hochecker] - * vdr-plugin-vnsiserver: osd - increase memory + * vdr-plugin-vnsiserver: increase max buffer size for pes packets [Rainer Hochecker] - * vdr-plugin-vnsiserver: trigger epg update + * vdr-plugin-vnsiserver: atsc does not suppport mpeg2 audio, interpret pmt accordingly + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix segfault when feeded with scrambled packets + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix occasional incorrect timestamps after 505336e0b99306f95199d00f65bd7ef7ec2a9371 + + [unknown] + * vnsi: correct vs project after adding dx + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix getting stuck by reading eof at end of segment + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: rework and fixes on video parsers + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix test harness + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: only observe pts wraps on audio and video streams + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: cleanup and fixes in pes parser + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: do not transmit packates older than first frame, avoids large disconts on start of playback + + [xbmc] + * vdr-plugin-vnsiserver: fix compile error for loder vdr versions + + [xbmc] + * vdr-plugin-vnsiserver: update headers + + [xbmc] + * vnsi: bump version to 1.8.0 + + [xbmc] + * vnsi: raise max value for timeshift buffers + + [xbmc] + * vdr-plugin-vnsiserver: raise max value for timeshift buffers + + [xbmc] + * vnsi: fix fallback method for skins + + [xbmc] + * vnsi: rework settings dialog for skin clonfluence + + [xbmc] + * vnsi: add skin file for aeon.nox + + [xbmc] + * vnsi: add gles rendering for vdr ui + + [xbmc] + * configure check for gles2 + + [xbmc] + * rbp: set rpath-link needed by automake + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: add config option for timeshift buffer directory + + [xbmc] + * vnsi: add timeshift buffer status [Rainer Hochecker] - * vdr-plugin-vnsiserver: vdr osd + * vdr-plugin-vnsiserver: optimize recplayer + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: add buffer status message + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: optimize file buffer method for timeshift + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: increase read cache + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix subtitle errors in xbmc log + + [xbmc] + * vnsi: dont scan timer titles for directory delimiters + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: limit rescan for recording in progress + + [xbmc] + * vnsi: check version of guiaddon lib + + [xbmc] + * vnsi: set priority for live tv + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: set priority for livetv, allow interrupt by rocording + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: replay recording in progress + + [xbmc] + * vnsi: add file buffer for timeshift + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: add file buffer for timeshift + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: parse setup parameter before saving + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: bump version to 0.9.2 + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: tag mux packet with a serial + + [xbmc] + * vnsi: timeshift, tag mux packets with a serial + + [xbmc] + * vnsi: bump protocol version to 4 + + [unknown] + * vnsi: add osd rendering for DX + + [xbmc] + * vnsi: add settings page for setup + + [xbmc] + * vnsi: timeshift support + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: timeshift + + [unknown] + * vnsi: osd - update vs project + + [xbmc] + * vnsi: close connection on packet sync error + + [xbmc] + * vnsi: osd - correct colors + + [xbmc] + * vnsi: drop dead code: SendPing + + [xbmc] + * vnsi: osd - check if wndId is out of bounds + + [xbmc] + * vnsi: trigger epg update + + [xbmc] + * vnsi: vdr osd [Christian Fetzer] - * [mythtv-cmyth] Release 1.6.8 + * [mythtv-cmyth] Release v1.7.11 - [Marcel Groothuis] - * [MediaPortal] Update version number and changelog + [Jörg Dembski] + * vuplus: fixups - [Marcel Groothuis] - * [MediaPortal] Solve CppCheck warning about missing copy constructor + [manuel] + * pump version to 1.7.9 - [Marcel Groothuis] - * [MediaPortal] Cleanup unused NoSignalStream related variables + [manuel] + * fix loading top level favourite channels - [Marcel Groothuis] - * [MediaPortal] Added: Extra debug info on errors + [manuel] + * [dvbviewer] pump version to 1.7.8 - [Marcel Groothuis] - * [MediaPortal] Setting recording play count is only supported since TVServerXBMC build 117 + [manuel] + * [dvbviewer] fix crash with RS 1.25.0, pump version - [Marcel Groothuis] - * MediaPortal: refactor: move loading card settings to separate function + [manuel] + * [dvbviewer] fix typo in vs project file - [Marcel Groothuis] - * [MediaPortal] MultiFileReader: continue as soon as the buffer file has a non-zero length + [xbmc] + * rbp: set rpath-link needed by automake - [Marcel Groothuis] - * MediaPortal: search also for the genre_translation.xml file in the profile folder (userdata/addon_data/pvr.team-mediaportal.tvserver) This allows for storing a modified file at a writable location + [xbmc] + * configure check for gles2 - [Marcel Groothuis] - * MediaPortal: channel icons: search also for these extensions: .jpg .jpeg .bmp .gif (Still Windows only) + [manuel] + * [dvbviewer] pump version to 1.7.7 - [Marcel Groothuis] - * [MediaPortal] Channels: Use MediaPortal VisibleInGuide property as inverted IsHidden flag in XBMC. (requires TVServerXBMC build 120) + [manuel] + * [dvbviewer] fix possible crash during timer updates - [Marcel Groothuis] - * [MediaPortal] Don't load other channel groups when the user selected to import channels from a single group. + [manuel] + * [dvbviewer] forgot about a changelog entry [Fred Hoogduin] - * [argustv-fix] If we can not connect to the pvr server at startup do not return ADDON_STATUS_PERMANENT_FAILURE as this causes the add-on to become disabled. + * [argustv-fix] fixed error that occurred when adding a Timer with " in the title + + [manuel] + * [dvbviewer] 64bit channel ids, code cleanup and much more + + [manuel] + * massive code cleanup/coding style + + [manuel] + * [dvbviewer] make the ui settings more robust + + [manuel] + * [dvbviewer] add basic support for timeshift + + + + [Lars Op den Kamp] + * sync ffmpeg codec ids. closes #195 + + + + + + + [Lars Op den Kamp] + * [mythtv-cmyth] bump to 1.7.10. we already had a 1.7.9 and forgot to bump after the last change + + [Christian Fetzer] + * [mythtv-cmyth] Changelog for 1.7.9 + + [Christian Fetzer] + * [mythtv-cmyth] Fill iLastPlayedPosition when transfering recordings + + [Lars Op den Kamp] + * bump add-on versions and pvr api dependency version + + [Lars Op den Kamp] + * bumped api to v1.7.0 + + [Christian Fetzer] + * sync: Add iLastPlayedPosition to PVR_RECORDING. Issue #170 + + [Lars Op den Kamp] + * sync api date bump in the copyright + + [Jörg Dembski] + * [vuplus] fix typo in langugage file + + [Lars Op den Kamp] + * updated README for windows + + [xbmc] + * bump api version to 1.6.1 + + [xbmc] + * add version for addongui lib + + [xbmc] + * configure: check for GL + + [xbmc] + * addongui: sync with xbmc + + [Adam Sutton] + * [tvheadend] fix return PTS when skipping + + [Adam Sutton] + * [tvheadend] update addon version info + + [Adam Sutton] + * [tvheadend] correct previous mistaken fix to webroot processing + + [Adam Sutton] + * [tvheadend] update subscriptionSeek call to use abs PTS + + [Christian Fetzer] + * [mythtv-cmyth] Release v1.6.9 + + [Adam Sutton] + * [tvheadend] ensure timeshiftStatus does not spam logs + + [Adam Sutton] + * [tvheadend] added working seek support. + + [Christian Fetzer] + * [mythtv-cmyth] Implement GetRecordingEdl + + [Christian Fetzer] + * [mythtv-cmyth] Add GetCommbreakList and GetCutList functions to MythConnection + + [Christian Fetzer] + * sync: Add GetRecordingEdl stubs to all addons + + [Christian Fetzer] + * sync: GetRecordingEdl + + [Christian Fetzer] + * sync: Add WakeOnLan + + [Christian Fetzer] + * [mythtv-cmyth] Handle OnSleep/OnWake announcements + + [Christian Fetzer] + * sync: Add ADDON_Announce to all addons + + [Christian Fetzer] + * sync: Add ADDON_Announce * Initial release diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/changelog.in xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/changelog.in --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/changelog.in 2013-12-13 13:17:34.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/changelog.in 2014-05-04 07:03:28.000000000 +0000 @@ -1,7 +1,124 @@ -xbmc-pvr-addons (1.0.0~git20131213.1417-e1c3fb1-0~#DIST#) #DIST#; urgency=high +xbmc-pvr-addons (1.0.0~git20140504.0903-2955e1d-0~#DIST#) #DIST#; urgency=high + + [manuel] + * [dvbviewer] pump version to 1.9.14 + + [manuel] + * [dvbviewer] don't use timezone offset for timers + + [manuel] + * [dvbviewer] tsbuffer: remove hungarian notations + + [manuel] + * [dvbviewer] reduce implicit calls to SwitchChannel + + [manuel] + * [dvbviewer] remove even more of the hungarian notations + + [manuel] + * [dvbviewer] remove more of the hungarian notations + + [manuel] + * [dvbviewer] implement low performance mode + + [manuel] + * [dvbviewer] don't fetch epg language any more + + [manuel] + * [dvbviewer] get rid of external XML parser library + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: move to own repo https://github.com/FernetMenta/vdr-plugin-vnsiserver + + + [manuel] + * [dvbviewer] pump version to 1.9.14 + + [manuel] + * [dvbviewer] don't use timezone offset for timers + + [manuel] + * [dvbviewer] tsbuffer: remove hungarian notations + + [manuel] + * [dvbviewer] reduce implicit calls to SwitchChannel + + [manuel] + * [dvbviewer] remove even more of the hungarian notations + + [manuel] + * [dvbviewer] remove more of the hungarian notations + + [manuel] + * [dvbviewer] implement low performance mode + + [manuel] + * [dvbviewer] don't fetch epg language any more + + [manuel] + * [dvbviewer] get rid of external XML parser library + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: move to own repo https://github.com/FernetMenta/vdr-plugin-vnsiserver + + + [manuel] + * [dvbviewer] pump version to 1.9.14 + + [manuel] + * [dvbviewer] don't use timezone offset for timers + + [manuel] + * [dvbviewer] tsbuffer: remove hungarian notations + + [manuel] + * [dvbviewer] reduce implicit calls to SwitchChannel + + [manuel] + * [dvbviewer] remove even more of the hungarian notations + + [manuel] + * [dvbviewer] remove more of the hungarian notations + + [manuel] + * [dvbviewer] implement low performance mode + + [manuel] + * [dvbviewer] don't fetch epg language any more + + [manuel] + * [dvbviewer] get rid of external XML parser library + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: move to own repo https://github.com/FernetMenta/vdr-plugin-vnsiserver + + + [Lars Op den Kamp] + * [pvr.hts] bump add-on version + + [Marcel Groothuis] + * [MediaPortal] Fixed: recording playback over rtsp in ffmpeg mode + + [Marcel Groothuis] + * [MediaPortal] Update Changelog and version number to v1.9.13 + + [Marcel Groothuis] + * [MediaPortal] Recordings: Check for in progress recordings and use play them always via the PVR addon + + [Marcel Groothuis] + * [MediaPortal] Properly close an ongoing timeshift when opening fails. + + [Marcel Groothuis] + * [MediaPortal] Add better debug/error logging [Marcel Groothuis] - * [MediaPortal] Update changelog and PVR addon version number + * [MediaPortal] Reduce the signal status calls to once every 10s. + + [Marcel Groothuis] + * [MediaPortal] Detect and report permission denied errors on Live/Recording access + + [Marcel Groothuis] + * [MediaPortal] Add missing GPL headers [Marcel Groothuis] * [MediaPortal] Check for command execution errors @@ -16,34 +133,454 @@ * [MediaPortal] Channel thumbnails: replace more invalid file name characters in the channel name by a _ [Marcel Groothuis] - * [MediaPortal] Better error logging on failures PVR addon version number increase + update changelog + * [MediaPortal] Fix gcc compiler and CPPcheck warnings [Marcel Groothuis] - * [MediaPortal] TSReader: Add translation functions to translate Windows and UNC paths to and from XBMC paths + * [MediaPortal] Enable fast channel switching by default. The already added PAT detection searches for the start of the new channel in the timeshift buffer file. - [Marcel Groothuis] - * [MediaPortal] TSReader: updated to return smb:// URI's instead of \UNC paths to XBMC (also for Windows) + [Fred Hoogduin] + * [argustv] Fix: use EPG data to retrieve original title, this improves timer conflict detection (much!) [argustv] Fix: threads now working as intented on OSX + + [Stefan Saraev] + * vnsi5: confluence color fixes + + [manuel] + * [dvbviewer] pump version to 1.9.14 + + [manuel] + * [dvbviewer] don't use timezone offset for timers + + [manuel] + * [dvbviewer] tsbuffer: remove hungarian notations + + [manuel] + * [dvbviewer] reduce implicit calls to SwitchChannel + + [manuel] + * [dvbviewer] remove even more of the hungarian notations + + [manuel] + * [dvbviewer] remove more of the hungarian notations + + [manuel] + * [dvbviewer] implement low performance mode + + [manuel] + * [dvbviewer] don't fetch epg language any more + + [manuel] + * [dvbviewer] get rid of external XML parser library + + [Rainer Hochecker] + * check for gl2 header when checking for GLES + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: move to own repo https://github.com/FernetMenta/vdr-plugin-vnsiserver + + [alanwww1] + * [lang] update of language files from Transifex + + [Sam Stenvall] + * [pvr.hts] populate channel icon for recordings + + [Chris "Koying" Browet] + * FIX: android x86 build + + [Rainer Hochecker] + * vnsi: allow protocol version of server to be higher + + [Rainer Hochecker] + * vnsi: bump version + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix thread priorities + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: correct flag for GetDevice, credits to manio + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: implement status msg channelchange + + [Rainer Hochecker] + * vnsi: add skin file for AEON NOX 5, thanks to BigNoid + + + [alanwww1] + * [lang] update of language files from Transifex + + [kendrak24] + * Implemented GetRecordingEdl for pvr.hts addon. + + [amet] + * [pvr.hts] fix issue where "client specific settings" window would not open + + [Fred Hoogduin] + * [argustv] added monitor thread to aggregate and handle ARGUS TV service events + + + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix compile error after vdr 2.1.4 + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: drop old debug logging + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: bump version to 0.9.4 + + [Rainer Hochecker] + * vnsi: bump version to 1.9.6 + + [Ryan Gribble] + * up Gotham addon version to 0.2.93 and update to new icon + + [Ryan Gribble] + * Add retry functionality, enabled only for Read operations Add guarding against incorrect number of fields in responses + + [Ryan Gribble] + * Implement Channel Groups + + [Bernhard Froehlich] + * Add FreeBSD defines to the Socket code + + [Bernhard Froehlich] + * Add ADDON_HELPER_ARCH for FreeBSD + + [Bernhard Froehlich] + * Teach configure how to distinguish between FreeBSD amd64 and i386 + + [Bernhard Froehlich] + * freebsd: Add FreeBSD platform to the addon.xml files + + [Christian Fetzer] + * [mythtv-cmyth] Release v1.9.14 + + [WiSo] + * [WIN32] fixed linking of pvr.dvblink + + [Rainer Hochecker] + * vnsi: update length of recording + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: update length of recording + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: detect latm and adts by parsing + + [Anton Fedchin] + * [iptvsimple] new version. see changelog.txt for details. + + + [Lars Op den Kamp] + * delete crap that shouldn't be in here + + [Sam Stenvall] + * fix some compiler warnings + + [Sam Stenvall] + * [pvr.hts] only add subtitle stream identifier for DVB subtitles + + [Sam Stenvall] + * don't ignore TEXTSUB streams + + [Sam Stenvall] + * always copy existing streams, otherwise stream property changes like language won't propagate + + [Sam Stenvall] + * reuse GetStreamId() so we can get rid of one operator overload + + [Sam Stenvall] + * add xbmc_codec_descriptor.hpp to reduce code duplication + + [Sam Stenvall] + * remove unused class definition + + [Sam Stenvall] + * refactoring xbmc_stream_utils.hpp completely in order to fix a bunch of outstanding issues. [Marcel Groothuis] - * [MediaPortal] Simplify and fix socket receive/send code + * [pvr.wmc] win32: Fix PVR addon DLL name in release build and remove unneeded build events [Marcel Groothuis] - * [MediaPortal] Add additional checks to prevent potential crashes + * [pvr.wmc] Windows: Fix @ARCHITECTURE@ replacement in addon.xml.in [Marcel Groothuis] - * [MediaPortal] TSReader: fix channel switching behavior when switching across tsbuffer files + * [pvr.wmc] Fix Windows release build + + [Rainer Hochecker] + * vnsi: fix build error on Windowns + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix incorrect language on audio and subs + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix latm, wrong codec name + + [Fred Hoogduin] + * [argustv] Create new timers based on default schedule retrieved from ARGUS server. Removed warnings about unused parameters in ADDON_Announce + + [Ryan Gribble] + * Add quotes to Platform project pre build event + + [Ryan Gribble] + * add build artefacts to gitignore file + + [Ryan Gribble] + * Add pvr.wmc addon to Makefile, configure, and VS solution + + [Ryan Gribble] + * Add pvr.wmc addon code to github and prepare for official XBMC repo + + [Fred Hoogduin] + * remove redundant Kai Toast + + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: check and reset modified flag for channels instead of looking at file + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: update change log + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix a bug in epg auto update + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: raise nice level for vnsi threads + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: do not set pts for dts on video streams + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: add channel filter + + [Rainer Hochecker] + * VNSI: add channel filter + + [dfdario] + * Update addon.xml.in + + [Rainer Hochecker] + * VNSI: adapt skin files to left, top instead of posx, posy + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: bump version to 0.9.3 + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: bump protocol version to 5 + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: add edl support + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: send buffer times for timeshift + + [Rainer Hochecker] + * VNSI: bump protocol version to 5 + + [Rainer Hochecker] + * VNSI: bump version to 1.9.5 + + [Rainer Hochecker] + * VNSI: add edl support + + [Rainer Hochecker] + * VNSI: add new timeshift functions + + [Graeme Blackley] + * - added dialog to set recurring recordings, including recurrence type, padding, number of recordings to keep, and recording directory - added support for EDL - added support for retrieving and storing last playback position - now requires NextPVR 3.1.1 or higher - fixed a bug that could cause an EPG event with no description to have a copy of last show's description, or cause a crash if the user was unlucky. - more flexible approach to genre + + + [Rainer Hochecker] + * VNSI: fix incorrect version of addon.gui + + [Rainer Hochecker] + * addongui: fix incorrect version + + + [Rainer Hochecker] + * nextpvr: add missing stubs after a4550db9372fac5521f03b01fa01dd4adfebd983 + + [Lars Op den Kamp] + * bump add-ons to 1.9.0. added stubs in dvblink + + [Lars Op den Kamp] + * sync copyright notices + + [Lars Op den Kamp] + * bump pvr add-ons to 1.9.0 + + [Rainer Hochecker] + * adapt addons to pvr api change, add timeshift buffer methods + + [Rainer Hochecker] + * sync pvr api with mainline repo + + [Sam Stenvall] + * populate service/provider name and mux in PVR_SIGNAL_STATUS + + [Christian Fetzer] + * [mythtv-cmyth] Release v1.8.13 + + [Fred Hoogduin] + * [argustv-fix] Fix deletion of recordings (regression); Improve the load time of all recordings; Cleanup and remove redundant code + + [Fred Hoogduin] + * Fixes playing recordings on Windows; All UNC share name versus CIFS name handling is now isolated into two methods + + [Stefan Saraev] + * vdr 2.1.2 buildfix + + [Palle Rosendahl Ehmsen] + * DVBLink Connect! Server PVR Addon + + + + + + + + + + [Rainer Hochecker] + * vnsi: fix loading on android by linking GLESv2 + + [Rainer Hochecker] + * vnsi: bump version to 1.8.4 + + [Rainer Hochecker] + * vnsi: add guilib as required addon xml + + [Rainer Hochecker] + * vnsi: fix wrong format specifier in error log + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix seeking, only consider audio and video streams for searching + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: FreeBSD patches, credits to Juergen Lock + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: check all timers for active recordings when opening a channel + + [Fred Hoogduin] + * [argustv-new] log the actual amount of time the TV server takes to tune, log the amount of time it takes to retreive the recordings + + [Fred Hoogduin] + * [argustv-new] Implementing the new integer id's now provided by ARGUS TV + + [Lars Op den Kamp] + * [hts] bump to 1.8.22 + + [Lars Op den Kamp] + * [hts] cosmetics + + [Lars Op den Kamp] + * [hts] use a timeout in CHTSPDemux::GetStreamProperties() so we don't block forever when we can't tune to a channel. closes #220 + + [Rainer Hochecker] + * fix potential wrong error code in posix socket + + [Rainer Hochecker] + * port socket fix from 918f59fbe26571f78231f380f3304fd164b19b10 to Windows [Marcel Groothuis] * [MediaPortal] Update TVServer enums and put them in the TvDatabase namespace [Marcel Groothuis] - * [MediaPortal] More verbose log messages + * [MediaPortal] Update genre translation table with missing strings (based on the id-to-string translation table in the MediaPortal epgDecoder sources) + + [Fred Hoogduin] + * [argustv-fix] Live-TV was not working on XBMC Gotham Windows + + [manuel] + * [dvbviewer] update changelog + + [manuel] + * [dvbviewer] fix channel numbers for favourites + + [manuel] + * [dvbviewer] make BuildExtURL work for schemes other than http/https + + [manuel] + * [dvbviewer] sync with PVR API v1.8.1 + + [manuel] + * [dvbviewer] avoid double encodes of format specifiers + + [manuel] + * [dvbviewer] use c_str() just to make sure + + [manuel] + * [dvbviewer] fix channel index in GenerateTimer + + [manuel] + * [dvbviewer] force channel sync on start + + [manuel] + * [dvbviewer] make RTSP working + + [manuel] + * [dvbviewer] require addon restart after changing usetimeshift/usertsp + + [manuel] + * [dvbviewer] avoid an unnecessary copy + + [manuel] + * [dvbviewer] fix possible crash + + [manuel] + * [dvbviewer] fix possible crash + + [manuel] + * [dvbviewer] make channel group creation more sane + + [manuel] + * [dvbviewer] rewrite channel + favourite list parsing + + [manuel] + * [dvbviewer] update delete record api url + + [manuel] + * [dvbviewer] get rid of some hungarian notation. more to follow + + [manuel] + * [dvbviewer] clean up dtor + + [manuel] + * [dvbviewer] rewrote recording parsing + + [manuel] + * [dvbviewer] use generic methods for building urls to backend + + [manuel] + * [dvbviewer] minor code cleanup + + [manuel] + * [dvbviewer] use RS api to get timezone/language + + [manuel] + * [dvbviewer] more method renaming to be in line with the PVR API + + [manuel] + * [dvbviewer] rename GetDeviceInfo to GetBackendVersion + + [manuel] + * [dvbviewer] remove signal status, fix version parsing + + [manuel] + * [dvbviewer] pump version to 1.8.10 + + [Anton Fedchin] + * [iptvsimple] Release v1.8.1 + + [Christian Fetzer] + * [mythtv-cmyth] Release v1.8.12 [Marcel Groothuis] - * [MediaPortal] Update genre translation table with missing strings (based on the id-to-string translation table in the MediaPortal epgDecoder sources) + * [MediaPortal] Debugging: Add/change log notifications [Marcel Groothuis] - * [MediaPortal] TSReader code cleanup + * [MediaPortal] Code cleanup: drop support for TVServerXBMC builds older than 1.x.x.107 [Marcel Groothuis] * [MediaPortal] Hide smb password in debug xbmc.log file @@ -52,149 +589,431 @@ * [MediaPortal] Added: support for retrieving channels from multiple specified groups (>1, < All groups) Requires at least TVServerXBMC 1.2.3.122 or 1.3.0.122 [Marcel Groothuis] - * [MediaPortal] TSReader: Show buffer file errors/changes in the debug log - - [Marcel Groothuis] - * [MediaPortal] iLastPlayedPosition is not available in Frodo's PVR_RECORDING struct + * [MediaPortal] use ADDON_STATUS return value in Connect() [Marcel Groothuis] - * [MediaPortal] use ADDON_STATUS return value in Connect() + * [MediaPortal] Fix possible out-of-bounds access on the m_cCards array [Marcel Groothuis] * [MediaPortal] changed CCards::ParseLines code a bit. One user experienced a crash inside this function. [Marcel Groothuis] - * [MediaPortal] cleanup: remove references to VTPTranceiver + * [MediaPortal] Trigger a recording list update when the backend couldn't find the selected recording [Marcel Groothuis] * [MediaPortal] Recordings: Add support for LastPlayedPosition (requires TVServerXBMC build 121 or higher) [Marcel Groothuis] - * [MediaPortal] TSReader: add PAT detection to find the start of the new channel in the timeshift buffer file. This should fix SD<->HD channel switching with "fast channel switching" enabled. + * [MediaPortal] simplify and cleanup receive code [Marcel Groothuis] - * [MediaPortal] Trigger a recording list update when the backend couldn't find the selected recording + * [MediaPortal] Update addon version number and changelog to 1.8.9 [Marcel Groothuis] - * [MediaPortal] disable RTSP pause (locks up XBMC on continue) + * [MediaPortal] TSReader: OnZap: Enable PAT change detection also on non-Windows systems [Marcel Groothuis] - * [MediaPortal] tsreader code cleanup + * [MediaPortal] TSReader: fix channel switching behavior when switching across tsbuffer files - [Stephan Raue] - * add support to build in a seperate builddir like OpenELEC does per standard with the new packageformat. For this its needed to change @abs_top_srcdir@ (the sourcedir) to @abs_top_builddir@ (the real builddir) and changing all relative paths to absolute paths with help of $(srcdir) in includes. + [Marcel Groothuis] + * [MediaPortal] TSReader: updated to return smb:// URI's instead of \UNC paths to XBMC (also for Windows) + [Marcel Groothuis] + * [MediaPortal] TSReader: Add translation functions to translate Windows and UNC paths to and from XBMC paths + [Marcel Groothuis] + * [MediaPortal] TSReader code cleanup - [Anton Fedchin] - * [iptvsimple] new pvr.iptvsimple addon. + [Marcel Groothuis] + * [MediaPortal] TSReader: add PAT detection to find the start of the new channel in the timeshift buffer file. This should fix SD<->HD channel switching with "fast channel switching" enabled. - [Christian Fetzer] - * [mythtv-cmyth] Release v1.6.10 - [Graeme Blackley] - * Fixed a bug that could cause an EPG event with no description to have a copy of last show's description, or cause a crash if the user was unlucky. - [Graeme Blackley] - * Fixed several bugs: - Reducing logging during live tv and playback of recordings. - Now explicitly telling backend when live tv viewing ends, rather than relying on detection of the socket closing. This solves a problem some users were having with live tv buffer files left on the disk. - Fixed broken genre. + [Rainer Hochecker] + * vnsi: bump version - [Fred Hoogduin] - * [argustv-fix] fixed error that occurred when adding a Timer with " in the title + [Rainer Hochecker] + * vnsi: fix ReadMessage + [Lars Op den Kamp] + * [hts] bump add-on version [Lars Op den Kamp] - * updated README for windows + * [hts] if we read less than 4 bytes in the initial packet size read, don't discard it but wait for the rest to come in within iDatapacketTimeout. issue #181 - [Adam Sutton] - * [tvheadend] fix return PTS when skipping + [Lars Op den Kamp] + * don't return early when poll failed, but do another read. issue #181 - [Adam Sutton] - * [tvheadend] update addon version info + [Lars Op den Kamp] + * [hts] tvheadend uses it's own byte order. don't use ntohl. credits @dezi. issue #181 - [Adam Sutton] - * [tvheadend] correct previous mistaken fix to webroot processing + [Lars Op den Kamp] + * return nb bytes read instead of the error code when data was read. credits @dezi. issue #181 - [Adam Sutton] - * [tvheadend] update subscriptionSeek call to use abs PTS + [Lars Op den Kamp] + * removed avcodec.h and use callback methods from XBMC to get codec IDs instead. removed external ffmpeg check + + + + [Rainer Hochecker] + * vnsi: fix Makefile.am, did not include all objs [Christian Fetzer] - * [mythtv-cmyth] Release v1.6.9 + * [mythtv-cmyth] win32: Add TARGET_WINDOWS for release builds - [Adam Sutton] - * [tvheadend] ensure timeshiftStatus does not spam logs + [Lars Op den Kamp] + * vnsi: fix compilation after 298fcd35917190edb72d8b6f9715c268aff494a4 + + [Anton Fedchin] + * [iptvsimple] new pvr.iptvsimple addon. - [Adam Sutton] - * [tvheadend] added working seek support. [Christian Fetzer] - * [mythtv-cmyth] Fix crash when starting Live TV after a failed attempt + * win32: Make sure that all addon projects define TARGET_WINDOWS - [Jörg Dembski] - * [vuplus]: increment version number in addon.xml.in + [Lars Op den Kamp] + * bump add-on versions after PVR API change - [Jörg Dembski] - * [vuplus]: Add several new features + [Lars Op den Kamp] + * sync pvr api headers + + [Christian Fetzer] + * sync: Adapt CallMenuHook to API change + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: do not assume a pes header right after pusi for video streams + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: h264 parser - reset stream data on error [Rainer Hochecker] - * vdr-plugin-vnsiserver: bump version + * vdr-plugin-vnsiserver: allow timeshift buffer in RAM to larger than 2 GB, change size_t to off_t - [Lucian Muresan] - * vdr-vnsiserver Makefile vdr-1.7.36 + [Rainer Hochecker] + * vdr-plugin-vnsiserver: silence compiler warning + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix layer for mpeg audio + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: squash to specific errors + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: present specific parser errors to user [Rainer Hochecker] - * vdr-plugin-vnsiserver: redesign for timeshift, revised parsers + * vdr-plugin-vnsiserver: fix potential segfault when reading incorrent pes header size [Rainer Hochecker] - * vdr-plugin-vnsiserver: revised socket + * vdr-plugin-vnsiserver: recplayer, drop NOATIME flag on open + + [xbmc] + * vnsi: disable callback PVRRecording, fixes deadlock [Rainer Hochecker] - * vdr-plugin-vnsiserver: osd - increase memory + * vdr-plugin-vnsiserver: increase max buffer size for pes packets [Rainer Hochecker] - * vdr-plugin-vnsiserver: trigger epg update + * vdr-plugin-vnsiserver: atsc does not suppport mpeg2 audio, interpret pmt accordingly + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix segfault when feeded with scrambled packets + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix occasional incorrect timestamps after 505336e0b99306f95199d00f65bd7ef7ec2a9371 + + [unknown] + * vnsi: correct vs project after adding dx + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix getting stuck by reading eof at end of segment + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: rework and fixes on video parsers + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix test harness + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: only observe pts wraps on audio and video streams + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: cleanup and fixes in pes parser + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: do not transmit packates older than first frame, avoids large disconts on start of playback + + [xbmc] + * vdr-plugin-vnsiserver: fix compile error for loder vdr versions + + [xbmc] + * vdr-plugin-vnsiserver: update headers + + [xbmc] + * vnsi: bump version to 1.8.0 + + [xbmc] + * vnsi: raise max value for timeshift buffers + + [xbmc] + * vdr-plugin-vnsiserver: raise max value for timeshift buffers + + [xbmc] + * vnsi: fix fallback method for skins + + [xbmc] + * vnsi: rework settings dialog for skin clonfluence + + [xbmc] + * vnsi: add skin file for aeon.nox + + [xbmc] + * vnsi: add gles rendering for vdr ui + + [xbmc] + * configure check for gles2 + + [xbmc] + * rbp: set rpath-link needed by automake + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: add config option for timeshift buffer directory + + [xbmc] + * vnsi: add timeshift buffer status [Rainer Hochecker] - * vdr-plugin-vnsiserver: vdr osd + * vdr-plugin-vnsiserver: optimize recplayer + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: add buffer status message + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: optimize file buffer method for timeshift + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: increase read cache + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix subtitle errors in xbmc log + + [xbmc] + * vnsi: dont scan timer titles for directory delimiters + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: limit rescan for recording in progress + + [xbmc] + * vnsi: check version of guiaddon lib + + [xbmc] + * vnsi: set priority for live tv + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: set priority for livetv, allow interrupt by rocording + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: replay recording in progress + + [xbmc] + * vnsi: add file buffer for timeshift + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: add file buffer for timeshift + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: parse setup parameter before saving + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: bump version to 0.9.2 + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: tag mux packet with a serial + + [xbmc] + * vnsi: timeshift, tag mux packets with a serial + + [xbmc] + * vnsi: bump protocol version to 4 + + [unknown] + * vnsi: add osd rendering for DX + + [xbmc] + * vnsi: add settings page for setup + + [xbmc] + * vnsi: timeshift support + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: timeshift + + [unknown] + * vnsi: osd - update vs project + + [xbmc] + * vnsi: close connection on packet sync error + + [xbmc] + * vnsi: osd - correct colors + + [xbmc] + * vnsi: drop dead code: SendPing + + [xbmc] + * vnsi: osd - check if wndId is out of bounds + + [xbmc] + * vnsi: trigger epg update + + [xbmc] + * vnsi: vdr osd [Christian Fetzer] - * [mythtv-cmyth] Release 1.6.8 + * [mythtv-cmyth] Release v1.7.11 - [Marcel Groothuis] - * [MediaPortal] Update version number and changelog + [Jörg Dembski] + * vuplus: fixups - [Marcel Groothuis] - * [MediaPortal] Solve CppCheck warning about missing copy constructor + [manuel] + * pump version to 1.7.9 - [Marcel Groothuis] - * [MediaPortal] Cleanup unused NoSignalStream related variables + [manuel] + * fix loading top level favourite channels - [Marcel Groothuis] - * [MediaPortal] Added: Extra debug info on errors + [manuel] + * [dvbviewer] pump version to 1.7.8 - [Marcel Groothuis] - * [MediaPortal] Setting recording play count is only supported since TVServerXBMC build 117 + [manuel] + * [dvbviewer] fix crash with RS 1.25.0, pump version - [Marcel Groothuis] - * MediaPortal: refactor: move loading card settings to separate function + [manuel] + * [dvbviewer] fix typo in vs project file - [Marcel Groothuis] - * [MediaPortal] MultiFileReader: continue as soon as the buffer file has a non-zero length + [xbmc] + * rbp: set rpath-link needed by automake - [Marcel Groothuis] - * MediaPortal: search also for the genre_translation.xml file in the profile folder (userdata/addon_data/pvr.team-mediaportal.tvserver) This allows for storing a modified file at a writable location + [xbmc] + * configure check for gles2 - [Marcel Groothuis] - * MediaPortal: channel icons: search also for these extensions: .jpg .jpeg .bmp .gif (Still Windows only) + [manuel] + * [dvbviewer] pump version to 1.7.7 - [Marcel Groothuis] - * [MediaPortal] Channels: Use MediaPortal VisibleInGuide property as inverted IsHidden flag in XBMC. (requires TVServerXBMC build 120) + [manuel] + * [dvbviewer] fix possible crash during timer updates - [Marcel Groothuis] - * [MediaPortal] Don't load other channel groups when the user selected to import channels from a single group. + [manuel] + * [dvbviewer] forgot about a changelog entry [Fred Hoogduin] - * [argustv-fix] If we can not connect to the pvr server at startup do not return ADDON_STATUS_PERMANENT_FAILURE as this causes the add-on to become disabled. + * [argustv-fix] fixed error that occurred when adding a Timer with " in the title + + [manuel] + * [dvbviewer] 64bit channel ids, code cleanup and much more + + [manuel] + * massive code cleanup/coding style + + [manuel] + * [dvbviewer] make the ui settings more robust + + [manuel] + * [dvbviewer] add basic support for timeshift + + + + [Lars Op den Kamp] + * sync ffmpeg codec ids. closes #195 + + + + + + + [Lars Op den Kamp] + * [mythtv-cmyth] bump to 1.7.10. we already had a 1.7.9 and forgot to bump after the last change + + [Christian Fetzer] + * [mythtv-cmyth] Changelog for 1.7.9 + + [Christian Fetzer] + * [mythtv-cmyth] Fill iLastPlayedPosition when transfering recordings + + [Lars Op den Kamp] + * bump add-on versions and pvr api dependency version + + [Lars Op den Kamp] + * bumped api to v1.7.0 + + [Christian Fetzer] + * sync: Add iLastPlayedPosition to PVR_RECORDING. Issue #170 + + [Lars Op den Kamp] + * sync api date bump in the copyright + + [Jörg Dembski] + * [vuplus] fix typo in langugage file + + [Lars Op den Kamp] + * updated README for windows + + [xbmc] + * bump api version to 1.6.1 + + [xbmc] + * add version for addongui lib + + [xbmc] + * configure: check for GL + + [xbmc] + * addongui: sync with xbmc + + [Adam Sutton] + * [tvheadend] fix return PTS when skipping + + [Adam Sutton] + * [tvheadend] update addon version info + + [Adam Sutton] + * [tvheadend] correct previous mistaken fix to webroot processing + + [Adam Sutton] + * [tvheadend] update subscriptionSeek call to use abs PTS + + [Christian Fetzer] + * [mythtv-cmyth] Release v1.6.9 + + [Adam Sutton] + * [tvheadend] ensure timeshiftStatus does not spam logs + + [Adam Sutton] + * [tvheadend] added working seek support. + + [Christian Fetzer] + * [mythtv-cmyth] Implement GetRecordingEdl + + [Christian Fetzer] + * [mythtv-cmyth] Add GetCommbreakList and GetCutList functions to MythConnection + + [Christian Fetzer] + * sync: Add GetRecordingEdl stubs to all addons + + [Christian Fetzer] + * sync: GetRecordingEdl + + [Christian Fetzer] + * sync: Add WakeOnLan + + [Christian Fetzer] + * [mythtv-cmyth] Handle OnSleep/OnWake announcements + + [Christian Fetzer] + * sync: Add ADDON_Announce to all addons + + [Christian Fetzer] + * sync: Add ADDON_Announce * Initial release diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/changelog.in.old xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/changelog.in.old --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/changelog.in.old 2013-12-13 13:17:22.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/changelog.in.old 2014-05-04 07:03:12.000000000 +0000 @@ -1,115 +1,988 @@ xbmc-pvr-addons (#PACKAGEVERSION#-0~#DIST#) #DIST#; urgency=high + [manuel] + * [dvbviewer] pump version to 1.9.14 - [Anton Fedchin] - * [iptvsimple] new pvr.iptvsimple addon. + [manuel] + * [dvbviewer] don't use timezone offset for timers + + [manuel] + * [dvbviewer] tsbuffer: remove hungarian notations + + [manuel] + * [dvbviewer] reduce implicit calls to SwitchChannel + + [manuel] + * [dvbviewer] remove even more of the hungarian notations + + [manuel] + * [dvbviewer] remove more of the hungarian notations + + [manuel] + * [dvbviewer] implement low performance mode + + [manuel] + * [dvbviewer] don't fetch epg language any more + + [manuel] + * [dvbviewer] get rid of external XML parser library + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: move to own repo https://github.com/FernetMenta/vdr-plugin-vnsiserver + + + [manuel] + * [dvbviewer] pump version to 1.9.14 + + [manuel] + * [dvbviewer] don't use timezone offset for timers + + [manuel] + * [dvbviewer] tsbuffer: remove hungarian notations + + [manuel] + * [dvbviewer] reduce implicit calls to SwitchChannel + + [manuel] + * [dvbviewer] remove even more of the hungarian notations + + [manuel] + * [dvbviewer] remove more of the hungarian notations + + [manuel] + * [dvbviewer] implement low performance mode + + [manuel] + * [dvbviewer] don't fetch epg language any more + + [manuel] + * [dvbviewer] get rid of external XML parser library + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: move to own repo https://github.com/FernetMenta/vdr-plugin-vnsiserver + + + [Lars Op den Kamp] + * [pvr.hts] bump add-on version + + [Marcel Groothuis] + * [MediaPortal] Fixed: recording playback over rtsp in ffmpeg mode + + [Marcel Groothuis] + * [MediaPortal] Update Changelog and version number to v1.9.13 + + [Marcel Groothuis] + * [MediaPortal] Recordings: Check for in progress recordings and use play them always via the PVR addon + + [Marcel Groothuis] + * [MediaPortal] Properly close an ongoing timeshift when opening fails. + + [Marcel Groothuis] + * [MediaPortal] Add better debug/error logging + + [Marcel Groothuis] + * [MediaPortal] Reduce the signal status calls to once every 10s. + + [Marcel Groothuis] + * [MediaPortal] Detect and report permission denied errors on Live/Recording access + + [Marcel Groothuis] + * [MediaPortal] Add missing GPL headers + + [Marcel Groothuis] + * [MediaPortal] Check for command execution errors + + [Marcel Groothuis] + * [MediaPortal] Allow empty username and password for SMB share access + + [Marcel Groothuis] + * [MediaPortal] TSReader: Don't replace \ by smb:// when not at the start of the path + + [Marcel Groothuis] + * [MediaPortal] Channel thumbnails: replace more invalid file name characters in the channel name by a _ + + [Marcel Groothuis] + * [MediaPortal] Fix gcc compiler and CPPcheck warnings + + [Marcel Groothuis] + * [MediaPortal] Enable fast channel switching by default. The already added PAT detection searches for the start of the new channel in the timeshift buffer file. + + [Fred Hoogduin] + * [argustv] Fix: use EPG data to retrieve original title, this improves timer conflict detection (much!) [argustv] Fix: threads now working as intented on OSX + + [Stefan Saraev] + * vnsi5: confluence color fixes + + [manuel] + * [dvbviewer] pump version to 1.9.14 + + [manuel] + * [dvbviewer] don't use timezone offset for timers + + [manuel] + * [dvbviewer] tsbuffer: remove hungarian notations + + [manuel] + * [dvbviewer] reduce implicit calls to SwitchChannel + + [manuel] + * [dvbviewer] remove even more of the hungarian notations + + [manuel] + * [dvbviewer] remove more of the hungarian notations + + [manuel] + * [dvbviewer] implement low performance mode + + [manuel] + * [dvbviewer] don't fetch epg language any more + + [manuel] + * [dvbviewer] get rid of external XML parser library + + [Rainer Hochecker] + * check for gl2 header when checking for GLES + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: move to own repo https://github.com/FernetMenta/vdr-plugin-vnsiserver + + [alanwww1] + * [lang] update of language files from Transifex + + [Sam Stenvall] + * [pvr.hts] populate channel icon for recordings + + [Chris "Koying" Browet] + * FIX: android x86 build + + [Rainer Hochecker] + * vnsi: allow protocol version of server to be higher + + [Rainer Hochecker] + * vnsi: bump version + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix thread priorities + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: correct flag for GetDevice, credits to manio + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: implement status msg channelchange + + [Rainer Hochecker] + * vnsi: add skin file for AEON NOX 5, thanks to BigNoid + + + [alanwww1] + * [lang] update of language files from Transifex + + [kendrak24] + * Implemented GetRecordingEdl for pvr.hts addon. + + [amet] + * [pvr.hts] fix issue where "client specific settings" window would not open + + [Fred Hoogduin] + * [argustv] added monitor thread to aggregate and handle ARGUS TV service events + + + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix compile error after vdr 2.1.4 + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: drop old debug logging + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: bump version to 0.9.4 + + [Rainer Hochecker] + * vnsi: bump version to 1.9.6 + + [Ryan Gribble] + * up Gotham addon version to 0.2.93 and update to new icon + + [Ryan Gribble] + * Add retry functionality, enabled only for Read operations Add guarding against incorrect number of fields in responses + + [Ryan Gribble] + * Implement Channel Groups + + [Bernhard Froehlich] + * Add FreeBSD defines to the Socket code + + [Bernhard Froehlich] + * Add ADDON_HELPER_ARCH for FreeBSD + + [Bernhard Froehlich] + * Teach configure how to distinguish between FreeBSD amd64 and i386 + + [Bernhard Froehlich] + * freebsd: Add FreeBSD platform to the addon.xml files [Christian Fetzer] - * [mythtv-cmyth] Release v1.6.10 + * [mythtv-cmyth] Release v1.9.14 - [Graeme Blackley] - * Fixed a bug that could cause an EPG event with no description to have a copy of last show's description, or cause a crash if the user was unlucky. + [WiSo] + * [WIN32] fixed linking of pvr.dvblink + [Rainer Hochecker] + * vnsi: update length of recording - [Graeme Blackley] - * Fixed several bugs: - Reducing logging during live tv and playback of recordings. - Now explicitly telling backend when live tv viewing ends, rather than relying on detection of the socket closing. This solves a problem some users were having with live tv buffer files left on the disk. - Fixed broken genre. + [Rainer Hochecker] + * vdr-plugin-vnsiserver: update length of recording + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: detect latm and adts by parsing + + [Anton Fedchin] + * [iptvsimple] new version. see changelog.txt for details. + + + [Lars Op den Kamp] + * delete crap that shouldn't be in here + + [Sam Stenvall] + * fix some compiler warnings + + [Sam Stenvall] + * [pvr.hts] only add subtitle stream identifier for DVB subtitles + + [Sam Stenvall] + * don't ignore TEXTSUB streams + + [Sam Stenvall] + * always copy existing streams, otherwise stream property changes like language won't propagate + + [Sam Stenvall] + * reuse GetStreamId() so we can get rid of one operator overload + + [Sam Stenvall] + * add xbmc_codec_descriptor.hpp to reduce code duplication + + [Sam Stenvall] + * remove unused class definition + + [Sam Stenvall] + * refactoring xbmc_stream_utils.hpp completely in order to fix a bunch of outstanding issues. + + [Marcel Groothuis] + * [pvr.wmc] win32: Fix PVR addon DLL name in release build and remove unneeded build events + + [Marcel Groothuis] + * [pvr.wmc] Windows: Fix @ARCHITECTURE@ replacement in addon.xml.in + + [Marcel Groothuis] + * [pvr.wmc] Fix Windows release build + + [Rainer Hochecker] + * vnsi: fix build error on Windowns + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix incorrect language on audio and subs + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix latm, wrong codec name [Fred Hoogduin] - * [argustv-fix] fixed error that occurred when adding a Timer with " in the title + * [argustv] Create new timers based on default schedule retrieved from ARGUS server. Removed warnings about unused parameters in ADDON_Announce + + [Ryan Gribble] + * Add quotes to Platform project pre build event + + [Ryan Gribble] + * add build artefacts to gitignore file + + [Ryan Gribble] + * Add pvr.wmc addon to Makefile, configure, and VS solution + + [Ryan Gribble] + * Add pvr.wmc addon code to github and prepare for official XBMC repo + + [Fred Hoogduin] + * remove redundant Kai Toast + + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: check and reset modified flag for channels instead of looking at file + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: update change log + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix a bug in epg auto update + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: raise nice level for vnsi threads + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: do not set pts for dts on video streams + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: add channel filter + + [Rainer Hochecker] + * VNSI: add channel filter + + [dfdario] + * Update addon.xml.in + + [Rainer Hochecker] + * VNSI: adapt skin files to left, top instead of posx, posy + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: bump version to 0.9.3 + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: bump protocol version to 5 + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: add edl support + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: send buffer times for timeshift + + [Rainer Hochecker] + * VNSI: bump protocol version to 5 + + [Rainer Hochecker] + * VNSI: bump version to 1.9.5 + + [Rainer Hochecker] + * VNSI: add edl support + + [Rainer Hochecker] + * VNSI: add new timeshift functions + + [Graeme Blackley] + * - added dialog to set recurring recordings, including recurrence type, padding, number of recordings to keep, and recording directory - added support for EDL - added support for retrieving and storing last playback position - now requires NextPVR 3.1.1 or higher - fixed a bug that could cause an EPG event with no description to have a copy of last show's description, or cause a crash if the user was unlucky. - more flexible approach to genre + + + [Rainer Hochecker] + * VNSI: fix incorrect version of addon.gui + + [Rainer Hochecker] + * addongui: fix incorrect version + + + [Rainer Hochecker] + * nextpvr: add missing stubs after a4550db9372fac5521f03b01fa01dd4adfebd983 + [Lars Op den Kamp] + * bump add-ons to 1.9.0. added stubs in dvblink [Lars Op den Kamp] - * updated README for windows + * sync copyright notices - [Adam Sutton] - * [tvheadend] fix return PTS when skipping + [Lars Op den Kamp] + * bump pvr add-ons to 1.9.0 - [Adam Sutton] - * [tvheadend] update addon version info + [Rainer Hochecker] + * adapt addons to pvr api change, add timeshift buffer methods - [Adam Sutton] - * [tvheadend] correct previous mistaken fix to webroot processing + [Rainer Hochecker] + * sync pvr api with mainline repo - [Adam Sutton] - * [tvheadend] update subscriptionSeek call to use abs PTS + [Sam Stenvall] + * populate service/provider name and mux in PVR_SIGNAL_STATUS [Christian Fetzer] - * [mythtv-cmyth] Release v1.6.9 + * [mythtv-cmyth] Release v1.8.13 + + [Fred Hoogduin] + * [argustv-fix] Fix deletion of recordings (regression); Improve the load time of all recordings; Cleanup and remove redundant code + + [Fred Hoogduin] + * Fixes playing recordings on Windows; All UNC share name versus CIFS name handling is now isolated into two methods + + [Stefan Saraev] + * vdr 2.1.2 buildfix + + [Palle Rosendahl Ehmsen] + * DVBLink Connect! Server PVR Addon + + + - [Adam Sutton] - * [tvheadend] ensure timeshiftStatus does not spam logs - [Adam Sutton] - * [tvheadend] added working seek support. - [Christian Fetzer] - * [mythtv-cmyth] Fix crash when starting Live TV after a failed attempt - [Jörg Dembski] - * [vuplus]: increment version number in addon.xml.in - [Jörg Dembski] - * [vuplus]: Add several new features [Rainer Hochecker] - * vdr-plugin-vnsiserver: bump version + * vnsi: fix loading on android by linking GLESv2 - [Lucian Muresan] - * vdr-vnsiserver Makefile vdr-1.7.36 + [Rainer Hochecker] + * vnsi: bump version to 1.8.4 [Rainer Hochecker] - * vdr-plugin-vnsiserver: redesign for timeshift, revised parsers + * vnsi: add guilib as required addon xml [Rainer Hochecker] - * vdr-plugin-vnsiserver: revised socket + * vnsi: fix wrong format specifier in error log [Rainer Hochecker] - * vdr-plugin-vnsiserver: osd - increase memory + * vdr-plugin-vnsiserver: fix seeking, only consider audio and video streams for searching [Rainer Hochecker] - * vdr-plugin-vnsiserver: trigger epg update + * vdr-plugin-vnsiserver: FreeBSD patches, credits to Juergen Lock [Rainer Hochecker] - * vdr-plugin-vnsiserver: vdr osd + * vdr-plugin-vnsiserver: check all timers for active recordings when opening a channel + + [Fred Hoogduin] + * [argustv-new] log the actual amount of time the TV server takes to tune, log the amount of time it takes to retreive the recordings + + [Fred Hoogduin] + * [argustv-new] Implementing the new integer id's now provided by ARGUS TV + + [Lars Op den Kamp] + * [hts] bump to 1.8.22 + + [Lars Op den Kamp] + * [hts] cosmetics + + [Lars Op den Kamp] + * [hts] use a timeout in CHTSPDemux::GetStreamProperties() so we don't block forever when we can't tune to a channel. closes #220 + + [Rainer Hochecker] + * fix potential wrong error code in posix socket + + [Rainer Hochecker] + * port socket fix from 918f59fbe26571f78231f380f3304fd164b19b10 to Windows + + [Marcel Groothuis] + * [MediaPortal] Update TVServer enums and put them in the TvDatabase namespace + + [Marcel Groothuis] + * [MediaPortal] Update genre translation table with missing strings (based on the id-to-string translation table in the MediaPortal epgDecoder sources) + + [Fred Hoogduin] + * [argustv-fix] Live-TV was not working on XBMC Gotham Windows + + [manuel] + * [dvbviewer] update changelog + + [manuel] + * [dvbviewer] fix channel numbers for favourites + + [manuel] + * [dvbviewer] make BuildExtURL work for schemes other than http/https + + [manuel] + * [dvbviewer] sync with PVR API v1.8.1 + + [manuel] + * [dvbviewer] avoid double encodes of format specifiers + + [manuel] + * [dvbviewer] use c_str() just to make sure + + [manuel] + * [dvbviewer] fix channel index in GenerateTimer + + [manuel] + * [dvbviewer] force channel sync on start + + [manuel] + * [dvbviewer] make RTSP working + + [manuel] + * [dvbviewer] require addon restart after changing usetimeshift/usertsp + + [manuel] + * [dvbviewer] avoid an unnecessary copy + + [manuel] + * [dvbviewer] fix possible crash + + [manuel] + * [dvbviewer] fix possible crash + + [manuel] + * [dvbviewer] make channel group creation more sane + + [manuel] + * [dvbviewer] rewrite channel + favourite list parsing + + [manuel] + * [dvbviewer] update delete record api url + + [manuel] + * [dvbviewer] get rid of some hungarian notation. more to follow + + [manuel] + * [dvbviewer] clean up dtor + + [manuel] + * [dvbviewer] rewrote recording parsing + + [manuel] + * [dvbviewer] use generic methods for building urls to backend + + [manuel] + * [dvbviewer] minor code cleanup + + [manuel] + * [dvbviewer] use RS api to get timezone/language + + [manuel] + * [dvbviewer] more method renaming to be in line with the PVR API + + [manuel] + * [dvbviewer] rename GetDeviceInfo to GetBackendVersion + + [manuel] + * [dvbviewer] remove signal status, fix version parsing + + [manuel] + * [dvbviewer] pump version to 1.8.10 + + [Anton Fedchin] + * [iptvsimple] Release v1.8.1 [Christian Fetzer] - * [mythtv-cmyth] Release 1.6.8 + * [mythtv-cmyth] Release v1.8.12 + + [Marcel Groothuis] + * [MediaPortal] Debugging: Add/change log notifications + + [Marcel Groothuis] + * [MediaPortal] Code cleanup: drop support for TVServerXBMC builds older than 1.x.x.107 + + [Marcel Groothuis] + * [MediaPortal] Hide smb password in debug xbmc.log file + + [Marcel Groothuis] + * [MediaPortal] Added: support for retrieving channels from multiple specified groups (>1, < All groups) Requires at least TVServerXBMC 1.2.3.122 or 1.3.0.122 + + [Marcel Groothuis] + * [MediaPortal] use ADDON_STATUS return value in Connect() + + [Marcel Groothuis] + * [MediaPortal] Fix possible out-of-bounds access on the m_cCards array [Marcel Groothuis] - * [MediaPortal] Update version number and changelog + * [MediaPortal] changed CCards::ParseLines code a bit. One user experienced a crash inside this function. [Marcel Groothuis] - * [MediaPortal] Solve CppCheck warning about missing copy constructor + * [MediaPortal] Trigger a recording list update when the backend couldn't find the selected recording [Marcel Groothuis] - * [MediaPortal] Cleanup unused NoSignalStream related variables + * [MediaPortal] Recordings: Add support for LastPlayedPosition (requires TVServerXBMC build 121 or higher) [Marcel Groothuis] - * [MediaPortal] Added: Extra debug info on errors + * [MediaPortal] simplify and cleanup receive code [Marcel Groothuis] - * [MediaPortal] Setting recording play count is only supported since TVServerXBMC build 117 + * [MediaPortal] Update addon version number and changelog to 1.8.9 [Marcel Groothuis] - * MediaPortal: refactor: move loading card settings to separate function + * [MediaPortal] TSReader: OnZap: Enable PAT change detection also on non-Windows systems [Marcel Groothuis] - * [MediaPortal] MultiFileReader: continue as soon as the buffer file has a non-zero length + * [MediaPortal] TSReader: fix channel switching behavior when switching across tsbuffer files [Marcel Groothuis] - * MediaPortal: search also for the genre_translation.xml file in the profile folder (userdata/addon_data/pvr.team-mediaportal.tvserver) This allows for storing a modified file at a writable location + * [MediaPortal] TSReader: updated to return smb:// URI's instead of \UNC paths to XBMC (also for Windows) [Marcel Groothuis] - * MediaPortal: channel icons: search also for these extensions: .jpg .jpeg .bmp .gif (Still Windows only) + * [MediaPortal] TSReader: Add translation functions to translate Windows and UNC paths to and from XBMC paths [Marcel Groothuis] - * [MediaPortal] Channels: Use MediaPortal VisibleInGuide property as inverted IsHidden flag in XBMC. (requires TVServerXBMC build 120) + * [MediaPortal] TSReader code cleanup [Marcel Groothuis] - * [MediaPortal] Don't load other channel groups when the user selected to import channels from a single group. + * [MediaPortal] TSReader: add PAT detection to find the start of the new channel in the timeshift buffer file. This should fix SD<->HD channel switching with "fast channel switching" enabled. + + + + + [Rainer Hochecker] + * vnsi: bump version + + [Rainer Hochecker] + * vnsi: fix ReadMessage + + [Lars Op den Kamp] + * [hts] bump add-on version + + [Lars Op den Kamp] + * [hts] if we read less than 4 bytes in the initial packet size read, don't discard it but wait for the rest to come in within iDatapacketTimeout. issue #181 + + [Lars Op den Kamp] + * don't return early when poll failed, but do another read. issue #181 + + [Lars Op den Kamp] + * [hts] tvheadend uses it's own byte order. don't use ntohl. credits @dezi. issue #181 + + [Lars Op den Kamp] + * return nb bytes read instead of the error code when data was read. credits @dezi. issue #181 + + [Lars Op den Kamp] + * removed avcodec.h and use callback methods from XBMC to get codec IDs instead. removed external ffmpeg check + + + + [Rainer Hochecker] + * vnsi: fix Makefile.am, did not include all objs + + [Christian Fetzer] + * [mythtv-cmyth] win32: Add TARGET_WINDOWS for release builds + + [Lars Op den Kamp] + * vnsi: fix compilation after 298fcd35917190edb72d8b6f9715c268aff494a4 + + [Anton Fedchin] + * [iptvsimple] new pvr.iptvsimple addon. + + + [Christian Fetzer] + * win32: Make sure that all addon projects define TARGET_WINDOWS + + [Lars Op den Kamp] + * bump add-on versions after PVR API change + + [Lars Op den Kamp] + * sync pvr api headers + + [Christian Fetzer] + * sync: Adapt CallMenuHook to API change + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: do not assume a pes header right after pusi for video streams + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: h264 parser - reset stream data on error + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: allow timeshift buffer in RAM to larger than 2 GB, change size_t to off_t + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: silence compiler warning + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix layer for mpeg audio + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: squash to specific errors + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: present specific parser errors to user + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix potential segfault when reading incorrent pes header size + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: recplayer, drop NOATIME flag on open + + [xbmc] + * vnsi: disable callback PVRRecording, fixes deadlock + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: increase max buffer size for pes packets + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: atsc does not suppport mpeg2 audio, interpret pmt accordingly + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix segfault when feeded with scrambled packets + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix occasional incorrect timestamps after 505336e0b99306f95199d00f65bd7ef7ec2a9371 + + [unknown] + * vnsi: correct vs project after adding dx + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix getting stuck by reading eof at end of segment + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: rework and fixes on video parsers + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix test harness + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: only observe pts wraps on audio and video streams + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: cleanup and fixes in pes parser + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: do not transmit packates older than first frame, avoids large disconts on start of playback + + [xbmc] + * vdr-plugin-vnsiserver: fix compile error for loder vdr versions + + [xbmc] + * vdr-plugin-vnsiserver: update headers + + [xbmc] + * vnsi: bump version to 1.8.0 + + [xbmc] + * vnsi: raise max value for timeshift buffers + + [xbmc] + * vdr-plugin-vnsiserver: raise max value for timeshift buffers + + [xbmc] + * vnsi: fix fallback method for skins + + [xbmc] + * vnsi: rework settings dialog for skin clonfluence + + [xbmc] + * vnsi: add skin file for aeon.nox + + [xbmc] + * vnsi: add gles rendering for vdr ui + + [xbmc] + * configure check for gles2 + + [xbmc] + * rbp: set rpath-link needed by automake + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: add config option for timeshift buffer directory + + [xbmc] + * vnsi: add timeshift buffer status + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: optimize recplayer + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: add buffer status message + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: optimize file buffer method for timeshift + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: increase read cache + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: fix subtitle errors in xbmc log + + [xbmc] + * vnsi: dont scan timer titles for directory delimiters + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: limit rescan for recording in progress + + [xbmc] + * vnsi: check version of guiaddon lib + + [xbmc] + * vnsi: set priority for live tv + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: set priority for livetv, allow interrupt by rocording + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: replay recording in progress + + [xbmc] + * vnsi: add file buffer for timeshift + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: add file buffer for timeshift + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: parse setup parameter before saving + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: bump version to 0.9.2 + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: tag mux packet with a serial + + [xbmc] + * vnsi: timeshift, tag mux packets with a serial + + [xbmc] + * vnsi: bump protocol version to 4 + + [unknown] + * vnsi: add osd rendering for DX + + [xbmc] + * vnsi: add settings page for setup + + [xbmc] + * vnsi: timeshift support + + [Rainer Hochecker] + * vdr-plugin-vnsiserver: timeshift + + [unknown] + * vnsi: osd - update vs project + + [xbmc] + * vnsi: close connection on packet sync error + + [xbmc] + * vnsi: osd - correct colors + + [xbmc] + * vnsi: drop dead code: SendPing + + [xbmc] + * vnsi: osd - check if wndId is out of bounds + + [xbmc] + * vnsi: trigger epg update + + [xbmc] + * vnsi: vdr osd + + [Christian Fetzer] + * [mythtv-cmyth] Release v1.7.11 + + [Jörg Dembski] + * vuplus: fixups + + [manuel] + * pump version to 1.7.9 + + [manuel] + * fix loading top level favourite channels + + [manuel] + * [dvbviewer] pump version to 1.7.8 + + [manuel] + * [dvbviewer] fix crash with RS 1.25.0, pump version + + [manuel] + * [dvbviewer] fix typo in vs project file + + [xbmc] + * rbp: set rpath-link needed by automake + + [xbmc] + * configure check for gles2 + + [manuel] + * [dvbviewer] pump version to 1.7.7 + + [manuel] + * [dvbviewer] fix possible crash during timer updates + + [manuel] + * [dvbviewer] forgot about a changelog entry [Fred Hoogduin] - * [argustv-fix] If we can not connect to the pvr server at startup do not return ADDON_STATUS_PERMANENT_FAILURE as this causes the add-on to become disabled. + * [argustv-fix] fixed error that occurred when adding a Timer with " in the title + + [manuel] + * [dvbviewer] 64bit channel ids, code cleanup and much more + + [manuel] + * massive code cleanup/coding style + + [manuel] + * [dvbviewer] make the ui settings more robust + + [manuel] + * [dvbviewer] add basic support for timeshift + + + + [Lars Op den Kamp] + * sync ffmpeg codec ids. closes #195 + + + + + + + [Lars Op den Kamp] + * [mythtv-cmyth] bump to 1.7.10. we already had a 1.7.9 and forgot to bump after the last change + + [Christian Fetzer] + * [mythtv-cmyth] Changelog for 1.7.9 + + [Christian Fetzer] + * [mythtv-cmyth] Fill iLastPlayedPosition when transfering recordings + + [Lars Op den Kamp] + * bump add-on versions and pvr api dependency version + + [Lars Op den Kamp] + * bumped api to v1.7.0 + + [Christian Fetzer] + * sync: Add iLastPlayedPosition to PVR_RECORDING. Issue #170 + + [Lars Op den Kamp] + * sync api date bump in the copyright + + [Jörg Dembski] + * [vuplus] fix typo in langugage file + + [Lars Op den Kamp] + * updated README for windows + + [xbmc] + * bump api version to 1.6.1 + + [xbmc] + * add version for addongui lib + + [xbmc] + * configure: check for GL + + [xbmc] + * addongui: sync with xbmc + + [Adam Sutton] + * [tvheadend] fix return PTS when skipping + + [Adam Sutton] + * [tvheadend] update addon version info + + [Adam Sutton] + * [tvheadend] correct previous mistaken fix to webroot processing + + [Adam Sutton] + * [tvheadend] update subscriptionSeek call to use abs PTS + + [Christian Fetzer] + * [mythtv-cmyth] Release v1.6.9 + + [Adam Sutton] + * [tvheadend] ensure timeshiftStatus does not spam logs + + [Adam Sutton] + * [tvheadend] added working seek support. + + [Christian Fetzer] + * [mythtv-cmyth] Implement GetRecordingEdl + + [Christian Fetzer] + * [mythtv-cmyth] Add GetCommbreakList and GetCutList functions to MythConnection + + [Christian Fetzer] + * sync: Add GetRecordingEdl stubs to all addons + + [Christian Fetzer] + * sync: GetRecordingEdl + + [Christian Fetzer] + * sync: Add WakeOnLan + + [Christian Fetzer] + * [mythtv-cmyth] Handle OnSleep/OnWake announcements + + [Christian Fetzer] + * sync: Add ADDON_Announce to all addons + + [Christian Fetzer] + * sync: Add ADDON_Announce * Initial release diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/control xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/control --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/control 2013-12-13 13:17:34.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/control 2014-05-04 07:05:20.000000000 +0000 @@ -11,7 +11,7 @@ Package: xbmc-pvr-mythtv-cmyth Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, libmysqlclient19 | libmysqlclient18 | libmysqlclient17 | libmysqlclient16 | libmysqlclient15 | libmysqlclient14 -Description: XBMC PVR Addon MythTv - Cmyth - PVR API:1.6.0 +Description: XBMC PVR Addon MythTv - Cmyth - PVR API:1.9.0 This package contains the Cmyth PVR (Personal Video Recorder) Addon for XBMC, the award winning free and open source software media-player and entertainment hub for all your digital media @@ -19,7 +19,7 @@ Package: xbmc-pvr-vuplus Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} -Description: XBMC PVR Addon Vuplus - PVR API:1.6.0 +Description: XBMC PVR Addon Vuplus - PVR API:1.9.0 This package contains the Vuplus PVR (Personal Video Recorder) Addon for XBMC, the award winning free and open source software media-player and entertainment hub for all your digital media @@ -27,7 +27,7 @@ Package: xbmc-pvr-vdr-vnsi Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} -Description: XBMC PVR Addon VDR Vnsi - PVR API:1.6.0 +Description: XBMC PVR Addon VDR Vnsi - PVR API:1.9.0 This package contains the VDR Vnsi PVR (Personal Video Recorder) Addon for XBMC, the award winning free and open source software media-player and entertainment hub for all your digital media @@ -35,13 +35,13 @@ Package: vdr-plugin-vnsiserver Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, ${vdr:Depends} -Description: VDR-Network-Streaming-Interface - PVR API:1.6.0 +Description: VDR-Network-Streaming-Interface - PVR API:1.9.0 VDR-Network-Streaming-Interface Package: xbmc-pvr-njoy Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} -Description: XBMC PVR Addon Njoy - PVR API:1.6.0 +Description: XBMC PVR Addon Njoy - PVR API:1.9.0 This package contains the Njoy PVR (Personal Video Recorder) Addon for XBMC, the award winning free and open source software media-player and entertainment hub for all your digital media @@ -49,7 +49,7 @@ Package: xbmc-pvr-nextpvr Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} -Description: XBMC PVR Addon NextPvr - PVR API:1.6.0 +Description: XBMC PVR Addon NextPvr - PVR API:1.9.0 This package contains the NextPvr PVR (Personal Video Recorder) Addon for XBMC, the award winning free and open source software media-player and entertainment hub for all your digital media @@ -57,7 +57,7 @@ Package: xbmc-pvr-mediaportal-tvserver Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} -Description: XBMC PVR Addon Mediaportal Tvserver - PVR API:1.6.0 +Description: XBMC PVR Addon Mediaportal Tvserver - PVR API:1.9.0 This package contains the Mediaportal PVR (Personal Video Recorder) Addon for XBMC, the award winning free and open source software media-player and entertainment hub for all your digital media @@ -65,7 +65,7 @@ Package: xbmc-pvr-tvheadend-hts Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} -Description: XBMC PVR Addon TvHeadend Hts - PVR API:1.6.0 +Description: XBMC PVR Addon TvHeadend Hts - PVR API:1.9.0 This package contains the TvHeadend PVR (Personal Video Recorder) Addon for XBMC, the award winning free and open source software media-player and entertainment hub for all your digital media @@ -73,7 +73,7 @@ Package: xbmc-pvr-dvbviewer Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} -Description: XBMC PVR Addon Dvbviewer - PVR API:1.6.0 +Description: XBMC PVR Addon Dvbviewer - PVR API:1.9.0 This package contains the Dvbviewer PVR (Personal Video Recorder) Addon for XBMC, the award winning free and open source software media-player and entertainment hub for all your digital media @@ -81,7 +81,7 @@ Package: xbmc-pvr-argustv Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} -Description: XBMC PVR Addon Argustv - PVR API:1.6.0 +Description: XBMC PVR Addon Argustv - PVR API:1.9.0 This package contains the Argustv PVR (Personal Video Recorder) Addon for XBMC, the award winning free and open source software media-player and entertainment hub for all your digital media @@ -89,7 +89,7 @@ Package: xbmc-pvr-demo Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} -Description: XBMC PVR Demo Addon - PVR API:1.6.0 +Description: XBMC PVR Demo Addon - PVR API:1.9.0 This package contains the Demo PVR (Personal Video Recorder) Addon for XBMC, the award winning free and open source software media-player and entertainment hub for all your digital media @@ -97,7 +97,7 @@ Package: xbmc-pvr-iptvsimple Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} -Description: XBMC PVR Iptv Addon - PVR API:1.6.0 +Description: XBMC PVR Iptv Addon - PVR API:1.9.0 This package contains the Iptv PVR (Personal Video Recorder) Addon for XBMC, the award winning free and open source software media-player and entertainment hub for all your digital media diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/control.in.old xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/control.in.old --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/control.in.old 2013-12-13 13:17:22.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/control.in.old 1970-01-01 00:00:00.000000000 +0000 @@ -1,96 +0,0 @@ -Source: xbmc-pvr-addons -Section: video -Priority: extra -Maintainer: wsnipex -Build-Depends: debhelper (>= 8.0.0), autoconf, autopoint | gettext, automake, libtool, libboost-thread-dev, libmysqlclient-dev, pkg-config, vdr-dev (>= 1.7.17), devscripts, lsb-release -Standards-Version: 3.9.3 -Homepage: http://xbmc.org -Vcs-Git: git://github.com/opdenkamp/xbmc-pvr-addons.git -Vcs-Browser: https://github.com/opdenkamp/xbmc-pvr-addons/tree/frodo - -Package: xbmc-pvr-mythtv-cmyth -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, libmysqlclient19 | libmysqlclient18 | libmysqlclient17 | libmysqlclient16 | libmysqlclient15 | libmysqlclient14 -Description: XBMC PVR Addon MythTv - Cmyth - PVR API:#APIVERSION# - This package contains the Cmyth PVR (Personal Video Recorder) Addon for XBMC, - the award winning free and open source software media-player and entertainment hub - for all your digital media - -Package: xbmc-pvr-vuplus -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: XBMC PVR Addon Vuplus - PVR API:#APIVERSION# - This package contains the Vuplus PVR (Personal Video Recorder) Addon for XBMC, - the award winning free and open source software media-player and entertainment hub - for all your digital media - -Package: xbmc-pvr-vdr-vnsi -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: XBMC PVR Addon VDR Vnsi - PVR API:#APIVERSION# - This package contains the VDR Vnsi PVR (Personal Video Recorder) Addon for XBMC, - the award winning free and open source software media-player and entertainment hub - for all your digital media - -Package: vdr-plugin-vnsiserver -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, ${vdr:Depends} -Description: VDR-Network-Streaming-Interface - PVR API:#APIVERSION# - VDR-Network-Streaming-Interface - -Package: xbmc-pvr-njoy -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: XBMC PVR Addon Njoy - PVR API:#APIVERSION# - This package contains the Njoy PVR (Personal Video Recorder) Addon for XBMC, - the award winning free and open source software media-player and entertainment hub - for all your digital media - -Package: xbmc-pvr-nextpvr -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: XBMC PVR Addon NextPvr - PVR API:#APIVERSION# - This package contains the NextPvr PVR (Personal Video Recorder) Addon for XBMC, - the award winning free and open source software media-player and entertainment hub - for all your digital media - -Package: xbmc-pvr-mediaportal-tvserver -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: XBMC PVR Addon Mediaportal Tvserver - PVR API:#APIVERSION# - This package contains the Mediaportal PVR (Personal Video Recorder) Addon for XBMC, - the award winning free and open source software media-player and entertainment hub - for all your digital media - -Package: xbmc-pvr-tvheadend-hts -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: XBMC PVR Addon TvHeadend Hts - PVR API:#APIVERSION# - This package contains the TvHeadend PVR (Personal Video Recorder) Addon for XBMC, - the award winning free and open source software media-player and entertainment hub - for all your digital media - -Package: xbmc-pvr-dvbviewer -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: XBMC PVR Addon Dvbviewer - PVR API:#APIVERSION# - This package contains the Dvbviewer PVR (Personal Video Recorder) Addon for XBMC, - the award winning free and open source software media-player and entertainment hub - for all your digital media - -Package: xbmc-pvr-argustv -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: XBMC PVR Addon Argustv - PVR API:#APIVERSION# - This package contains the Argustv PVR (Personal Video Recorder) Addon for XBMC, - the award winning free and open source software media-player and entertainment hub - for all your digital media - -Package: xbmc-pvr-demo -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: XBMC PVR Demo Addon - PVR API:#APIVERSION# - This package contains the Demo PVR (Personal Video Recorder) Addon for XBMC, - the award winning free and open source software media-player and entertainment hub - for all your digital media - diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/prepare-build.sh.old xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/prepare-build.sh.old --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/prepare-build.sh.old 2013-12-13 13:17:22.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/prepare-build.sh.old 1970-01-01 00:00:00.000000000 +0000 @@ -1,83 +0,0 @@ -#!/bin/bash - -if [[ $1 == "-h" ]] || [[ $1 == "--help" ]] || [[ -z $1 ]] -then - echo "usage $(basename $0) distribution" - exit 1 -else - dist=$1 - echo "preparing build for $dist" -fi - -[[ $(basename $PWD) == "debian" ]] || cd debian - -### -# add a tag to the package versions, needed for rebuilds without upstream version changes -### -[[ -f versiontag ]] && tag=$(cat versiontag) || tag="0" - -### -# detect Pvr Api version -### -PVRAPI=$(awk '/XBMC_PVR_API_VERSION/ {gsub("\"",""); print $3 }' ../xbmc/xbmc_pvr_types.h) -echo "detected Xbmc PVR-API: $PVRAPI" - -### -# Create control and changelog. This file MUST exist with the correct package name before calling debuild -### -echo "Generating changelog with PVR Api version $PVRAPI" -sed -e "s/#APIVERSION#/$PVRAPI/g" -e "s/#DIST#/$dist/g" changelog.in > changelog -echo "Generating control file" -sed "s/#APIVERSION#/$PVRAPI/g" control.in > control - -### -# Define upstream addon name to package name mapping -### -declare -A PACKAGES=( - ["pvr.hts"]="xbmc-pvr-tvheadend-hts" - ["pvr.vuplus"]="xbmc-pvr-vuplus" - ["pvr.mediaportal.tvserver"]="xbmc-pvr-mediaportal-tvserver" - ["pvr.dvbviewer"]="xbmc-pvr-dvbviewer" - ["pvr.argustv"]="xbmc-pvr-argustv" - ["pvr.mythtv.cmyth"]="xbmc-pvr-mythtv-cmyth" - ["pvr.vdr.vnsi"]="xbmc-pvr-vdr-vnsi" - ["pvr.nextpvr"]="xbmc-pvr-nextpvr" - ["pvr.demo"]="xbmc-pvr-demo" - ["pvr.njoy"]="xbmc-pvr-njoy" -) - -### -# loop over all packages and create the specific changelog and version files used by debuild -### -for package in "${!PACKAGES[@]}" -do - echo "creating changelog for: $package" - changelog="../addons/$package/addon/changelog.txt" - addonxml="../addons/$package/addon/addon.xml.in" - aversion=$(awk -F'=' '!// {gsub("\"",""); print $2}' $addonxml) - pvrapiversion=$(awk -F'=' '/import addon="xbmc.pvr"/ {gsub("\"",""); gsub("/>",""); print $3}' $addonxml) - - [[ -f ${PACKAGES["$package"]}.changelog ]] && mv ${PACKAGES["$package"]}.changelog ${PACKAGES["$package"]}.changelog.old - - version="${aversion}-${tag}${dist}" - echo "${version}" > ${PACKAGES["$package"]}.version - if [[ -f $changelog ]] - then - dch -c ${PACKAGES["$package"]}.changelog --create --empty --package xbmc-pvr-addons -v "${version}" --distribution ${dist} --force-distribution 2>/dev/null $(cat $changelog | tail -80) - else - dch -c ${PACKAGES["$package"]}.changelog --create --empty --package xbmc-pvr-addons -v "${version}" --distribution ${dist} --force-distribution 2>/dev/null "no upstream changelog available" - fi -done - -### -# special handling for vdr-plugin-vnsiserver -### -echo "creating changelog for: vdr-plugin-vnsiserver" -package="vdr-plugin-vnsiserver" -version="1:"$(awk -F'=' '/\*VERSION/ {gsub("\"",""); gsub(" ",""); gsub(";",""); print $2}' ../addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsi.h)"-${tag}${dist}" -echo "${version}" > ${package}.version - -[[ -f "${package}.changelog" ]] && mv ${package}.changelog ${package}.changelog.old -dch -c ${package}.changelog --create --empty --package xbmc-pvr-addons -v"${version}" --distribution ${dist} --force-distribution 2>/dev/null "no upstream changelog available" - -exit 0 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/rules.old xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/rules.old --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/rules.old 2013-12-13 13:17:22.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/rules.old 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -# This has to be exported to make some magic below work. -export DH_OPTIONS - -SHELL=/bin/bash - -%: - dh $@ --parallel - -override_dh_clean: - dh_clean - find . \( -name "*.pvr" -o -name "config.status" -o -name "config.cache" -o -name "config.log" \ - -o -name "config.guess" -o -name "config.sub" -o -name "Makefile.in" -o -name "INSTALL" \ - -o -name "aclocal.m4" -o -name "configure" -o -name "depcomp" -o -name "install-sh" \ - -o -name "ltmain.sh" -o -name "missing" -o -name "libvdr-*.so.*" \ - \) -exec rm -f "{}" \; - $(MAKE) clean -C addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver - -override_dh_auto_configure: - ./bootstrap - ./configure --prefix=/usr --enable-addons-with-dependencies --enable-release - -override_dh_gencontrol: - sh /usr/share/vdr-dev/dependencies.sh - dh_gencontrol - -override_dh_auto_build: - VDRDIR=/usr/include/vdr LIBDIR=$(CURDIR)/debian/vdr-plugin-vnsiserver/usr/lib/vdr/plugins LOCALEDIR=locale $(MAKE) compile -C addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver - dh_auto_build - -override_dh_auto_install: - VDRDIR=/usr/include/vdr LIBDIR=$(CURDIR)/debian/vdr-plugin-vnsiserver/usr/lib/vdr/plugins LOCALEDIR=locale $(MAKE) install-lib -C addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver - dh_auto_install - -override_dh_gencontrol: - for PACKAGE in $(shell cd debian && ls *.version | sed 's/.version//g'); do \ - VERSION=$$(cat debian/$$PACKAGE.version) ;\ - dh_gencontrol -p$$PACKAGE -- -ldebian/changelog -v$$VERSION ;\ - done diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/vdr-plugin-vnsiserver.changelog xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/vdr-plugin-vnsiserver.changelog --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/vdr-plugin-vnsiserver.changelog 2013-12-13 13:18:08.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/vdr-plugin-vnsiserver.changelog 2014-05-04 07:05:54.000000000 +0000 @@ -1,5 +1,5 @@ -xbmc-pvr-addons (1:0.9.1-2saucy) saucy; urgency=low +xbmc-pvr-addons (1:0.9.4-14saucy) saucy; urgency=low * no upstream changelog available - -- wsnipex Fri, 13 Dec 2013 14:18:08 +0100 + -- wsnipex Sun, 04 May 2014 09:05:54 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/vdr-plugin-vnsiserver.changelog.old xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/vdr-plugin-vnsiserver.changelog.old --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/vdr-plugin-vnsiserver.changelog.old 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/vdr-plugin-vnsiserver.changelog.old 2014-05-04 07:04:03.000000000 +0000 @@ -0,0 +1,5 @@ +xbmc-pvr-addons (1:0.9.4-14trusty) trusty; urgency=low + + * no upstream changelog available + + -- wsnipex Sun, 04 May 2014 09:04:03 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/vdr-plugin-vnsiserver.version xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/vdr-plugin-vnsiserver.version --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/vdr-plugin-vnsiserver.version 2013-12-13 13:18:05.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/vdr-plugin-vnsiserver.version 2014-05-04 07:05:52.000000000 +0000 @@ -1 +1 @@ -1:0.9.1-2saucy +1:0.9.4-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/versiontag xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/versiontag --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/versiontag 2013-12-13 13:17:23.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/versiontag 2014-05-04 07:03:12.000000000 +0000 @@ -1 +1 @@ -2 +14 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-argustv.changelog xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-argustv.changelog --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-argustv.changelog 2013-12-13 13:17:45.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-argustv.changelog 2014-05-04 07:05:31.000000000 +0000 @@ -1,4 +1,4 @@ -xbmc-pvr-addons (1.6.166-2saucy) saucy; urgency=low +xbmc-pvr-addons (1.9.176-14saucy) saucy; urgency=low * v0.0.1.133 (31-03-2012) - The add-on now sets the time a recording was last watched on the server v0.0.1.132 (20-03-2012) - Small fix @@ -59,4 +59,4 @@ tuning of live TV and live radio (tsbuffer only, no rtsp), basic EPG - Tested ForTheRecord Argus version: v1.5.0.3 - -- wsnipex Fri, 13 Dec 2013 14:17:45 +0100 + -- wsnipex Sun, 04 May 2014 09:05:31 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-argustv.changelog.old xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-argustv.changelog.old --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-argustv.changelog.old 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-argustv.changelog.old 2014-05-04 07:03:39.000000000 +0000 @@ -0,0 +1,62 @@ +xbmc-pvr-addons (1.9.176-14trusty) trusty; urgency=low + + * v0.0.1.133 (31-03-2012) - The add-on now sets the time a recording + was last watched on the server v0.0.1.132 (20-03-2012) - Small fix + to correct one invalid GUID error message at start v0.0.1.131 (16- + 03-2012) - Added many internal verifications to the to + channel mappings. External factors can break the + mapping and these checks will hopefully warn the user to reset the + PVR database v0.0.1.130 (11-03-2012) - Fixed 64-bit Linux .tsbuffer + processing v0.0.1.129 (04-03-2012) - Media Portal TV-Server will now + work with the FTR - FTR Addon - XBMC combination Recording titles + with trailing periods '...' will show up in XBMC, NOTICE: this + requires FTR 1.6.1.0 Beta 5 or newer v0.0.1.128 (23-01-2012) - + Added: System Info - PVR Information now shows FTR version info + Timers do no longer retrieve the cancelled 'upcomingprograms' from + ForTheRecord v0.0.1.127 (20-01-2012) - Added: System Info - PVR + Information now shows total and used disk sizes v0.0.1.126 (10-01- + 2012) - Added: titles of recordings changed to be more descriptive + v0.0.1.125 (04-01-2012) - Added: validation of the shares for all + ForTheRecord tuners at startup v0.0.1.124 (01-01-2012) - Fixed Linux + mutex initialisation, caused by C++ not having static constructors + v0.0.1.123 (20-12-2011) - Pressing 'record' while viewing will + schedule the recording of the show watched - Delete Timer: will + abort an active recording, will remove the upcoming program from the + server will remove the corresponding schedule from the server (the + schedule name MUST be: "XBMC - " + timer title, this is the case + when the schedule was added by the addon and unchanged by the user) + v0.0.1.122 (07-12-2011) - Signal quality retrieval implemented + v0.0.1.121 (04-12-2011) - Channel logo retrieval added v0.0.1.120 + (07-11-2011) - Windows, Linux and OSX version using TsReader - + Reliable switching between channels with HD and SD content - + TsReader streamlined v0.0.1.117 (unreleased) - Adaptation to many + changes within XBMC v0.0.1.116 (16-06-2011) - Greatly improved + channel zapping - Add timer will now force a recording when no + matching show title is found in the channel epg data on the server - + Add timer fixed: new PVR API - GUI update triggers added: new PVR + API v0.0.1.115 (10-05-2011) - First implementation of channelgroups + v0.0.1.114 (26-02-2011) - Delete recording is now actually + working... v0.0.1.113 (26-02-2011) - Upcoming recordings now showing + as timers in EPG and timerlist - Delete timer implemented - Add + timer implemented v0.0.1.112 (23-02-2011) - Fixed bad bug that + caused loss of epg data every 10 minutes v0.0.1.111 (01-02-2011) - + EPG loading optimised. Programme descriptions only loaded for + ForTheRecord 1.5.1. - EPG loads 48 hours of data now. - Tune live + stream now also supports radio. v0.0.1.110 (22-01-2011) - Delete + recording implemented, needs ForTheRecord 1.5.1.0 Beta 6 or newer - + Programme descriptions added to EPG and TV channels screen - More + fixes to memory handling v0.0.1.109 (13-01-2011) - Initial support + for retrieval of recordings on the ForTheRecord Argus server - + Overview of recordings, grouped by Title - Viewing of a selected + recording via the ForTheRecord shares - Fixes some memory + corruptions - Support for retrieval of recordings on the + ForTheRecord Argus server - Overview of recordings, grouped by + Title, including recording starttime, and description - Credits: + Red-F v0.0.1.108 (08-01-2011) - EPG data retrieval fixed for dates + where month and day have less than 2 digits (credits: Red-F) + v0.0.1.107 (27-11-2010) - First release of the ForTheRecord PVR + client (Windows only, TSReader) - Implemented: Channel retrieval, + tuning of live TV and live radio (tsbuffer only, no rtsp), basic EPG + - Tested ForTheRecord Argus version: v1.5.0.3 + + -- wsnipex Sun, 04 May 2014 09:03:39 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-argustv.version xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-argustv.version --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-argustv.version 2013-12-13 13:17:43.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-argustv.version 2014-05-04 07:05:28.000000000 +0000 @@ -1 +1 @@ -1.6.166-2saucy +1.9.176-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-demo.changelog xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-demo.changelog --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-demo.changelog 2013-12-13 13:18:05.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-demo.changelog 2014-05-04 07:05:52.000000000 +0000 @@ -1,5 +1,5 @@ -xbmc-pvr-addons (1.6.1-2saucy) saucy; urgency=low +xbmc-pvr-addons (1.9.4-14saucy) saucy; urgency=low * no upstream changelog available - -- wsnipex Fri, 13 Dec 2013 14:18:05 +0100 + -- wsnipex Sun, 04 May 2014 09:05:52 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-demo.changelog.old xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-demo.changelog.old --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-demo.changelog.old 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-demo.changelog.old 2014-05-04 07:04:00.000000000 +0000 @@ -0,0 +1,5 @@ +xbmc-pvr-addons (1.9.4-14trusty) trusty; urgency=low + + * no upstream changelog available + + -- wsnipex Sun, 04 May 2014 09:04:00 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-demo.version xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-demo.version --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-demo.version 2013-12-13 13:18:02.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-demo.version 2014-05-04 07:05:49.000000000 +0000 @@ -1 +1 @@ -1.6.1-2saucy +1.9.4-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-dvbviewer.changelog xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-dvbviewer.changelog --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-dvbviewer.changelog 2013-12-13 13:18:02.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-dvbviewer.changelog 2014-05-04 07:05:49.000000000 +0000 @@ -1,37 +1,48 @@ -xbmc-pvr-addons (1.6.5-2saucy) saucy; urgency=low +xbmc-pvr-addons (1.9.13-14saucy) saucy; urgency=low - * 1.6.5 [updated] Language files from Transifex 1.6.4 [fixed] Use utf- - 8 encoding to get and set the timers. [fixed] Channel names with - more than 25 chars could crash the add-on. 1.6.3 [updated] Language - files from Transifex 1.6.2 New version number by Team XBMC 0.1.8 - [fixed] Changed the way timers are calculated. This should fix - problems with scheduled and instant recordings on some machines. - [fixed] Favourites didn't show channels if the audio track wasn't - the first one. [fixed] Channel settings weren't saved/restored after - a channel switch with the channels OSD. [fixed] XBMC could hang - after a channel switch with the channels OSD. 0.1.7 [added] The - Recording Service version 1.21 or higher is now required. Download - the latest version from the DVBViewer members area and install it. - [added] Display a notification if the add-on can't connect to the - Recording Service. Please, check that the RS is enabled and the IP, - webinterface port, username and pass are correct. [added] If the - favourites.xml selector is empty, the favourites are loaded from the - web interface. [added] Don't fetch recording thumbnails at startup - if there are more than 20 recordings. [fixed] The add-on crashed if - favourites.xml had entries with the old 32 bits ID. [fixed] Channel - names with ansi chars are converted to utf8 so they can be displayed - properly (a reset of the PVR database may be required). [fixed] - Channel names with more than 25 chars. 0.1.5 [added] Timers support. - [added] An option to load the channels from favourites.xml instead - of from channels.dat (a reset of the PVR database is required). It - is usually located at c:\ProgramData\CMUV\DVBViewer\ This is a - hidden folder so be sure to enable the "Settings\Appearance\File - Lists\Show hidden files and directories" option. [added] Always grab - the EPG data after a channel switch. [added] Recording thumbnails. - [added] Receiving device name to the status info. [fixed] The - preferred language is loaded from the DVBViewer config and used to - get the correct EPG in case it supports multi language entries. - [fixed] When the EPG is missing the description entry, the event - entry is used instead. 0.1.0 First version. + * [fixed] After changing certain settings live TV wasn't work anymore + and XBMC restart was required [fixed] possible crash (2x) 1.8.9 + [updated] sync with PVR API v1.8.0 1.7.9 [fixed] loading favourites + without groups/folders 1.7.8 [fixed] fix crash with Recording + Service 1.25.0 1.7.7 [fixed] fix possible crash during timer updates + 1.7.6 [added] Basic timeshift support. [added] Use channel names + from favourites. This allows easy channelname changes. [fixed] Use + 64 bit channel ids. Fall back to 32 bit if favourites.xml still + contain the old ones. [fixed] Replace "/"-character by " " in + channel logo url [updated] A lot of code cleanup 1.7.5 [updated] + Bump after PVR API version bump 1.6.5 [updated] Language files from + Transifex 1.6.4 [fixed] Use utf-8 encoding to get and set the + timers. [fixed] Channel names with more than 25 chars could crash + the add-on. 1.6.3 [updated] Language files from Transifex 1.6.2 New + version number by Team XBMC 0.1.8 [fixed] Changed the way timers are + calculated. This should fix problems with scheduled and instant + recordings on some machines. [fixed] Favourites didn't show channels + if the audio track wasn't the first one. [fixed] Channel settings + weren't saved/restored after a channel switch with the channels OSD. + [fixed] XBMC could hang after a channel switch with the channels + OSD. 0.1.7 [added] The Recording Service version 1.21 or higher is + now required. Download the latest version from the DVBViewer members + area and install it. [added] Display a notification if the add-on + can't connect to the Recording Service. Please, check that the RS is + enabled and the IP, webinterface port, username and pass are + correct. [added] If the favourites.xml selector is empty, the + favourites are loaded from the web interface. [added] Don't fetch + recording thumbnails at startup if there are more than 20 + recordings. [fixed] The add-on crashed if favourites.xml had entries + with the old 32 bits ID. [fixed] Channel names with ansi chars are + converted to utf8 so they can be displayed properly (a reset of the + PVR database may be required). [fixed] Channel names with more than + 25 chars. 0.1.5 [added] Timers support. [added] An option to load + the channels from favourites.xml instead of from channels.dat (a + reset of the PVR database is required). It is usually located at + c:\ProgramData\CMUV\DVBViewer\ This is a hidden folder so be sure to + enable the "Settings\Appearance\File Lists\Show hidden files and + directories" option. [added] Always grab the EPG data after a + channel switch. [added] Recording thumbnails. [added] Receiving + device name to the status info. [fixed] The preferred language is + loaded from the DVBViewer config and used to get the correct EPG in + case it supports multi language entries. [fixed] When the EPG is + missing the description entry, the event entry is used instead. + 0.1.0 First version. - -- wsnipex Fri, 13 Dec 2013 14:18:02 +0100 + -- wsnipex Sun, 04 May 2014 09:05:49 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-dvbviewer.changelog.old xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-dvbviewer.changelog.old --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-dvbviewer.changelog.old 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-dvbviewer.changelog.old 2014-05-04 07:03:57.000000000 +0000 @@ -0,0 +1,48 @@ +xbmc-pvr-addons (1.9.13-14trusty) trusty; urgency=low + + * [fixed] After changing certain settings live TV wasn't work anymore + and XBMC restart was required [fixed] possible crash (2x) 1.8.9 + [updated] sync with PVR API v1.8.0 1.7.9 [fixed] loading favourites + without groups/folders 1.7.8 [fixed] fix crash with Recording + Service 1.25.0 1.7.7 [fixed] fix possible crash during timer updates + 1.7.6 [added] Basic timeshift support. [added] Use channel names + from favourites. This allows easy channelname changes. [fixed] Use + 64 bit channel ids. Fall back to 32 bit if favourites.xml still + contain the old ones. [fixed] Replace "/"-character by " " in + channel logo url [updated] A lot of code cleanup 1.7.5 [updated] + Bump after PVR API version bump 1.6.5 [updated] Language files from + Transifex 1.6.4 [fixed] Use utf-8 encoding to get and set the + timers. [fixed] Channel names with more than 25 chars could crash + the add-on. 1.6.3 [updated] Language files from Transifex 1.6.2 New + version number by Team XBMC 0.1.8 [fixed] Changed the way timers are + calculated. This should fix problems with scheduled and instant + recordings on some machines. [fixed] Favourites didn't show channels + if the audio track wasn't the first one. [fixed] Channel settings + weren't saved/restored after a channel switch with the channels OSD. + [fixed] XBMC could hang after a channel switch with the channels + OSD. 0.1.7 [added] The Recording Service version 1.21 or higher is + now required. Download the latest version from the DVBViewer members + area and install it. [added] Display a notification if the add-on + can't connect to the Recording Service. Please, check that the RS is + enabled and the IP, webinterface port, username and pass are + correct. [added] If the favourites.xml selector is empty, the + favourites are loaded from the web interface. [added] Don't fetch + recording thumbnails at startup if there are more than 20 + recordings. [fixed] The add-on crashed if favourites.xml had entries + with the old 32 bits ID. [fixed] Channel names with ansi chars are + converted to utf8 so they can be displayed properly (a reset of the + PVR database may be required). [fixed] Channel names with more than + 25 chars. 0.1.5 [added] Timers support. [added] An option to load + the channels from favourites.xml instead of from channels.dat (a + reset of the PVR database is required). It is usually located at + c:\ProgramData\CMUV\DVBViewer\ This is a hidden folder so be sure to + enable the "Settings\Appearance\File Lists\Show hidden files and + directories" option. [added] Always grab the EPG data after a + channel switch. [added] Recording thumbnails. [added] Receiving + device name to the status info. [fixed] The preferred language is + loaded from the DVBViewer config and used to get the correct EPG in + case it supports multi language entries. [fixed] When the EPG is + missing the description entry, the event entry is used instead. + 0.1.0 First version. + + -- wsnipex Sun, 04 May 2014 09:03:57 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-dvbviewer.version xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-dvbviewer.version --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-dvbviewer.version 2013-12-13 13:18:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-dvbviewer.version 2014-05-04 07:05:46.000000000 +0000 @@ -1 +1 @@ -1.6.5-2saucy +1.9.13-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-iptvsimple.changelog xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-iptvsimple.changelog --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-iptvsimple.changelog 2013-12-13 13:17:57.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-iptvsimple.changelog 2014-05-04 07:05:43.000000000 +0000 @@ -1,9 +1,14 @@ -xbmc-pvr-addons (1.6.1-2saucy) saucy; urgency=low +xbmc-pvr-addons (1.9.3-14saucy) saucy; urgency=low - * v1.6.1 - fixed issue with BOM header in EPG XML - fixed issue with - update channels if they are changed in m3u - added setting starting - number of channels v1.6.0 - Initial version - Supports m3u as Live - TV streams source and XMLTV as EPG source - Supports Live TV, Radio - channels and EPG + * v1.9.3 - added setting to disable cache m3u/epg - added support + for programme in epg - added possibility to specify + logo path as URL - changed tvg-logo should contains full logo + filename (with extention) - changed don't try download xmltv if it + doesn't load after 3 attempt. v1.9.2 - add timeshift buffer + functions v1.8.1 - fixed issue with BOM header in EPG XML - fixed + issue with update channels if they are changed in m3u - added + setting starting number of channels v1.8.0 - Initial version - + Supports m3u as Live TV streams source and XMLTV as EPG source - + Supports Live TV, Radio channels and EPG - -- wsnipex Fri, 13 Dec 2013 14:17:57 +0100 + -- wsnipex Sun, 04 May 2014 09:05:43 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-iptvsimple.changelog.old xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-iptvsimple.changelog.old --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-iptvsimple.changelog.old 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-iptvsimple.changelog.old 2014-05-04 07:03:51.000000000 +0000 @@ -0,0 +1,14 @@ +xbmc-pvr-addons (1.9.3-14trusty) trusty; urgency=low + + * v1.9.3 - added setting to disable cache m3u/epg - added support + for programme in epg - added possibility to specify + logo path as URL - changed tvg-logo should contains full logo + filename (with extention) - changed don't try download xmltv if it + doesn't load after 3 attempt. v1.9.2 - add timeshift buffer + functions v1.8.1 - fixed issue with BOM header in EPG XML - fixed + issue with update channels if they are changed in m3u - added + setting starting number of channels v1.8.0 - Initial version - + Supports m3u as Live TV streams source and XMLTV as EPG source - + Supports Live TV, Radio channels and EPG + + -- wsnipex Sun, 04 May 2014 09:03:51 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-iptvsimple.version xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-iptvsimple.version --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-iptvsimple.version 2013-12-13 13:17:54.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-iptvsimple.version 2014-05-04 07:05:40.000000000 +0000 @@ -1 +1 @@ -1.6.1-2saucy +1.9.3-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-mediaportal-tvserver.changelog xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-mediaportal-tvserver.changelog --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-mediaportal-tvserver.changelog 2013-12-13 13:17:48.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-mediaportal-tvserver.changelog 2014-05-04 07:05:34.000000000 +0000 @@ -1,4 +1,4 @@ -xbmc-pvr-addons (1.6.10-2saucy) saucy; urgency=low +xbmc-pvr-addons (1.9.13-14saucy) saucy; urgency=low * - Added: use channel icons from MediaPortal (Windows, localhost only) - Changed: switch from libPlatform + libTcpSocket to platform @@ -51,4 +51,4 @@ client should abort connection when the TVServerXBMC version is too old v1.1.0.60 - Fix PVR client destroy - -- wsnipex Fri, 13 Dec 2013 14:17:48 +0100 + -- wsnipex Sun, 04 May 2014 09:05:34 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-mediaportal-tvserver.changelog.old xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-mediaportal-tvserver.changelog.old --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-mediaportal-tvserver.changelog.old 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-mediaportal-tvserver.changelog.old 2014-05-04 07:03:42.000000000 +0000 @@ -0,0 +1,54 @@ +xbmc-pvr-addons (1.9.13-14trusty) trusty; urgency=low + + * - Added: use channel icons from MediaPortal (Windows, localhost + only) - Changed: switch from libPlatform + libTcpSocket to platform + library v1.2.2.109: - Fixed: fix mimetype for tv channels - Fixed: + make sure that OpenLiveStream does not return true due to + m_iCurrentChannel when the TSReader fails in a later stage - Fixed: + compilation IOS/OSX/Linux - Fixed: compile fixes for API move into + ADDON namespace - Added: show localized error messages when + OpenLiveStream fails - Added: signal status support - Fixed: Don't + return encrypted channels as group members when FTA only option is + turned on - Added: add more debug log information about the addon + settings and status - Added: add support for direct recording + playback from network shares (smb, Windows only) - Added: implement + support for recording subdirectories - Fixed: don't return radio + channels/channelgroup/channelgroup mappings when radio support is + disabled v1.1.3.107: - Added: add additional checks for + communication errors - Fixed: trigger also a recording list update + on timer changes - Fixed: add a mutex to prevent mixing up backend + communication on concurrent access - Fixed: stack overflow while + closing a live stream - Fixed: tv/radio playback after recording + playback - Added: EPG genre string-to-id translation table + (addons/pvr.team- + mediaportal.tvserver/resources/genre_translation.xml) - Added: EPG + genre string support - Added: Retrieve TV/Radio card settings from + the backend - Added: support for TVServerXBMC v1.1.x.105-107 - + Fixed: several memory leaks - Changed: sources adapted for PVR API + changes v1.1.3.103: - Fixed: trigger timer and recording list update + on changes from XBMC side - Fixed: check for empty recordings list - + Fixed: check for empty timer list - Fixed: limit EPG request to the + requested period - Fixed: use tuning details to retrieve the channel + number from the backend - Added: support for TVServerXBMC v1.1.x.104 + - Changed: sources adapted for PVR API changes v1.1.2.102: - Added: + Channel group support - Fixed: live stream playback - Fixed: + recording retrieval - Changed: sources adapted for PVR API changes + v1.1.2.101: - Fixed: "Include radio" setting - Changed: cleanup + unused settings v1.1.0.100 - Rewrite: timer code - Changed: + BackendName - Fixed: Retrieve more details for timers (repeat, + lifetime, ...) - Fixed: Playback of radio channels with a webstream + URL (added via the MediaPortal TV-server) - Fixed: "Free-to-air + only" setting - Support for TVServerXBMC v1.1.0.100 v1.1.0.98 - Log + more information on socket related problems v1.1.0.97 - Fixed: Use + uri decode for ip-address in hostname field v1.1.0.96 - Fixed: allow + spaces in groupnames, recording names and timer titles - Fixed: + GetTimerInfo - Add debug messages for empty channel list v1.1.0.95 - + Fix time mismatch between XBMC and MediaPortal TV Server for new + timers (scheduled recordings) - Send genre strings to XBMC for + unrecognised genres. No colors in EPG, but at least the text is now + ok. v1.1.0.90 - Faster channel switching (around 2 sec faster) - + Decrease CPU uage when a buffer underrun occurs v1.1.0.75 - PVR + client should abort connection when the TVServerXBMC version is too + old v1.1.0.60 - Fix PVR client destroy + + -- wsnipex Sun, 04 May 2014 09:03:42 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-mediaportal-tvserver.version xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-mediaportal-tvserver.version --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-mediaportal-tvserver.version 2013-12-13 13:17:46.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-mediaportal-tvserver.version 2014-05-04 07:05:31.000000000 +0000 @@ -1 +1 @@ -1.6.10-2saucy +1.9.13-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-mythtv-cmyth.changelog xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-mythtv-cmyth.changelog --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-mythtv-cmyth.changelog 2013-12-13 13:17:59.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-mythtv-cmyth.changelog 2014-05-04 07:05:46.000000000 +0000 @@ -1,10 +1,12 @@ -xbmc-pvr-addons (1.6.10-2saucy) saucy; urgency=low +xbmc-pvr-addons (1.9.16-14saucy) saucy; urgency=low - * v1.6.10 - Fixed crash when setting up Live TV (in rare cases) - - Fixed issue with not updated recording list (Daylight Saving Time) - - Fixed issue with empty recording list (caused by '[' character) - + * - Fixed issue with empty recording list (caused by '[' character) - Fixed playback of recordings made by a slave backend - Removed - 'Failed to connect to MythTV Backend' notification v1.6.9 - Added + 'Failed to connect to MythTV Backend' notification v1.7.10 - Get + last played position for recordings from the server v1.7.9 - Provide + EDLs if available (commercial skip data cut lists) Currently only + works for videos with constant frame - Disconnect from / reconnect + to backend when XBMC goes to / resumes from standby v1.6.9 - Added Live TV vs. recording conflict handling - Fixed recovering from backend connection loss on Windows - Fixed error when trying to set watched flag for recordings that already have been marked as watched @@ -42,4 +44,4 @@ - Supports setting / reading resume bookmarks and watched state on MythTV backend - -- wsnipex Fri, 13 Dec 2013 14:18:00 +0100 + -- wsnipex Sun, 04 May 2014 09:05:46 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-mythtv-cmyth.changelog.old xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-mythtv-cmyth.changelog.old --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-mythtv-cmyth.changelog.old 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-mythtv-cmyth.changelog.old 2014-05-04 07:03:54.000000000 +0000 @@ -0,0 +1,47 @@ +xbmc-pvr-addons (1.9.16-14trusty) trusty; urgency=low + + * - Fixed issue with empty recording list (caused by '[' character) - + Fixed playback of recordings made by a slave backend - Removed + 'Failed to connect to MythTV Backend' notification v1.7.10 - Get + last played position for recordings from the server v1.7.9 - Provide + EDLs if available (commercial skip data cut lists) Currently only + works for videos with constant frame - Disconnect from / reconnect + to backend when XBMC goes to / resumes from standby v1.6.9 - Added + Live TV vs. recording conflict handling - Fixed recovering from + backend connection loss on Windows - Fixed error when trying to set + watched flag for recordings that already have been marked as watched + v1.6.8 - Performance improvements - Reduced startup time (Faster + loading of EPG, channels, recordings and images) - Reduced resource + usage for image caching - Cache recording data (event triggered + updates from backend) - Fixed lock when stopping recording playback + - Improved general response time - Live TV improvements - Better + handling of connection problems - Playback does not stop anymore + between program breaks - Fixed seek problems - Timer improvements - + Add optional internal recording rule template - Correctly apply + backend recording rule settings - Properly add title and subtitle - + Fixed Timer deletion - Added advanced option for specifying database + host/port - Fixed crash when loading invisibile recordings - + Improved Art-work loading - Combine channels with same channum and + callsign - Fixed IPv6 support - Fixed Windows XP support - Improved + logging, notifications and system labels - Refactored & cleaned up + libcmyth (inttypes, names, docs) v1.6.7 - Updated language files + from Transifex v1.6.6 - Updated language files from Transifex v1.6.5 + New version number by Team XBMC v0.5.0 - Support MythTV 0.26 + backends - Allow Timer Deletion - Support reconnecting to backend - + Reworked LiveTV (no more stops at show end, fixed USB tuner support) + - Performance improvements (adapted socket buffer sizes, removed + unnecessary locks) - Stability improvements - Fixed crash on + SetRecordingPlayCount and SetRecordingLastPlayedPosition - Fixed + crash when addon was restarted - Fixed crash when backend connection + was lost - Fixed memory leaks in libcmyth - Show correct start/end + time in recordings- and timer view v0.4.0 - OSX support v0.3.0 - + Transifex localizations - Support for recording images (icon, + thumbnail, fanart) - Fixed: Preview images of new recordings were + not cached v0.2.0 - Added setting to enable / disable Live TV + support (disbale to use the addon only for watching recordings) + v0.1.0 - Initial version based on Tonny Pettersen's work - Supports + Live TV & Recordings, listening to Radio channels, EPG and Timer + - Supports setting / reading resume bookmarks and watched state on + MythTV backend + + -- wsnipex Sun, 04 May 2014 09:03:54 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-mythtv-cmyth.version xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-mythtv-cmyth.version --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-mythtv-cmyth.version 2013-12-13 13:17:57.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-mythtv-cmyth.version 2014-05-04 07:05:43.000000000 +0000 @@ -1 +1 @@ -1.6.10-2saucy +1.9.16-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-nextpvr.changelog xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-nextpvr.changelog --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-nextpvr.changelog 2013-12-13 13:17:43.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-nextpvr.changelog 2014-05-04 07:05:28.000000000 +0000 @@ -1,20 +1,26 @@ -xbmc-pvr-addons (1.6.5-2saucy) saucy; urgency=low +xbmc-pvr-addons (1.9.7-14saucy) saucy; urgency=low - * v1.6.5 - reducing logging during live tv and playback of recordings - - now explicitly telling backend when live tv viewing ends, rather - than relying on detection of the socket closing. This solves a - problem some users were having with live tv buffer files left on the - disk. - fixed broken genre v1.6.4 - small change to improve the - performance of radio channels v1.6.3 - updated language files from - Transifex v1.6.2 - updated language files from Transifex v1.6.0 - - New version number by Team XBMC v1.0.1.0 - added: new experimental - timeshift support. This requires updated backend components, - otherwise falls back to previous non-timeshift live tv. - added: new - 'advanced' settings page where timeshift can be enabled/disabled. - - added: radio support, mainly to workaround an XBMC channel group - bug. - changed: now using XBMC curl abstraction for HTTP requests - - added: detection of live tv having to exit if tuner was required for - a recording. Shows user a notification message when this was - required. v1.0.0.0 - Created + * v1.9.7 - updated language files from Transifex v1.9.6 - updated + language files from Transifex v1.9.6 - added dialog to set recurring + recordings, including recurrence type, padding, number of recordings + to keep, and recording directory - added support for EDL - added + support for retrieving and storing last playback position - now + requires NextPVR 3.1.1 or higher - fixed a bug that could cause an + EPG event with no description to have a copy of last show's + description, or cause a crash if the user was unlucky. - more + flexible approach to genre v1.9.5 - add timeshift buffer functions + v1.8.4 - sync with PVR API v1.8.0 v1.7.4 - Bump after PVR API + version bump v1.6.4 - small change to improve the performance of + radio channels v1.6.3 - updated language files from Transifex v1.6.2 + - updated language files from Transifex v1.6.0 - New version number + by Team XBMC v1.0.1.0 - added: new experimental timeshift support. + This requires updated backend components, otherwise falls back to + previous non-timeshift live tv. - added: new 'advanced' settings + page where timeshift can be enabled/disabled. - added: radio + support, mainly to workaround an XBMC channel group bug. - changed: + now using XBMC curl abstraction for HTTP requests - added: detection + of live tv having to exit if tuner was required for a recording. + Shows user a notification message when this was required. v1.0.0.0 - + Created - -- wsnipex Fri, 13 Dec 2013 14:17:43 +0100 + -- wsnipex Sun, 04 May 2014 09:05:28 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-nextpvr.changelog.old xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-nextpvr.changelog.old --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-nextpvr.changelog.old 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-nextpvr.changelog.old 2014-05-04 07:03:36.000000000 +0000 @@ -0,0 +1,26 @@ +xbmc-pvr-addons (1.9.7-14trusty) trusty; urgency=low + + * v1.9.7 - updated language files from Transifex v1.9.6 - updated + language files from Transifex v1.9.6 - added dialog to set recurring + recordings, including recurrence type, padding, number of recordings + to keep, and recording directory - added support for EDL - added + support for retrieving and storing last playback position - now + requires NextPVR 3.1.1 or higher - fixed a bug that could cause an + EPG event with no description to have a copy of last show's + description, or cause a crash if the user was unlucky. - more + flexible approach to genre v1.9.5 - add timeshift buffer functions + v1.8.4 - sync with PVR API v1.8.0 v1.7.4 - Bump after PVR API + version bump v1.6.4 - small change to improve the performance of + radio channels v1.6.3 - updated language files from Transifex v1.6.2 + - updated language files from Transifex v1.6.0 - New version number + by Team XBMC v1.0.1.0 - added: new experimental timeshift support. + This requires updated backend components, otherwise falls back to + previous non-timeshift live tv. - added: new 'advanced' settings + page where timeshift can be enabled/disabled. - added: radio + support, mainly to workaround an XBMC channel group bug. - changed: + now using XBMC curl abstraction for HTTP requests - added: detection + of live tv having to exit if tuner was required for a recording. + Shows user a notification message when this was required. v1.0.0.0 - + Created + + -- wsnipex Sun, 04 May 2014 09:03:36 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-nextpvr.version xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-nextpvr.version --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-nextpvr.version 2013-12-13 13:17:40.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-nextpvr.version 2014-05-04 07:05:26.000000000 +0000 @@ -1 +1 @@ -1.6.5-2saucy +1.9.7-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-njoy.changelog xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-njoy.changelog --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-njoy.changelog 2013-12-13 13:17:54.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-njoy.changelog 2014-05-04 07:05:40.000000000 +0000 @@ -1,5 +1,5 @@ -xbmc-pvr-addons (1.6.2-2saucy) saucy; urgency=low +xbmc-pvr-addons (1.9.5-14saucy) saucy; urgency=low * no upstream changelog available - -- wsnipex Fri, 13 Dec 2013 14:17:54 +0100 + -- wsnipex Sun, 04 May 2014 09:05:40 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-njoy.changelog.old xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-njoy.changelog.old --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-njoy.changelog.old 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-njoy.changelog.old 2014-05-04 07:03:48.000000000 +0000 @@ -0,0 +1,5 @@ +xbmc-pvr-addons (1.9.5-14trusty) trusty; urgency=low + + * no upstream changelog available + + -- wsnipex Sun, 04 May 2014 09:03:48 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-njoy.version xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-njoy.version --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-njoy.version 2013-12-13 13:17:51.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-njoy.version 2014-05-04 07:05:37.000000000 +0000 @@ -1 +1 @@ -1.6.2-2saucy +1.9.5-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-tvheadend-hts.changelog xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-tvheadend-hts.changelog --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-tvheadend-hts.changelog 2013-12-13 13:17:40.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-tvheadend-hts.changelog 2014-05-04 07:05:25.000000000 +0000 @@ -1,4 +1,4 @@ -xbmc-pvr-addons (1.6.19-2saucy) saucy; urgency=low +xbmc-pvr-addons (1.9.27-14saucy) saucy; urgency=low * - add timeshift skip support (FF/RW still not working) - fix bug in tvh webroot processing 1.6.18 - ensure channel count is not cleared @@ -32,4 +32,4 @@ removed unneeded member in CHTSPDemux - better handling of disconnect and reconnects 1.6.4 - initial release - -- wsnipex Fri, 13 Dec 2013 14:17:40 +0100 + -- wsnipex Sun, 04 May 2014 09:05:25 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-tvheadend-hts.changelog.old xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-tvheadend-hts.changelog.old --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-tvheadend-hts.changelog.old 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-tvheadend-hts.changelog.old 2014-05-04 07:03:34.000000000 +0000 @@ -0,0 +1,35 @@ +xbmc-pvr-addons (1.9.27-14trusty) trusty; urgency=low + + * - add timeshift skip support (FF/RW still not working) - fix bug in + tvh webroot processing 1.6.18 - ensure channel count is not cleared + after succesful sub - fix default webroot param - remove missing + files from recordings list - expand dvr directories to full + hierarchy 1.6.17 - fixed possible crash after reconnecting 1.6.16 - + correct some signed/unsigned mixups - added imagecache support + (icons on the backend) 1.6.15 - fix false disconnects by raising + default (hardcoded) read timeout value when opening streams from 10 + to 20 seconds. 1.6.14 - fix errors sent by client when fetching + events for a channel with no epg data 1.6.13 - make channel.radio to + not reset to false during update if tvheadend not provided channel + services - change handling of EPG events to not fail all events if + only one/few events were broken/malformed 1.6.12 - fix instant + recordings when channel has no epg data 1.6.11 - disable read + timeout check while the stream is paused 1.6.10 - fixed + authentication - display an error message when an error is detected + 1.6.9 - call to Close() didn't work in CHTSPData::Open() - don't + delete and create CHTSPReconnect each time, just stop the thread - + don't wait for an iframe but let tvheadend handle it - fixed missing + htsmsg_destroy() call after processing an incoming message 1.6.8 - + refactor CHTSPConnection - fixed disconnection checks and reconnect + when needed - consider the connection dropped if no data has been + received for a while - more efficient data reading - shared + connection between CHTSPDemux and CHTSPData 1.6.7 - add support for + servers with transcoding capabilities 1.6.6 - fixed radio playback + 1.6.5 - fixed channel and channel group update triggers - ensure + that the first demux is an I-frame - add + CHTSPConnection::CheckConnection() that waits for a connection to be + restored when it was dropped - cleaner CHTSPConnection::Connect() - + removed unneeded member in CHTSPDemux - better handling of + disconnect and reconnects 1.6.4 - initial release + + -- wsnipex Sun, 04 May 2014 09:03:34 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-tvheadend-hts.version xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-tvheadend-hts.version --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-tvheadend-hts.version 2013-12-13 13:17:37.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-tvheadend-hts.version 2014-05-04 07:05:23.000000000 +0000 @@ -1 +1 @@ -1.6.19-2saucy +1.9.27-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-vdr-vnsi.changelog xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-vdr-vnsi.changelog --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-vdr-vnsi.changelog 2013-12-13 13:17:37.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-vdr-vnsi.changelog 2014-05-04 07:05:23.000000000 +0000 @@ -1,5 +1,5 @@ -xbmc-pvr-addons (1.6.4-2saucy) saucy; urgency=low +xbmc-pvr-addons (1.9.8-14saucy) saucy; urgency=low * no upstream changelog available - -- wsnipex Fri, 13 Dec 2013 14:17:37 +0100 + -- wsnipex Sun, 04 May 2014 09:05:23 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-vdr-vnsi.changelog.old xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-vdr-vnsi.changelog.old --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-vdr-vnsi.changelog.old 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-vdr-vnsi.changelog.old 2014-05-04 07:03:31.000000000 +0000 @@ -0,0 +1,5 @@ +xbmc-pvr-addons (1.9.8-14trusty) trusty; urgency=low + + * no upstream changelog available + + -- wsnipex Sun, 04 May 2014 09:03:31 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-vdr-vnsi.version xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-vdr-vnsi.version --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-vdr-vnsi.version 2013-12-13 13:17:34.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-vdr-vnsi.version 2014-05-04 07:05:20.000000000 +0000 @@ -1 +1 @@ -1.6.4-2saucy +1.9.8-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-vuplus.changelog xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-vuplus.changelog --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-vuplus.changelog 2013-12-13 13:17:51.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-vuplus.changelog 2014-05-04 07:05:37.000000000 +0000 @@ -1,4 +1,4 @@ -xbmc-pvr-addons (1.6.7-2saucy) saucy; urgency=low +xbmc-pvr-addons (1.9.11-14saucy) saucy; urgency=low * 0.2.4 - fix: put username & password into the streaming url 0.2.3 - fix: put username & password into recording-url 0.2.2: - fix: escape @@ -48,4 +48,4 @@ 0.1.1 - fix: URLEncode the service reference when fetching EPG 0.1.0 - Iniital Version - -- wsnipex Fri, 13 Dec 2013 14:17:51 +0100 + -- wsnipex Sun, 04 May 2014 09:05:37 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-vuplus.changelog.old xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-vuplus.changelog.old --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-vuplus.changelog.old 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-vuplus.changelog.old 2014-05-04 07:03:45.000000000 +0000 @@ -0,0 +1,51 @@ +xbmc-pvr-addons (1.9.11-14trusty) trusty; urgency=low + + * 0.2.4 - fix: put username & password into the streaming url 0.2.3 - + fix: put username & password into recording-url 0.2.2: - fix: escape + xml entities in the stream-url before saving to channeldata.xml - + fix: fetch the version string from configure.in not the ChangeLog + (thanks to 'trans') - fix: rename changelog in addon-directory to + changelog.txt 0.2.1: - fix: encode the stream-url properly. Please + remove your channeldata.xml file after updating - change: add proper + version string to the addon.xml generated by buildzip.bat (thanks to + 'trans') 0.2.0: - change: Complete rework of timer handling. Now it + will only show notifications for changed items - fix: Update / Add / + Delete Timers. Note that the timer names in the XBMC are sometimes + not updated properly (in the dialog it is OK) - fix: Instant + Recordings do now work again - fix: timer status is now shown + correctly (completed, recording, disabled) - fix: enabling / + disabling timers do now work - change: removed "show completed + timers" option (they are now always be shown) - add: added + buildzip.bat & xbmc-addon-vuplus.sln (thanks to 'trans') - fix: + Channel numbering / incorrect picons due to the change introduced in + 0.1.15 0.1.15 - fix: when using the channeldata-store option not all + channel groups (bouquets) were loaded due to a nulled counter + variable 0.1.14 - change: change .gitignores and copy current + changelog into the addon folder. This will enable the user to view + the changelog in the addon settings window 0.1.13 - add: option to + set deepstandby powerstate on the DVB box on PVR-addon shutdown - + fix: error in settings.xml, causing crashes on linux 0.1.12 - add: + support to specify the folder for storing recordings 0.1.11 - fix: + some unicode string errors in german language file - change: add + categories to addon settings 0.1.10 - add: support for using only + the recording path currently active on the DVB box 0.1.9 - change: + add addon icon (copyied from the openelec guys, thanks!) - fix: + win32 release target (thanks to 'trans' for patch) 0.1.8 - change: + fetch the recording locations and use these locations when querying + the recordings - fix: Stop update thread when destroying the PVR + addon - fixes shutdown issues 0.1.7 - fix: Copy & Paste error 0.1.6 + - fix: Change the logic to determine the picon file name from the + service reference. 0.1.5 - fix: Fix access violation errors on + windows (thanks to 'trans' for finding the correct compiler / linker + settings) - fix: do not return out of scope local variable for the + streaming URL - fix: remove the last '_' character from the filename + (if applicable). Should finally fix the picon path errors. 0.1.4 - + fix: limit length of the service reference part of the Icon-Path to + 30 characters. - fix: Escape "&", "<" and ">" characters in XML + channeldata file. - add: support to disable all bouquet or channel + updates 0.1.3 - fix: order of timerlist cleanup and timerlist + updates 0.1.2 - add: support for storing channel data into a file + 0.1.1 - fix: URLEncode the service reference when fetching EPG 0.1.0 + - Iniital Version + + -- wsnipex Sun, 04 May 2014 09:03:45 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-vuplus.version xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-vuplus.version --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/debian/xbmc-pvr-vuplus.version 2013-12-13 13:17:48.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-vuplus.version 2014-05-04 07:05:34.000000000 +0000 @@ -1 +1 @@ -1.6.7-2saucy +1.9.11-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/.gitignore xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/.gitignore --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/.gitignore 2012-12-02 04:00:29.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/.gitignore 2014-01-04 10:28:19.000000000 +0000 @@ -33,6 +33,10 @@ *.pvr *.zip +*.idb +*.tlog +*.lastbuildstate + # Windows specific generated files *.exp *.lib diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/include/cmyth/cmyth.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/include/cmyth/cmyth.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/include/cmyth/cmyth.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/include/cmyth/cmyth.h 2014-01-28 20:43:50.000000000 +0000 @@ -262,6 +262,46 @@ extern int cmyth_conn_reconnect_event(cmyth_conn_t conn); /** + * Create a monitor connection to a backend. + * \param server server hostname or ip address + * \param port port number to connect on + * \param buflen buffer size for the connection to use + * \param tcp_rcvbuf if non-zero, the TCP receive buffer size for the socket + * \return control handle + */ +extern cmyth_conn_t cmyth_conn_connect_monitor(char *server, + uint16_t port, + uint32_t buflen, int32_t tcp_rcvbuf); + +/** + * Reconnect monitor connection to a backend. + * \param control control handle + * \return success: 1 + * \return failure: 0 + */ +extern int cmyth_conn_reconnect_monitor(cmyth_conn_t control); + +/** + * Create a playback connection to a backend. + * \param server server hostname or ip address + * \param port port number to connect on + * \param buflen buffer size for the connection to use + * \param tcp_rcvbuf if non-zero, the TCP receive buffer size for the socket + * \return control handle + */ +extern cmyth_conn_t cmyth_conn_connect_playback(char *server, + uint16_t port, + uint32_t buflen, int32_t tcp_rcvbuf); + +/** + * Reconnect playback connection to a backend. + * \param control control handle + * \return success: 1 + * \return failure: 0 + */ +extern int cmyth_conn_reconnect_playback(cmyth_conn_t control); + +/** * Create a file connection to a backend for reading a recording. * \param prog program handle * \param control control handle @@ -494,6 +534,8 @@ uint32_t start, uint32_t end); +extern cmyth_posmap_t cmyth_recorder_get_duration_map(cmyth_recorder_t rec, uint32_t start, uint32_t end); + extern cmyth_proginfo_t cmyth_recorder_get_recording(cmyth_recorder_t rec); extern int cmyth_recorder_stop_playing(cmyth_recorder_t rec); @@ -598,6 +640,7 @@ extern int cmyth_recorder_stop_livetv(cmyth_recorder_t rec); extern int cmyth_recorder_done_ringbuf(cmyth_recorder_t rec); extern uint32_t cmyth_recorder_get_recorder_id(cmyth_recorder_t rec); +extern int cmyth_recorder_set_live_recording(cmyth_recorder_t rec, uint8_t recording); /* * ----------------------------------------------------------------- @@ -607,8 +650,6 @@ extern cmyth_livetv_chain_t cmyth_livetv_chain_create(char * chainid); -extern cmyth_file_t cmyth_livetv_get_cur_file(cmyth_recorder_t rec); - extern int64_t cmyth_livetv_chain_duration(cmyth_recorder_t rec); extern int cmyth_livetv_chain_switch(cmyth_recorder_t rec, int dir); @@ -633,6 +674,12 @@ uint32_t buflen, int32_t tcp_rcvbuf, void (*prog_update_callback)(cmyth_proginfo_t)); +extern int32_t cmyth_livetv_chain_last(cmyth_recorder_t rec); + +extern cmyth_proginfo_t cmyth_livetv_chain_prog(cmyth_recorder_t rec, int32_t index); + +extern cmyth_file_t cmyth_livetv_chain_file(cmyth_recorder_t rec, int32_t index); + extern int32_t cmyth_livetv_get_block(cmyth_recorder_t rec, char *buf, int32_t len); @@ -649,6 +696,8 @@ extern int cmyth_mysql_tuner_type_check(cmyth_database_t db, cmyth_recorder_t rec, int check_tuner_enabled); +extern int cmyth_mysql_keep_livetv_recording(cmyth_database_t db, cmyth_proginfo_t prog, int8_t keep); + /* * ----------------------------------------------------------------- * Database Operations @@ -719,6 +768,12 @@ extern cmyth_timestamp_t cmyth_timestamp_from_unixtime(time_t l); +extern cmyth_timestamp_t cmyth_timestamp_utc_from_unixtime(time_t l); + +extern cmyth_timestamp_t cmyth_timestamp_to_utc(cmyth_timestamp_t ts); + +extern int cmyth_timestamp_isutc(cmyth_timestamp_t ts); + extern time_t cmyth_timestamp_to_unixtime(cmyth_timestamp_t ts); extern int cmyth_timestamp_to_string(char *str, cmyth_timestamp_t ts); @@ -744,6 +799,10 @@ extern char *cmyth_keyframe_string(cmyth_keyframe_t kf); +extern uint32_t cmyth_keyframe_number(cmyth_keyframe_t kf); + +extern int64_t cmyth_keyframe_pos(cmyth_keyframe_t kf); + /* * ----------------------------------------------------------------- * Position Map Operations @@ -751,6 +810,10 @@ */ extern cmyth_posmap_t cmyth_posmap_create(void); +extern int cmyth_posmap_count(cmyth_posmap_t pm); + +extern cmyth_keyframe_t cmyth_posmap_keyframe(cmyth_posmap_t pm, int index); + /* * ----------------------------------------------------------------- * Program Info Operations @@ -803,11 +866,13 @@ * Delete a program. * \param control backend control handle * \param prog proginfo handle + * \param force force deletion + * \param forget allow to record the recording * \return success: 0 * \return failure: -(errno) */ extern int cmyth_proginfo_delete_recording(cmyth_conn_t control, - cmyth_proginfo_t prog); + cmyth_proginfo_t prog, uint8_t force, uint8_t forget); /** * Delete a program such that it may be recorded again. @@ -875,6 +940,13 @@ extern uint16_t cmyth_proginfo_episode(cmyth_proginfo_t prog); /** + * Retrieve the syndicated episode of a program. + * \param prog proginfo handle + * \return null-terminated string + */ +extern char *cmyth_proginfo_syndicated_episode(cmyth_proginfo_t prog); + +/** * Retrieve the category of a program. * \param prog proginfo handle * \return null-terminated string @@ -949,7 +1021,7 @@ * \param prog proginfo handle * \return int32_t */ -extern int8_t cmyth_proginfo_priority(cmyth_proginfo_t prog); +extern int32_t cmyth_proginfo_priority(cmyth_proginfo_t prog); /** * Retrieve the critics rating (number of stars) of a program. @@ -1073,6 +1145,45 @@ */ extern uint16_t cmyth_proginfo_year(cmyth_proginfo_t prog); +/** + * Retrieve the part number for this program info + * \param prog proginfo handle + * \return part number + */ +extern uint16_t cmyth_proginfo_partnumber(cmyth_proginfo_t prog); + +/** + * Retrieve the part total for this program info + * \param prog proginfo handle + * \return part total + */ +extern uint16_t cmyth_proginfo_parttotal(cmyth_proginfo_t prog); + +/** + * Retrieve the watched status for this program info + * \param db database connection + * \param prog proginfo handle + * \param watchedStat returned status + * \return success: 1 = program found, 0 = program not found + * \return failure: -(errno) + */ +extern int cmyth_mysql_set_watched_status(cmyth_database_t db, cmyth_proginfo_t prog, int watchedStat); + +/** + * Retrieve the storage group for this program info + * \param prog proginfo handle + * \return null-terminated string + */ +extern char *cmyth_proginfo_storagegroup(cmyth_proginfo_t prog); + +/** + * Query to generate a pixmap for this program info + * \param prog proginfo handle + * \return success: 0 + * \return failure: -(errno) + */ +extern int cmyth_proginfo_generate_pixmap(cmyth_conn_t control, cmyth_proginfo_t prog); + /* * ----------------------------------------------------------------- * Program List Operations @@ -1139,9 +1250,9 @@ extern cmyth_freespace_t cmyth_freespace_create(void); /* - * ------- + * ----------------------------------------------------------------- * Bookmark,Commercial Skip Operations - * ------- + * ----------------------------------------------------------------- */ extern int64_t cmyth_get_bookmark(cmyth_conn_t conn, cmyth_proginfo_t prog); extern int64_t cmyth_mysql_get_bookmark_offset(cmyth_database_t db, uint32_t chanid, int64_t mark, time_t starttime, int mode); @@ -1150,54 +1261,29 @@ extern int cmyth_set_bookmark(cmyth_conn_t conn, cmyth_proginfo_t prog, int64_t bookmark); extern cmyth_commbreaklist_t cmyth_commbreaklist_create(void); extern cmyth_commbreak_t cmyth_commbreak_create(void); -extern cmyth_commbreaklist_t cmyth_mysql_get_commbreaklist(cmyth_database_t db, cmyth_conn_t conn, cmyth_proginfo_t prog); extern cmyth_commbreaklist_t cmyth_get_commbreaklist(cmyth_conn_t conn, cmyth_proginfo_t prog); extern cmyth_commbreaklist_t cmyth_get_cutlist(cmyth_conn_t conn, cmyth_proginfo_t prog); extern int cmyth_rcv_commbreaklist(cmyth_conn_t conn, int *err, cmyth_commbreaklist_t breaklist, int count); /* - * mysql info + * ----------------------------------------------------------------- + * Recording Groups Operations + * ----------------------------------------------------------------- */ - -typedef struct cmyth_program { - uint32_t chanid; - char callsign[21]; - char name[65]; - uint32_t sourceid; - char title[129]; - char subtitle[129]; - char description[1921]; - time_t starttime; - time_t endtime; - char programid[65]; - char seriesid[65]; - char category[65]; - char category_type[65]; - int8_t rec_status; - uint32_t channum; -} cmyth_program_t; - typedef struct cmyth_recgrougs { char recgroups[33]; } cmyth_recgroups_t; extern int cmyth_mysql_get_recgroups(cmyth_database_t, cmyth_recgroups_t **); -extern int cmyth_mysql_get_prog_finder_char_title(cmyth_database_t db, cmyth_program_t **prog, time_t starttime, char *program_name); -extern int cmyth_mysql_get_prog_finder_time(cmyth_database_t db, cmyth_program_t **prog, time_t starttime, char *program_name); -extern int cmyth_mysql_get_prog_finder_time_title_chan(cmyth_database_t db, cmyth_program_t *prog, time_t starttime, char *program_name, uint32_t chanid); -extern int cmyth_mysql_get_guide(cmyth_database_t db, cmyth_program_t **prog, uint32_t chanid, time_t starttime, time_t endtime); -extern int cmyth_mysql_testdb_connection(cmyth_database_t db,char **message); -extern char *cmyth_mysql_escape_chars(cmyth_database_t db, char * string); -extern int cmyth_mysql_get_commbreak_list(cmyth_database_t db, uint32_t chanid, time_t start_ts_dt, cmyth_commbreaklist_t breaklist, uint32_t conn_version); - -extern int cmyth_mysql_get_prev_recorded(cmyth_database_t db, cmyth_program_t **prog); - -extern int cmyth_get_delete_list(cmyth_conn_t, char *, cmyth_proglist_t); - -extern int cmyth_mysql_set_watched_status(cmyth_database_t db, cmyth_proginfo_t prog, int watchedStat); +/* + * ----------------------------------------------------------------- + * mysql info + * ----------------------------------------------------------------- + */ +extern int cmyth_mysql_testdb_connection(cmyth_database_t db,char **message); /* * ----------------------------------------------------------------- @@ -1293,6 +1379,15 @@ extern cmyth_recordingrule_t cmyth_recordingrule_init(void); /** + * Duplicate recording rule. + * Before forgetting the reference to this recording rule structure + * the caller must call ref_release(). + * \return success: A new recording rule + * \return failure: NULL + */ +extern cmyth_recordingrule_t cmyth_recordingrule_dup(cmyth_recordingrule_t rule); + +/** * Retrieves the 'recordid' field of a recording rule structure. * \param rr * \return success: recordid @@ -1714,6 +1809,21 @@ extern void cmyth_recordingrule_set_transcoder(cmyth_recordingrule_t rr, uint32_t transcoder); /** + * Retrieves the 'parentid' field of a recording rule structure. + * \param rr + * \return success: parentid + * \return failure: -(errno) + */ +extern uint32_t cmyth_recordingrule_parentid(cmyth_recordingrule_t rr); + +/** + * Set the 'parentid' field of the recording rule structure 'rr'. + * \param rr + * \param parentid + */ +extern void cmyth_recordingrule_set_parentid(cmyth_recordingrule_t rr, uint32_t parentid); + +/** * Retrieves the 'profile' field of a recording rule structure. * Before forgetting the reference to this string the caller * must call ref_release(). @@ -1745,6 +1855,40 @@ extern void cmyth_recordingrule_set_prefinput(cmyth_recordingrule_t rr, uint32_t prefinput); /** + * Retrieves the 'programid' field of a recording rule structure. + * Before forgetting the reference to this string the caller + * must call ref_release(). + * \param rr + * \return success: programid + * \return failure: NULL + */ +extern char *cmyth_recordingrule_programid(cmyth_recordingrule_t rr); + +/** + * Set the 'programid' field of the recording rule structure 'rr'. + * \param rr + * \param programid + */ +extern void cmyth_recordingrule_set_programid(cmyth_recordingrule_t rr, char *programid); + +/** + * Retrieves the 'seriesid' field of a recording rule structure. + * Before forgetting the reference to this string the caller + * must call ref_release(). + * \param rr + * \return success: seriesid + * \return failure: NULL + */ +extern char *cmyth_recordingrule_seriesid(cmyth_recordingrule_t rr); + +/** + * Set the 'seriesid' field of the recording rule structure 'rr'. + * \param rr + * \param seriesid + */ +extern void cmyth_recordingrule_set_seriesid(cmyth_recordingrule_t rr, char *seriesid); + +/** * Retrieves the 'autometadata' field of a recording rule structure. * \param rr * \return success: autometadata @@ -1862,7 +2006,7 @@ * \return failure: -(errno) * \see cmyth_recordingrule_recordid */ -extern int cmyth_mysql_delete_recordingrule(cmyth_database_t db, uint32_t recordid); +extern int cmyth_mysql_delete_recordingrule(cmyth_database_t db, cmyth_recordingrule_t rr); /** * Update recording rule within the database. @@ -1963,6 +2107,14 @@ extern uint8_t cmyth_channel_visible(cmyth_channel_t channel); /** + * Retrieves the 'radio' field of a channel structure. + * \param channel + * \return success: radio flag + * \return failure: -(errno) + */ +extern uint8_t cmyth_channel_radio(cmyth_channel_t channel); + +/** * Retrieves the 'sourceid' field of a channel structure. * \param channel * \return success: sourceid @@ -2054,13 +2206,13 @@ * Before forgetting the reference to this storagegroup file structure * the caller must call ref_release(). * \param control - * \param storagegroup * \param hostname + * \param storagegroup * \param filename * \return success: storage file handle * \return failure: NULL */ -extern cmyth_storagegroup_file_t cmyth_storagegroup_get_fileinfo(cmyth_conn_t control, char *storagegroup, char *hostname, char *filename); +extern cmyth_storagegroup_file_t cmyth_storagegroup_get_fileinfo(cmyth_conn_t control, char *hostname, char *storagegroup, char *filename); /** * Retrieves the number of elements in the storagegroup files list structure. @@ -2260,6 +2412,19 @@ */ extern int64_t cmyth_mysql_get_recording_framerate(cmyth_database_t db, cmyth_proginfo_t prog); +/** + * Retrieve seek offset for mark of recording + * \param db + * \param prog program info + * \param type markup type + * \param mark markup mark + * \param poffset to store previous offset found + * \param noffset to store next offset found + * \return success: mask of found offsets. 1:previous, 2:next, 3:both + * \return failure: -(errno) + */ +extern int8_t cmyth_mysql_get_recording_seek_offset(cmyth_database_t db, cmyth_proginfo_t prog, cmyth_recording_markup_t type, int64_t mark, int64_t *psoffset, int64_t *nsoffset); + /* * ----------------------------------------------------------------- * Recording artworks @@ -2280,4 +2445,41 @@ */ extern int cmyth_mysql_get_recording_artwork(cmyth_database_t db, cmyth_proginfo_t prog, char **coverart, char **fanart, char **banner); +/* + * ----------------------------------------------------------------- + * EPG info + * ----------------------------------------------------------------- + */ + +struct cmyth_epginfo; + +typedef struct cmyth_epginfo *cmyth_epginfo_t; + +struct cmyth_epginfolist; +typedef struct cmyth_epginfolist *cmyth_epginfolist_t; + +extern cmyth_epginfo_t cmyth_epginfolist_get_item(cmyth_epginfolist_t el, int index); +extern int cmyth_epginfolist_get_count(cmyth_epginfolist_t el); +extern uint32_t cmyth_epginfo_chanid(cmyth_epginfo_t e); +extern char * cmyth_epginfo_callsign(cmyth_epginfo_t e); +extern char * cmyth_epginfo_channame(cmyth_epginfo_t e); +extern uint32_t cmyth_epginfo_sourceid(cmyth_epginfo_t e); +extern char * cmyth_epginfo_title(cmyth_epginfo_t e); +extern char * cmyth_epginfo_subtitle(cmyth_epginfo_t e); +extern char * cmyth_epginfo_description(cmyth_epginfo_t e); +extern time_t cmyth_epginfo_starttime(cmyth_epginfo_t e); +extern time_t cmyth_epginfo_endtime(cmyth_epginfo_t e); +extern char * cmyth_epginfo_programid(cmyth_epginfo_t e); +extern char * cmyth_epginfo_seriesid(cmyth_epginfo_t e); +extern char * cmyth_epginfo_category(cmyth_epginfo_t e); +extern char * cmyth_epginfo_category_type(cmyth_epginfo_t e); +extern uint32_t cmyth_epginfo_channum(cmyth_epginfo_t e); + +extern int cmyth_mysql_get_prog_finder_char_title(cmyth_database_t db, cmyth_epginfolist_t *epglist, time_t starttime, char *program_name); +extern int cmyth_mysql_get_prog_finder_time(cmyth_database_t db, cmyth_epginfolist_t *epglist, time_t starttime, char *program_name); +extern int cmyth_mysql_get_prog_finder_chan(cmyth_database_t db, cmyth_epginfo_t *epg, time_t attime, uint32_t chanid); +extern int cmyth_mysql_get_prog_finder_time_title_chan(cmyth_database_t db, cmyth_epginfo_t *epg, time_t starttime, char *program_name, uint32_t chanid); +extern int cmyth_mysql_get_guide(cmyth_database_t db, cmyth_epginfolist_t *epglist, uint32_t chanid, time_t starttime, time_t endtime); +extern int cmyth_mysql_get_prev_recorded(cmyth_database_t db, cmyth_epginfolist_t *epglist); + #endif /* __CMYTH_H */ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/bookmark.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/bookmark.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/bookmark.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/bookmark.c 2014-01-04 10:28:12.000000000 +0000 @@ -42,11 +42,11 @@ sprintf(buf,"%s %"PRIu32" %s","QUERY_BOOKMARK",prog->proginfo_chanId, start_ts_dt); pthread_mutex_lock(&conn->conn_mutex);; - if ((err = cmyth_send_message(conn,buf)) < 0) { + if ((r = cmyth_send_message(conn,buf)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", - __FUNCTION__, err); - ret = err; + __FUNCTION__, r); + ret = r; goto out; } count = cmyth_rcv_length(conn); @@ -81,7 +81,15 @@ if (!buf) { return -ENOMEM; } - if (conn->conn_version >= 66) { + if (conn->conn_version >= 77) { + /* + * Since protocol 77 mythbackend no longer expects the trailing 4th parameter + * http://code.mythtv.org/trac/ticket/11104 + */ + sprintf(buf, "SET_BOOKMARK %"PRIu32" %s %"PRId64, prog->proginfo_chanId, + start_ts_dt, bookmark); + } + else if (conn->conn_version >= 66) { /* * Since protocol 66 mythbackend expects a single 64 bit integer rather than two 32 bit * hi and lo integers. Nevertheless the backend (at least up to 0.25) checks diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/channel.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/channel.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/channel.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/channel.c 2014-01-04 10:28:12.000000000 +0000 @@ -186,6 +186,8 @@ return; } + if(c->chanstr) + ref_release(c->chanstr); if(c->name) ref_release(c->name); if(c->callsign) @@ -427,6 +429,31 @@ } /* + * cmyth_channel_radio() + * + * + * Scope: PUBLIC + * + * Description + * + * Retrieves the 'radio' field of a channel structure. + * + * Return Value: + * + * Success: radio flag. + * + * Failure: 0 + */ +uint8_t +cmyth_channel_radio(cmyth_channel_t channel) +{ + if (!channel) { + return 0; + } + return channel->radio; +} + +/* * cmyth_channel_sourceid() * * diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/cmyth_local.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/cmyth_local.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/cmyth_local.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/cmyth_local.h 2014-01-28 20:43:50.000000000 +0000 @@ -62,6 +62,7 @@ #define CMYTH_INT16_LEN (sizeof("-65536") - 1) #define CMYTH_INT8_LEN (sizeof("-256") - 1) #define CMYTH_TIMESTAMP_LEN (sizeof("YYYY-MM-DDTHH:MM:SS") - 1) +#define CMYTH_TIMESTAMP_UTC_LEN (sizeof("YYYY-MM-DDTHH:MM:SSZ") - 1) #define CMYTH_TIMESTAMP_NUMERIC_LEN (sizeof("YYYYMMDDHHMMSS") - 1) #define CMYTH_DATESTAMP_LEN (sizeof("YYYY-MM-DD") - 1) #define CMYTH_UTC_LEN (sizeof("1240120680") - 1) @@ -187,6 +188,7 @@ unsigned long timestamp_minute; unsigned long timestamp_second; int timestamp_isdst; + int timestamp_isutc; }; struct cmyth_proginfo { @@ -195,6 +197,7 @@ char *proginfo_description; uint16_t proginfo_season; /* new in V67 */ uint16_t proginfo_episode; /* new in V67 */ + char *proginfo_syndicated_episode; /* new in V76 */ char *proginfo_category; uint32_t proginfo_chanId; char *proginfo_chanstr; @@ -213,7 +216,7 @@ uint32_t proginfo_source_id; /* ??? in V8 */ uint32_t proginfo_card_id; /* ??? in V8 */ uint32_t proginfo_input_id; /* ??? in V8 */ - int8_t proginfo_rec_priority; /* ??? in V8 */ + int32_t proginfo_rec_priority; /* ??? in V8 */ int8_t proginfo_rec_status; /* ??? in V8 */ uint32_t proginfo_record_id; /* ??? in V8 */ uint8_t proginfo_rec_type; /* ??? in V8 */ @@ -239,13 +242,15 @@ char *proginfo_host; uint32_t proginfo_version; char *proginfo_playgroup; /* new in v18 */ - int8_t proginfo_recpriority_2; /* new in V25 */ + int32_t proginfo_recpriority_2; /* new in V25 */ uint32_t proginfo_parentid; /* new in V31 */ char *proginfo_storagegroup; /* new in v32 */ uint16_t proginfo_audioproperties; /* new in v35 */ uint16_t proginfo_videoproperties; /* new in v35 */ uint16_t proginfo_subtitletype; /* new in v35 */ uint16_t proginfo_year; /* new in v43 */ + uint16_t proginfo_partnumber; /* new in V76 */ + uint16_t proginfo_parttotal; /* new in V76 */ }; struct cmyth_proglist { @@ -273,7 +278,7 @@ extern int cmyth_rcv_okay(cmyth_conn_t conn); #define cmyth_rcv_feedback __cmyth_rcv_feedback -extern int cmyth_rcv_feedback(cmyth_conn_t conn, char *fb); +extern int cmyth_rcv_feedback(cmyth_conn_t conn, char *fb, int fblen); #define cmyth_rcv_version __cmyth_rcv_version extern int cmyth_rcv_version(cmyth_conn_t conn, uint32_t *vers); @@ -305,7 +310,7 @@ extern int cmyth_rcv_uint32(cmyth_conn_t conn, int *err, uint32_t *buf, int count); #define cmyth_rcv_data __cmyth_rcv_data -extern int cmyth_rcv_data(cmyth_conn_t conn, int *err, unsigned char *buf, int count); +extern int cmyth_rcv_data(cmyth_conn_t conn, int *err, unsigned char *buf, int buflen, int count); #define cmyth_rcv_timestamp __cmyth_rcv_timestamp extern int cmyth_rcv_timestamp(cmyth_conn_t conn, int *err, @@ -336,6 +341,11 @@ cmyth_keyframe_t buf, int count); +#define cmyth_rcv_posmap __cmyth_rcv_posmap +extern int cmyth_rcv_posmap(cmyth_conn_t conn, int *err, + cmyth_posmap_t buf, + int count); + #define cmyth_rcv_freespace __cmyth_rcv_freespace extern int cmyth_rcv_freespace(cmyth_conn_t conn, int *err, cmyth_freespace_t buf, @@ -421,6 +431,7 @@ char *name; char *icon; uint8_t visible; + uint8_t radio; uint32_t sourceid; uint32_t multiplex; }; @@ -467,13 +478,16 @@ uint32_t maxepisodes; //range 0,100 uint8_t maxnewest; //bool uint32_t transcoder; //recordingprofiles id + uint32_t parentid; //parent rule recordid char* profile; uint32_t prefinput; + char* programid; + char* seriesid; uint8_t autometadata; //DB version 1278 char* inetref; //DB version 1278 uint16_t season; //DB version 1278 uint16_t episode; //DB version 1278 - uint32_t filter; //DB version 1276 + uint32_t filter; //DB version 1276 }; struct cmyth_recordingrulelist { @@ -509,4 +523,41 @@ #define cmyth_storagegroup_filelist_create __cmyth_storagegroup_filelist_create extern cmyth_storagegroup_filelist_t cmyth_storagegroup_filelist_create(void); +/* + * From epginfo.c + */ +struct cmyth_epginfo { + uint32_t chanid; + char* callsign; + char* channame; + uint32_t sourceid; + char* title; + char* subtitle; + char* description; + time_t starttime; + time_t endtime; + char* programid; + char* seriesid; + char* category; + char* category_type; + uint32_t channum; +}; + +struct cmyth_epginfolist { + cmyth_epginfo_t *epginfolist_list; + int epginfolist_count; +}; + +#define cmyth_epginfo_create __cmyth_epginfo_create +extern cmyth_epginfo_t cmyth_epginfo_create(void); + +#define cmyth_epginfolist_create __cmyth_epginfolist_create +extern cmyth_epginfolist_t cmyth_epginfolist_create(void); + +/* + * From mythtv_mysql.c + */ +#define cmyth_mysql_escape_chars __cmyth_mysql_escape_chars +extern char *cmyth_mysql_escape_chars(cmyth_database_t db, char * string); + #endif /* __CMYTH_LOCAL_H */ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/cmyth_msc.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/cmyth_msc.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/cmyth_msc.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/cmyth_msc.h 2014-01-04 10:28:12.000000000 +0000 @@ -32,6 +32,7 @@ #include #include #include +#include #pragma warning(disable:4267) #pragma warning(disable:4996) @@ -48,6 +49,7 @@ typedef int socklen_t; #define snprintf _snprintf +#define gmtime_r(a, b) gmtime_s(b, a) #define sleep(a) Sleep(a*1000) #define usleep(a) Sleep(a/1000) diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/commbreak.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/commbreak.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/commbreak.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/commbreak.c 2014-01-04 10:28:12.000000000 +0000 @@ -191,11 +191,11 @@ int total = 0; int rows; int64_t mark; - int64_t start_mark; + int64_t start_mark = 0; char *failed = NULL; cmyth_commbreak_t commbreak; uint8_t type; - uint8_t start_type; + uint8_t start_type = -1; int started = 0; int i; @@ -278,30 +278,3 @@ __FUNCTION__, failed, *err); return total; } - -cmyth_commbreaklist_t -cmyth_mysql_get_commbreaklist(cmyth_database_t db, cmyth_conn_t conn, cmyth_proginfo_t prog) -{ - cmyth_commbreaklist_t breaklist = cmyth_commbreaklist_create(); - time_t start_ts_dt; - int r; - - start_ts_dt = cmyth_timestamp_to_unixtime(prog->proginfo_rec_start_ts); - pthread_mutex_lock(&conn->conn_mutex); - if ((r=cmyth_mysql_get_commbreak_list(db, prog->proginfo_chanId, start_ts_dt, breaklist, conn->conn_version)) < 0) { - cmyth_dbg(CMYTH_DBG_ERROR, - "%s: cmyth_mysql_get_commbreak_list() failed (%d)\n", - __FUNCTION__, r); - goto out; - } - - fprintf(stderr, "Found %d commercial breaks for current program.\n", breaklist->commbreak_count); - if (r != breaklist->commbreak_count) { - fprintf(stderr, "commbreak error. Setting number of commercial breaks to zero\n"); - cmyth_dbg(CMYTH_DBG_ERROR, "%s - returned rows=%d commbreak_count=%d\n",__FUNCTION__, r,breaklist->commbreak_count); - breaklist->commbreak_count = 0; - } - out: - pthread_mutex_unlock(&conn->conn_mutex); - return breaklist; -} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/connection.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/connection.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/connection.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/connection.c 2014-01-04 10:28:12.000000000 +0000 @@ -53,6 +53,8 @@ {73, "D7FE8D6F"}, {74, "SingingPotato"}, {75, "SweetRock"}, + {76, "FireWilde"}, + {77, "WindMark" }, {0, ""} }; @@ -204,8 +206,8 @@ } static cmyth_conn_t -cmyth_connect_addr(struct addrinfo* addr, uint32_t buflen, - int32_t tcp_rcvbuf) +cmyth_connect_addr(struct addrinfo* addr, char *server, char *service, + int32_t buflen, int32_t tcp_rcvbuf) { cmyth_conn_t ret = NULL; unsigned char *buf = NULL; @@ -216,7 +218,6 @@ #endif int temp; socklen_t size; - char namebuf[NI_MAXHOST], portbuf[NI_MAXSERV]; fd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); if (fd < 0) { @@ -236,19 +237,17 @@ temp = tcp_rcvbuf; size = sizeof(temp); cmyth_dbg(CMYTH_DBG_DEBUG, "%s: setting socket option SO_RCVBUF to %d", __FUNCTION__, tcp_rcvbuf); - setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (void*)&temp, size); + if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (void*)&temp, size)) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: could not set rcvbuf from socket(%d)\n", + __FUNCTION__, errno); + } if(getsockopt(fd, SOL_SOCKET, SO_RCVBUF, (void*)&temp, &size)) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: could not get rcvbuf from socket(%d)\n", __FUNCTION__, errno); } - if (getnameinfo(addr->ai_addr, addr->ai_addrlen, namebuf, sizeof(namebuf), portbuf, sizeof(portbuf), NI_NUMERICHOST)) { - strcpy(namebuf, "[unknown]"); - strcpy(portbuf, "[unknown]"); - } - cmyth_dbg(CMYTH_DBG_PROTO, "%s: connecting to %s:%s fd = %d\n", - __FUNCTION__, namebuf, portbuf, fd); + __FUNCTION__, server, service, fd); #ifndef _MSC_VER old_sighandler = signal(SIGALRM, sighandler); old_alarm = alarm(5); @@ -256,8 +255,8 @@ my_fd = fd; if (connect(fd, addr->ai_addr, addr->ai_addrlen) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, - "%s: connect failed on port %s to '%s' (%d)\n", - __FUNCTION__, portbuf, namebuf, errno); + "%s: failed to connect to %s:%s (%d)\n", + __FUNCTION__, server, service, errno); closesocket(fd); #ifndef _MSC_VER signal(SIGALRM, old_sighandler); @@ -311,7 +310,7 @@ cmyth_dbg(CMYTH_DBG_PROTO, "%s: error connecting to " "%s, shutdown and close fd = %d\n", - __FUNCTION__, namebuf, fd); + __FUNCTION__, server, fd); shutdown(fd, 2); closesocket(fd); return NULL; @@ -327,7 +326,6 @@ #endif int temp; socklen_t size; - char namebuf[NI_MAXHOST], portbuf[NI_MAXSERV]; if (conn->conn_fd >= 0) { shutdown(conn->conn_fd, 2); @@ -353,27 +351,25 @@ temp = conn->conn_tcp_rcvbuf; size = sizeof(temp); cmyth_dbg(CMYTH_DBG_DEBUG, "%s: setting socket option SO_RCVBUF to %d", __FUNCTION__, conn->conn_tcp_rcvbuf); - setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (void*)&temp, size); + if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (void*)&temp, size)) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: could not set rcvbuf from socket(%d)\n", + __FUNCTION__, errno); + } if (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, (void*)&temp, &size)) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: could not get rcvbuf from socket(%d)\n", __FUNCTION__, errno); } - if (getnameinfo(addr->ai_addr, addr->ai_addrlen, namebuf, sizeof(namebuf), portbuf, sizeof(portbuf), NI_NUMERICHOST)) { - strcpy(namebuf, "[unknown]"); - strcpy(portbuf, "[unknown]"); - } - - cmyth_dbg(CMYTH_DBG_PROTO, "%s: connecting to %s:%s fd = %d\n", - __FUNCTION__, namebuf, portbuf, fd); + cmyth_dbg(CMYTH_DBG_PROTO, "%s: connecting to %s:%"PRIu16" fd = %d\n", + __FUNCTION__, conn->server, conn->port, fd); #ifndef _MSC_VER old_sighandler = signal(SIGALRM, sighandler); old_alarm = alarm(5); #endif my_fd = fd; if (connect(fd, addr->ai_addr, addr->ai_addrlen) < 0) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: connect failed on port %s to '%s' (%d)\n", - __FUNCTION__, portbuf, namebuf, errno); + cmyth_dbg(CMYTH_DBG_ERROR, "%s: failed to connect to %s:%"PRIu16" (%d)\n", + __FUNCTION__, conn->server, conn->port, errno); closesocket(fd); #ifndef _MSC_VER signal(SIGALRM, old_sighandler); @@ -402,7 +398,7 @@ shut: cmyth_dbg(CMYTH_DBG_PROTO, "%s: error connecting to " "%s, shutdown and close fd = %d\n", - __FUNCTION__, namebuf, fd); + __FUNCTION__, conn->server, fd); shutdown(fd, 2); closesocket(fd); @@ -457,7 +453,7 @@ } for (addr = result; addr; addr = addr->ai_next) { - conn = cmyth_connect_addr(addr, buflen, tcp_rcvbuf); + conn = cmyth_connect_addr(addr, server, service, buflen, tcp_rcvbuf); if (conn) break; } @@ -772,10 +768,8 @@ * * Description: * - * Create a connection for use as a control connection within the - * MythTV protocol. Return a pointer to the newly created connection. - * The connection is returned held, and may be released using - * ref_release(). + * Reconnect connection for use as a control connection within the + * MythTV protocol. * * Return Value: * @@ -801,6 +795,24 @@ return ret; } +/* + * cmyth_conn_connect_event() + * + * Scope: PUBLIC + * + * Description: + * + * Create a connection for use as a event connection within the + * MythTV protocol. Return a pointer to the newly created connection. + * The connection is returned held, and may be released using + * ref_release(). + * + * Return Value: + * + * Success: Non-NULL cmyth_conn_t (this is a pointer type) + * + * Failure: NULL cmyth_conn_t + */ cmyth_conn_t cmyth_conn_connect_event(char *server, uint16_t port, uint32_t buflen, int32_t tcp_rcvbuf) @@ -815,6 +827,22 @@ return ret; } +/* + * cmyth_conn_reconnect_event() + * + * Scope: PUBLIC + * + * Description: + * + * Reconnect connection for use as a event connection within the + * MythTV protocol. + * + * Return Value: + * + * Success: 1 + * + * Failure: 0 + */ int cmyth_conn_reconnect_event(cmyth_conn_t conn) { @@ -831,6 +859,138 @@ } /* + * cmyth_conn_connect_monitor() + * + * Scope: PUBLIC + * + * Description: + * + * Create a connection for use as a monitor connection within the + * MythTV protocol. Return a pointer to the newly created connection. + * The connection is returned held, and may be released using + * ref_release(). + * + * Return Value: + * + * Success: Non-NULL cmyth_conn_t (this is a pointer type) + * + * Failure: NULL cmyth_conn_t + */ +cmyth_conn_t +cmyth_conn_connect_monitor(char *server, uint16_t port, uint32_t buflen, + int32_t tcp_rcvbuf) +{ + cmyth_conn_t ret; + + cmyth_dbg(CMYTH_DBG_PROTO, "%s: connecting monitor connection\n", + __FUNCTION__); + ret = cmyth_conn_connect(server, port, buflen, tcp_rcvbuf, 0, ANN_MONITOR); + cmyth_dbg(CMYTH_DBG_PROTO, "%s: done connecting monitor connection ret = %p\n", + __FUNCTION__, ret); + return ret; +} + +/* + * cmyth_conn_reconnect_monitor() + * + * Scope: PUBLIC + * + * Description: + * + * Reconnect connection for use as a monitor connection within the + * MythTV protocol. + * + * Return Value: + * + * Success: 1 + * + * Failure: 0 + */ +int +cmyth_conn_reconnect_monitor(cmyth_conn_t control) +{ + int ret; + + cmyth_dbg(CMYTH_DBG_PROTO, "%s: reconnecting monitor connection\n", + __FUNCTION__); + if (control) + ret = cmyth_conn_reconnect(control, 0, ANN_MONITOR); + else + ret = 0; + if (ret) + control->conn_hang = 0; + cmyth_dbg(CMYTH_DBG_PROTO, "%s: done reconnecting monitor connection ret = %d\n", + __FUNCTION__, ret); + return ret; +} + +/* + * cmyth_conn_connect_playback() + * + * Scope: PUBLIC + * + * Description: + * + * Create a connection for use as a playback connection within the + * MythTV protocol. Return a pointer to the newly created connection. + * The connection is returned held, and may be released using + * ref_release(). + * + * Return Value: + * + * Success: Non-NULL cmyth_conn_t (this is a pointer type) + * + * Failure: NULL cmyth_conn_t + */ +cmyth_conn_t +cmyth_conn_connect_playback(char *server, uint16_t port, uint32_t buflen, + int32_t tcp_rcvbuf) +{ + cmyth_conn_t ret; + + cmyth_dbg(CMYTH_DBG_PROTO, "%s: connecting playback connection\n", + __FUNCTION__); + ret = cmyth_conn_connect(server, port, buflen, tcp_rcvbuf, 0, ANN_PLAYBACK); + cmyth_dbg(CMYTH_DBG_PROTO, "%s: done connecting playback connection ret = %p\n", + __FUNCTION__, ret); + return ret; +} + +/* + * cmyth_conn_reconnect_playback() + * + * Scope: PUBLIC + * + * Description: + * + * Reconnect connection for use as a playback connection within the + * MythTV protocol. + * + * Return Value: + * + * Success: 1 + * + * Failure: 0 + */ +int +cmyth_conn_reconnect_playback(cmyth_conn_t control) +{ + int ret; + + cmyth_dbg(CMYTH_DBG_PROTO, "%s: reconnecting playback connection\n", + __FUNCTION__); + if (control) + ret = cmyth_conn_reconnect(control, 0, ANN_PLAYBACK); + else + ret = 0; + if (ret) + control->conn_hang = 0; + cmyth_dbg(CMYTH_DBG_PROTO, "%s: done reconnecting playback connection ret = %d\n", + __FUNCTION__, ret); + return ret; +} + +/* * cmyth_conn_connect_file() * * Scope: PUBLIC @@ -1010,13 +1170,6 @@ uint32_t file_id; int64_t file_length; - ret = cmyth_file_create(control); - if (!ret) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_file_create() failed\n", - __FUNCTION__); - goto shut; - } - cmyth_dbg(CMYTH_DBG_PROTO, "%s: connecting data connection\n", __FUNCTION__); conn = cmyth_connect(control->server, control->port, buflen, tcp_rcvbuf); @@ -1219,7 +1372,7 @@ cmyth_dbg(CMYTH_DBG_PROTO, "%s: connecting recorder control\n", __FUNCTION__); - conn = cmyth_conn_connect_ctrl(server, port, buflen, tcp_rcvbuf); + conn = cmyth_conn_connect(server, port, buflen, tcp_rcvbuf, 0, ANN_PLAYBACK); cmyth_dbg(CMYTH_DBG_PROTO, "%s: done connecting recorder control, conn = %p\n", __FUNCTION__, conn); @@ -1603,7 +1756,7 @@ if (!conn) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", __FUNCTION__); - return -1; + return -EINVAL; } return conn->conn_version; @@ -1622,17 +1775,17 @@ if (!conn) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", __FUNCTION__); - return -1; + return -EINVAL; } pthread_mutex_lock(&conn->conn_mutex); snprintf(msg, sizeof(msg), "GET_FREE_RECORDER_COUNT"); - if ((err = cmyth_send_message(conn, msg)) < 0) { + if ((r = cmyth_send_message(conn, msg)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", - __FUNCTION__, err); - ret = err; + __FUNCTION__, r); + ret = r; goto err; } @@ -1665,17 +1818,17 @@ int count, err; char* result = NULL; - pthread_mutex_lock(&conn->conn_mutex); - if(conn->conn_version < 17) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: protocol version doesn't support QUERY_HOSTNAME\n", + if (!conn) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", __FUNCTION__); return NULL; } - if (!conn) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", + pthread_mutex_lock(&conn->conn_mutex); + if(conn->conn_version < 17) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: protocol version doesn't support QUERY_HOSTNAME\n", __FUNCTION__); - return NULL; + goto err; } if ((err = cmyth_send_message(conn, "QUERY_HOSTNAME")) < 0) { @@ -1740,14 +1893,14 @@ int count, err; char* result = NULL; - if(conn->conn_version < 17) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: protocol version doesn't support QUERY_SETTING\n", + if (!conn) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", __FUNCTION__); return NULL; } - if (!conn) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", + if(conn->conn_version < 17) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: protocol version doesn't support QUERY_SETTING\n", __FUNCTION__); return NULL; } @@ -1803,6 +1956,12 @@ { char* result = NULL; + if (!conn) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", + __FUNCTION__); + return NULL; + } + pthread_mutex_lock(&conn->conn_mutex); result = cmyth_conn_get_setting_unlocked(conn, hostname, setting); pthread_mutex_unlock(&conn->conn_mutex); @@ -1816,16 +1975,16 @@ char msg[1024]; int err = 0; - if(conn->conn_version < 17) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: protocol version doesn't support SET_SETTING\n", + if (!conn) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", __FUNCTION__); - return -1; + return -EINVAL; } - if (!conn) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", + if(conn->conn_version < 17) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: protocol version doesn't support SET_SETTING\n", __FUNCTION__); - return -2; + return -EPERM; } snprintf(msg, sizeof(msg), "SET_SETTING %s %s %s", hostname, setting, value); @@ -1833,13 +1992,13 @@ cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", __FUNCTION__, err); - return -3; + return err; } - if (cmyth_rcv_okay(conn) < 0) { + if ((err = cmyth_rcv_okay(conn)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_okay() failed\n", __FUNCTION__); - return -4; + return err; } return 0; @@ -1850,6 +2009,12 @@ { int result; + if (!conn) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", + __FUNCTION__); + return -EINVAL; + } + pthread_mutex_lock(&conn->conn_mutex); result = cmyth_conn_set_setting_unlocked(conn, hostname, setting, value); pthread_mutex_unlock(&conn->conn_mutex); @@ -1879,10 +2044,16 @@ int err = 0; char msg[256]; + if (!conn) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", + __FUNCTION__); + return -EINVAL; + } + if (conn->conn_version < 15) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: protocol version doesn't support RESCHEDULE_RECORDINGS\n", __FUNCTION__); - return -1; + return -EPERM; } /* @@ -1929,7 +2100,7 @@ goto out; } - if ((err=cmyth_rcv_feedback(conn, "1")) < 0) { + if ((err=cmyth_rcv_feedback(conn, "1", 1)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_feedback() failed (%d)\n", __FUNCTION__, err); @@ -1939,4 +2110,4 @@ out: pthread_mutex_unlock(&conn->conn_mutex); return err; -} \ No newline at end of file +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/epginfo.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/epginfo.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/epginfo.c 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/epginfo.c 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,603 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://www.xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ + +#include +#include +#include +#include +#include + +static void +cmyth_epginfolist_destroy(cmyth_epginfolist_t el) +{ + int i; + + cmyth_dbg(CMYTH_DBG_DEBUG, "%s\n", __FUNCTION__); + if (!el) { + return; + } + for (i = 0; i < el->epginfolist_count; ++i) { + if (el->epginfolist_list[i]) { + ref_release(el->epginfolist_list[i]); + } + el->epginfolist_list[i] = NULL; + } + if (el->epginfolist_list) { + free(el->epginfolist_list); + } +} + +cmyth_epginfolist_t +cmyth_epginfolist_create(void) +{ + cmyth_epginfolist_t ret; + + cmyth_dbg(CMYTH_DBG_DEBUG, "%s\n", __FUNCTION__); + ret = ref_alloc(sizeof(*ret)); + if (!ret) { + return(NULL); + } + ref_set_destroy(ret, (ref_destroy_t)cmyth_epginfolist_destroy); + + ret->epginfolist_list = NULL; + ret->epginfolist_count = 0; + return ret; +} + +void +cmyth_epginfo_destroy(cmyth_epginfo_t e) +{ + cmyth_dbg(CMYTH_DBG_DEBUG, "%s {\n", __FUNCTION__); + if (!e) { + cmyth_dbg(CMYTH_DBG_DEBUG, "%s }!a\n", __FUNCTION__); + return; + } + cmyth_dbg(CMYTH_DBG_DEBUG, "%s }\n", __FUNCTION__); + + if (e->callsign) { + ref_release(e->callsign); + } + if (e->channame) { + ref_release(e->channame); + } + if (e->title) { + ref_release(e->title); + } + if (e->subtitle) { + ref_release(e->subtitle); + } + if (e->description) { + ref_release(e->description); + } + if (e->programid) { + ref_release(e->programid); + } + if (e->seriesid) { + ref_release(e->seriesid); + } + if (e->category) { + ref_release(e->category); + } + if (e->category_type) { + ref_release(e->category_type); + } +} + +cmyth_epginfo_t +cmyth_epginfo_create(void) +{ + cmyth_epginfo_t ret = ref_alloc(sizeof(*ret)); + + cmyth_dbg(CMYTH_DBG_DEBUG, "%s {\n", __FUNCTION__); + if (!ret) { + cmyth_dbg(CMYTH_DBG_DEBUG, "%s }!\n", __FUNCTION__); + return NULL; + } + ref_set_destroy(ret, (ref_destroy_t)cmyth_epginfo_destroy); + + ret->chanid = 0; + ret->callsign = NULL; + ret->channame = NULL; + ret->sourceid = 0; + ret->title = NULL; + ret->subtitle = NULL; + ret->description = NULL; + ret->starttime = 0; + ret->endtime = 0; + ret->programid = NULL; + ret->seriesid = NULL; + ret->category = NULL; + ret->category_type = NULL; + ret->channum = 0; + + cmyth_dbg(CMYTH_DBG_DEBUG, "%s }\n", __FUNCTION__); + return ret; +} + +/* + * cmyth_epginfolist_get_item() + * + * Scope: PUBLIC + * + * Description: + * + * Retrieve the EPG structure found at index 'index' in the list in 'el'. + * Return the EPG structure held. Before forgetting the reference to this + * EPG structure the caller must call ref_release(). + * + * Return Value: + * + * Success: A non-null cmyth_epginfo_t (this is a pointer type) + * + * Failure: A NULL cmyth_epginfo_t + */ +cmyth_epginfo_t +cmyth_epginfolist_get_item(cmyth_epginfolist_t el, int index) +{ + if (!el) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL epginfo list\n", + __FUNCTION__); + return NULL; + } + if (!el->epginfolist_list) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL list\n", + __FUNCTION__); + return NULL; + } + if ((index < 0) || (index >= el->epginfolist_count)) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: index %d out of range\n", + __FUNCTION__, index); + return NULL; + } + ref_hold(el->epginfolist_list[index]); + return el->epginfolist_list[index]; +} + +/* + * cmyth_epginfolist_get_count() + * + * Scope: PUBLIC + * + * Description: + * + * Retrieve the number of elements in the EPG list + * structure in 'el'. + * + * Return Value: + * + * Success: A number >= 0 indicating the number of items in 'el' + * + * Failure: -(errno) + */ +int +cmyth_epginfolist_get_count(cmyth_epginfolist_t el) +{ + if (!el) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL epginfo list\n", + __FUNCTION__); + return -EINVAL; + } + return el->epginfolist_count; +} + +/* + * cmyth_epginfo_chanid() + * + * + * Scope: PUBLIC + * + * Description + * + * Retrieves the 'chanid' field of a epginfo structure. + * + * Return Value: + * + * Success: long chanid number. + * + * Failure: 0 + */ +uint32_t +cmyth_epginfo_chanid(cmyth_epginfo_t e) +{ + if (!e) { + return 0; + } + return e->chanid; +} + +/* + * cmyth_epginfo_callsign() + * + * + * Scope: PUBLIC + * + * Description + * + * Retrieves the 'callsign' field of a epginfo structure. + * + * The returned string is a pointer to the string within the epginfo + * structure, so it should not be modified by the caller. The + * return value is a 'char *' for this reason. + * Before forgetting the reference to this string the caller + * must call ref_release(). + * + * Return Value: + * + * Success: A pointer to a 'char *' pointing to the field. + * + * Failure: NULL + */ +char * +cmyth_epginfo_callsign(cmyth_epginfo_t e) +{ + if (!e) { + return NULL; + } + return ref_hold(e->callsign); +} + +/* + * cmyth_epginfo_channame() + * + * + * Scope: PUBLIC + * + * Description + * + * Retrieves the 'channame' field of a epginfo structure. + * + * The returned string is a pointer to the string within the epginfo + * structure, so it should not be modified by the caller. The + * return value is a 'char *' for this reason. + * Before forgetting the reference to this string the caller + * must call ref_release(). + * + * Return Value: + * + * Success: A pointer to a 'char *' pointing to the field. + * + * Failure: NULL + */ +char * +cmyth_epginfo_channame(cmyth_epginfo_t e) +{ + if (!e) { + return NULL; + } + return ref_hold(e->channame); +} + +/* + * cmyth_epginfo_sourceid() + * + * + * Scope: PUBLIC + * + * Description + * + * Retrieves the 'sourceid' field of a epginfo structure. + * + * Return Value: + * + * Success: long sourceid number. + * + * Failure: 0 + */ +uint32_t +cmyth_epginfo_sourceid(cmyth_epginfo_t e) +{ + if (!e) { + return 0; + } + return e->sourceid; +} + +/* + * cmyth_epginfo_title() + * + * + * Scope: PUBLIC + * + * Description + * + * Retrieves the 'title' field of a epginfo structure. + * + * The returned string is a pointer to the string within the epginfo + * structure, so it should not be modified by the caller. The + * return value is a 'char *' for this reason. + * Before forgetting the reference to this string the caller + * must call ref_release(). + * + * Return Value: + * + * Success: A pointer to a 'char *' pointing to the field. + * + * Failure: NULL + */ +char * +cmyth_epginfo_title(cmyth_epginfo_t e) +{ + if (!e) { + return NULL; + } + return ref_hold(e->title); +} + +/* + * cmyth_epginfo_subtitle() + * + * + * Scope: PUBLIC + * + * Description + * + * Retrieves the 'subtitle' field of a epginfo structure. + * + * The returned string is a pointer to the string within the epginfo + * structure, so it should not be modified by the caller. The + * return value is a 'char *' for this reason. + * Before forgetting the reference to this string the caller + * must call ref_release(). + * + * Return Value: + * + * Success: A pointer to a 'char *' pointing to the field. + * + * Failure: NULL + */ +char * +cmyth_epginfo_subtitle(cmyth_epginfo_t e) +{ + if (!e) { + return NULL; + } + return ref_hold(e->subtitle); +} + +/* + * cmyth_epginfo_description() + * + * + * Scope: PUBLIC + * + * Description + * + * Retrieves the 'description' field of a epginfo structure. + * + * The returned string is a pointer to the string within the epginfo + * structure, so it should not be modified by the caller. The + * return value is a 'char *' for this reason. + * Before forgetting the reference to this string the caller + * must call ref_release(). + * + * Return Value: + * + * Success: A pointer to a 'char *' pointing to the field. + * + * Failure: NULL + */ +char * +cmyth_epginfo_description(cmyth_epginfo_t e) +{ + if (!e) { + return NULL; + } + return ref_hold(e->description); +} + +/* + * cmyth_epginfo_starttime() + * + * + * Scope: PUBLIC + * + * Description + * + * Retrieves the 'starttime' field of a epginfo structure. + * + * Return Value: + * + * Success: long starttime number. + * + * Failure: 0 + */ +time_t +cmyth_epginfo_starttime(cmyth_epginfo_t e) +{ + if (!e) { + return 0; + } + return e->starttime; +} + +/* + * cmyth_epginfo_endtime() + * + * + * Scope: PUBLIC + * + * Description + * + * Retrieves the 'endtime' field of a epginfo structure. + * + * Return Value: + * + * Success: long endtime number. + * + * Failure: 0 + */ +time_t +cmyth_epginfo_endtime(cmyth_epginfo_t e) +{ + if (!e) { + return 0; + } + return e->endtime; +} + +/* + * cmyth_epginfo_programid() + * + * + * Scope: PUBLIC + * + * Description + * + * Retrieves the 'programid' field of a epginfo structure. + * + * The returned string is a pointer to the string within the epginfo + * structure, so it should not be modified by the caller. The + * return value is a 'char *' for this reason. + * Before forgetting the reference to this string the caller + * must call ref_release(). + * + * Return Value: + * + * Success: A pointer to a 'char *' pointing to the field. + * + * Failure: NULL + */ +char * +cmyth_epginfo_programid(cmyth_epginfo_t e) +{ + if (!e) { + return NULL; + } + return ref_hold(e->programid); +} + +/* + * cmyth_epginfo_seriesid() + * + * + * Scope: PUBLIC + * + * Description + * + * Retrieves the 'seriesid' field of a epginfo structure. + * + * The returned string is a pointer to the string within the epginfo + * structure, so it should not be modified by the caller. The + * return value is a 'char *' for this reason. + * Before forgetting the reference to this string the caller + * must call ref_release(). + * + * Return Value: + * + * Success: A pointer to a 'char *' pointing to the field. + * + * Failure: NULL + */ +char * +cmyth_epginfo_seriesid(cmyth_epginfo_t e) +{ + if (!e) { + return NULL; + } + return ref_hold(e->seriesid); +} + +/* + * cmyth_epginfo_category() + * + * + * Scope: PUBLIC + * + * Description + * + * Retrieves the 'category' field of a epginfo structure. + * + * The returned string is a pointer to the string within the epginfo + * structure, so it should not be modified by the caller. The + * return value is a 'char *' for this reason. + * Before forgetting the reference to this string the caller + * must call ref_release(). + * + * Return Value: + * + * Success: A pointer to a 'char *' pointing to the field. + * + * Failure: NULL + */ +char * +cmyth_epginfo_category(cmyth_epginfo_t e) +{ + if (!e) { + return NULL; + } + return ref_hold(e->category); +} + +/* + * cmyth_epginfo_category_type() + * + * + * Scope: PUBLIC + * + * Description + * + * Retrieves the 'category_type' field of a epginfo structure. + * + * The returned string is a pointer to the string within the epginfo + * structure, so it should not be modified by the caller. The + * return value is a 'char *' for this reason. + * Before forgetting the reference to this string the caller + * must call ref_release(). + * + * Return Value: + * + * Success: A pointer to a 'char *' pointing to the field. + * + * Failure: NULL + */ +char * +cmyth_epginfo_category_type(cmyth_epginfo_t e) +{ + if (!e) { + return NULL; + } + return ref_hold(e->category_type); +} + +/* + * cmyth_epginfo_channum() + * + * + * Scope: PUBLIC + * + * Description + * + * Retrieves the 'channum' field of a epginfo structure. + * + * Return Value: + * + * Success: long channum number. + * + * Failure: 0 + */ +uint32_t +cmyth_epginfo_channum(cmyth_epginfo_t e) +{ + if (!e) { + return 0; + } + return e->channum; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/event.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/event.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/event.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/event.c 2014-01-04 10:28:12.000000000 +0000 @@ -35,76 +35,125 @@ cmyth_event_t cmyth_event_get_message(cmyth_conn_t conn, char * data, int32_t len, cmyth_proginfo_t * prog) { - int count, err, consumed, i; + int count, err, consumed; char tmp[1024]; cmyth_event_t event; cmyth_proginfo_t proginfo = NULL; if (conn == NULL) - goto fail; + return CMYTH_EVENT_UNKNOWN; - if ((count=cmyth_rcv_length(conn)) <= 0) { + if ((count = cmyth_rcv_length(conn)) <= 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_length() failed (%d)\n", __FUNCTION__, count); return CMYTH_EVENT_CLOSE; } + data[0] = 0; + consumed = cmyth_rcv_string(conn, &err, tmp, sizeof(tmp) - 1, count); count -= consumed; if (strcmp(tmp, "BACKEND_MESSAGE") != 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_string() failed (%d)\n", __FUNCTION__, count); - goto fail; + event = CMYTH_EVENT_UNKNOWN; + goto out; } consumed = cmyth_rcv_string(conn, &err, tmp, sizeof(tmp) - 1, count); count -= consumed; + + /* + * RECORDING_LIST_CHANGE + */ if (strcmp(tmp, "RECORDING_LIST_CHANGE") == 0) { event = CMYTH_EVENT_RECORDING_LIST_CHANGE; - } else if (strncmp(tmp, "RECORDING_LIST_CHANGE ADD", 25) == 0) { + } + + /* + * RECORDING_LIST_CHANGE ADD + */ + else if (strncmp(tmp, "RECORDING_LIST_CHANGE ADD", 25) == 0) { event = CMYTH_EVENT_RECORDING_LIST_CHANGE_ADD; strncpy(data, tmp + 26, len); - } else if (strcmp(tmp, "RECORDING_LIST_CHANGE UPDATE") == 0) { + } + + /* + * RECORDING_LIST_CHANGE UPDATE + */ + else if (strcmp(tmp, "RECORDING_LIST_CHANGE UPDATE") == 0) { event = CMYTH_EVENT_RECORDING_LIST_CHANGE_UPDATE; - /* receive a proginfo structure - do nothing with it (yet?)*/ proginfo = cmyth_proginfo_create(); if (!proginfo) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_proginfo_create() failed\n", __FUNCTION__); - goto fail; + event = CMYTH_EVENT_UNKNOWN; + goto out; } consumed = cmyth_rcv_proginfo(conn, &err, proginfo, count); count -= consumed; *prog = proginfo; - } else if (strncmp(tmp, "RECORDING_LIST_CHANGE DELETE", 28) == 0) { + } + + /* + * RECORDING_LIST_CHANGE DELETE + */ + else if (strncmp(tmp, "RECORDING_LIST_CHANGE DELETE", 28) == 0) { event = CMYTH_EVENT_RECORDING_LIST_CHANGE_DELETE; strncpy(data, tmp + 29, len); - } else if (strcmp(tmp, "SCHEDULE_CHANGE") == 0) { + } + + /* + * SCHEDULE_CHANGE + */ + else if (strcmp(tmp, "SCHEDULE_CHANGE") == 0) { event = CMYTH_EVENT_SCHEDULE_CHANGE; - } else if (strncmp(tmp, "DONE_RECORDING", 14) == 0) { + } + + /* + * DONE_RECORDING + */ + else if (strncmp(tmp, "DONE_RECORDING", 14) == 0) { event = CMYTH_EVENT_DONE_RECORDING; strncpy(data, tmp + 15, len); - } else if (strncmp(tmp, "QUIT_LIVETV", 11) == 0) { + } + + /* + * QUIT_LIVETV + */ + else if (strncmp(tmp, "QUIT_LIVETV", 11) == 0) { event = CMYTH_EVENT_QUIT_LIVETV; - } else if (strncmp(tmp, "LIVETV_WATCH", 12) == 0) { + } + + /* + * LIVETV_WATCH + */ + else if (strncmp(tmp, "LIVETV_WATCH", 12) == 0) { event = CMYTH_EVENT_LIVETV_WATCH; strncpy(data, tmp + 13, len); - /* Sergio: Added to support the new live tv protocol */ - } else if (strncmp(tmp, "LIVETV_CHAIN UPDATE", 19) == 0) { + } + + /* + * LIVETV_CHAIN UPDATE + */ + else if (strncmp(tmp, "LIVETV_CHAIN UPDATE", 19) == 0) { event = CMYTH_EVENT_LIVETV_CHAIN_UPDATE; strncpy(data, tmp + 20, len); - } else if (strncmp(tmp, "SIGNAL", 6) == 0) { + } + + /* + * SIGNAL + */ + else if (strncmp(tmp, "SIGNAL", 6) == 0) { int32_t dstlen = len; event = CMYTH_EVENT_SIGNAL; - /*Get Recorder ID */ strncat(data, "cardid ", 7); strncat(data, tmp + 7, consumed - 12); strncat(data, ";", 2); - /* get slock, signal, seen_pat, matching_pat */ while (count > 0) { /* get signalmonitorvalue name */ @@ -120,62 +169,85 @@ strncat(data,";",2); dstlen -= consumed; } - } else if (strncmp(tmp, "ASK_RECORDING", 13) == 0) { + } + + /* + * ASK_RECORDING + */ + else if (strncmp(tmp, "ASK_RECORDING", 13) == 0) { event = CMYTH_EVENT_ASK_RECORDING; strncpy(data, tmp + 14, len); - if (cmyth_conn_get_protocol_version(conn) < 37) { - /* receive 4 string - do nothing with them */ - /* title, chanstr, chansign, channame */ - for (i = 0; i < 4; i++) { - consumed = cmyth_rcv_string(conn, &err, tmp, sizeof(tmp) -1, count); - count -= consumed; - } - } else { + if (cmyth_conn_get_protocol_version(conn) >= 37) { proginfo = cmyth_proginfo_create(); if (!proginfo) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_proginfo_create() failed\n", __FUNCTION__); - goto fail; + event = CMYTH_EVENT_UNKNOWN; + goto out; } consumed = cmyth_rcv_proginfo(conn, &err, proginfo, count); count -= consumed; *prog = proginfo; } - } else if (strncmp(tmp, "CLEAR_SETTINGS_CACHE", 20) == 0) { + } + + /* + * CLEAR_SETTINGS_CACHE + */ + else if (strncmp(tmp, "CLEAR_SETTINGS_CACHE", 20) == 0) { event = CMYTH_EVENT_CLEAR_SETTINGS_CACHE; - } else if (strncmp(tmp, "GENERATED_PIXMAP", 16) == 0) { + } + + /* + * GENERATED_PIXMAP + */ + else if (strncmp(tmp, "GENERATED_PIXMAP", 16) == 0) { /* capture the file which a pixmap has been generated for */ event = CMYTH_EVENT_GENERATED_PIXMAP; consumed = cmyth_rcv_string(conn, &err, tmp, sizeof(tmp) - 1, count); + count -= consumed; if (strncmp(tmp, "OK", 2) == 0) { + /* receive */ consumed = cmyth_rcv_string(conn, &err, tmp, sizeof(tmp) - 1, count); + count -= consumed; strncpy(data, tmp, len); - } else { - data[0] = 0; } - } else if (strncmp(tmp, "SYSTEM_EVENT", 12) == 0) { + } + + /* + * SYSTEM_EVENT + */ + else if (strncmp(tmp, "SYSTEM_EVENT", 12) == 0) { event = CMYTH_EVENT_SYSTEM_EVENT; strncpy(data, tmp + 13, len); - } else if (strncmp(tmp, "UPDATE_FILE_SIZE", 16) == 0) { + } + + /* + * UPDATE_FILE_SIZE + */ + else if (strncmp(tmp, "UPDATE_FILE_SIZE", 16) == 0) { event = CMYTH_EVENT_UPDATE_FILE_SIZE; strncpy(data, tmp + 17, len); - } else { - cmyth_dbg(CMYTH_DBG_ERROR, - "%s: unknown mythtv BACKEND_MESSAGE '%s'\n", __FUNCTION__, tmp); + } + + /* + * Unknown message + */ + else { + cmyth_dbg(CMYTH_DBG_INFO, + "%s: unknown BACKEND_MESSAGE '%s'\n", __FUNCTION__, tmp); event = CMYTH_EVENT_UNKNOWN; } - while(count > 0) { - consumed = cmyth_rcv_string(conn, &err, tmp, sizeof(tmp) - 1, count); + out: + while(count > 0 && err == 0) { + consumed = cmyth_rcv_data(conn, &err, (unsigned char*)tmp, sizeof(tmp) - 1, count); + cmyth_dbg(CMYTH_DBG_DEBUG, "%s: leftover data: count %i, read %i, errno %i\n", __FUNCTION__, count, consumed, err); count -= consumed; - cmyth_dbg(CMYTH_DBG_DEBUG, "%s: leftover data %s\n", __FUNCTION__, tmp); } return event; - - fail: - return CMYTH_EVENT_UNKNOWN; } int diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/file.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/file.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/file.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/file.c 2014-01-28 20:43:50.000000000 +0000 @@ -322,7 +322,7 @@ { struct timeval tv; fd_set fds; - int ret; + int32_t ret; if (file == NULL || file->file_data == NULL) return -EINVAL; @@ -418,11 +418,11 @@ "QUERY_FILETRANSFER %"PRIu32"[]:[]REQUEST_BLOCK[]:[]%"PRId32, file->file_id, len); - if ((err = cmyth_send_message(file->file_control, msg)) < 0) { + if ((r = cmyth_send_message(file->file_control, msg)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", - __FUNCTION__, err); - ret = err; + __FUNCTION__, r); + ret = r; goto out; } @@ -508,7 +508,7 @@ ret = 0; while(file->file_pos < file->file_req) { c = file->file_req - file->file_pos; - if(c > sizeof(msg)) + if (c > (int64_t)sizeof(msg)) c = sizeof(msg); if ((ret = cmyth_file_get_block(file, msg, (size_t)c)) < 0) @@ -540,11 +540,11 @@ (int32_t)(file->file_pos & 0xffffffff)); } - if ((err = cmyth_send_message(file->file_control, msg)) < 0) { + if ((r = cmyth_send_message(file->file_control, msg)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", - __FUNCTION__, err); - ret = err; + __FUNCTION__, r); + ret = r; goto out; } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/input.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/input.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/input.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/input.c 2014-01-04 10:28:12.000000000 +0000 @@ -137,7 +137,7 @@ goto out; } - out: +out: pthread_mutex_unlock(&rec->rec_conn->conn_mutex); return inputlist; } @@ -162,9 +162,13 @@ count -= consumed; total += consumed; if (*err) { - failed = "cmyth_rcv_string() inputname"; + failed = "cmyth_rcv_string()"; goto fail; } + if (strncmp(tmp_str, "EMPTY_LIST", 10) == 0) { + ref_release(input); + goto out; + } input->inputname = ref_strdup(tmp_str); consumed = cmyth_rcv_uint32(conn, err, &input->sourceid, count); @@ -213,7 +217,7 @@ (++inputlist->input_count) * sizeof(cmyth_input_t)); inputlist->input_list[inputlist->input_count - 1] = input; } - + out: return total; fail: diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/keyframe.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/keyframe.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/keyframe.c 2013-03-12 10:51:22.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/keyframe.c 2014-01-28 20:43:50.000000000 +0000 @@ -98,3 +98,21 @@ strcat(ret, pos); return ret; } + +uint32_t +cmyth_keyframe_number(cmyth_keyframe_t kf) +{ + if (kf) + return kf->keyframe_number; + else + return 0; +} + +int64_t +cmyth_keyframe_pos(cmyth_keyframe_t kf) +{ + if (kf) + return kf->keyframe_pos; + else + return 0; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/livetv.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/livetv.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/livetv.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/livetv.c 2014-01-04 10:28:12.000000000 +0000 @@ -32,11 +32,7 @@ #include static int cmyth_livetv_chain_has_url(cmyth_recorder_t rec, char * url); -static int cmyth_livetv_chain_add_file(cmyth_recorder_t rec, - char * url, cmyth_file_t fp); -static int cmyth_livetv_chain_add_url(cmyth_recorder_t rec, char * url); -static int cmyth_livetv_chain_add(cmyth_recorder_t rec, char * url, - cmyth_file_t fp, cmyth_proginfo_t prog); +static int cmyth_livetv_chain_add(cmyth_recorder_t rec, char * url, cmyth_file_t file, cmyth_proginfo_t prog); /* @@ -69,19 +65,19 @@ ref_release(ltc->chainid); } if (ltc->chain_urls) { - for(i=0;ichain_ct; i++) + for (i = 0; i < ltc->chain_ct; i++) if (ltc->chain_urls[i]) ref_release(ltc->chain_urls[i]); ref_release(ltc->chain_urls); } if (ltc->chain_files) { - for(i=0;ichain_ct; i++) + for (i = 0; i < ltc->chain_ct; i++) if (ltc->chain_files[i]) ref_release(ltc->chain_files[i]); ref_release(ltc->chain_files); } if (ltc->progs) { - for(i=0;ichain_ct; i++) + for (i = 0; i < ltc->chain_ct; i++) if (ltc->progs[i]) ref_release(ltc->progs[i]); ref_release(ltc->progs); @@ -129,10 +125,6 @@ } /* - Returns the index of the chain entry with the URL or 0 if the - URL isn't there. -*/ -/* * cmyth_livetv_chain_has_url() * * Scope: PRIVATE @@ -149,174 +141,63 @@ * * Failure: -1 if the URL doesn't appear in the chain. */ -int cmyth_livetv_chain_has_url(cmyth_recorder_t rec, char * url) +static int +cmyth_livetv_chain_has_url(cmyth_recorder_t rec, char * url) { int found, i; found = 0; - if(rec->rec_livetv_chain) { - if(rec->rec_livetv_chain->chain_ct > 0) { - for(i=0;irec_livetv_chain->chain_ct; i++) { - if(strcmp(rec->rec_livetv_chain->chain_urls[i],url) == 0) { + if (rec->rec_livetv_chain) { + if (rec->rec_livetv_chain->chain_ct > 0) { + for (i = 0; i < rec->rec_livetv_chain->chain_ct; i++) { + if (strcmp(rec->rec_livetv_chain->chain_urls[i], url) == 0) { found = 1; break; } } } } - return found?i:-1; -} - -#if 0 -static int cmyth_livetv_chain_current(cmyth_recorder_t rec); -int -cmyth_livetv_chain_current(cmyth_recorder_t rec) -{ - return rec->rec_livetv_chain->chain_current; -} - -static cmyth_file_t cmyth_livetv_get_cur_file(cmyth_recorder_t rec); -cmyth_file_t -cmyth_livetv_get_cur_file(cmyth_recorder_t rec) -{ - return rec->rec_livetv_file; -} -#endif - -/* - * cmyth_livetv_chain_add_file() - * - * Scope: PRIVATE - * - * Description - * - * Called to add a file handle to a livetv chain structure. The handle is added - * only if the url is already there. - * - * Return Value: - * - * Success: 0 - * - * Faiure: -1 - */ -static int -cmyth_livetv_chain_add_file(cmyth_recorder_t rec, char * url, cmyth_file_t ft) -{ - - int cur; - int ret = 0; - cmyth_file_t tmp; - - if(rec->rec_livetv_chain) { - if(rec->rec_livetv_chain->chain_ct > 0) { - /* Is this file already in the chain? */ - if((cur = cmyth_livetv_chain_has_url(rec, url)) != -1) { - /* Release the existing handle after holding the new */ - /* this allows them to be the same. */ - tmp = rec->rec_livetv_chain->chain_files[cur]; - rec->rec_livetv_chain->chain_files[cur] = ref_hold(ft); - ref_release(tmp); - } - } - else { - cmyth_dbg(CMYTH_DBG_ERROR, - "%s: attempted to add file for %s to an empty chain\n", - __FUNCTION__, url); - ret = -1; - } - } - else { - cmyth_dbg(CMYTH_DBG_ERROR, - "%s: attempted to add file for %s to an non existant chain\n", - __FUNCTION__, url); - ret = -1; - } - return ret; + return (found ? i : -1); } /* - * cmyth_livetv_chain_add_prog() - * - * Scope: PRIVATE - * - * Description - * - * Called to add program info to a livetv chain structure. The info is added - * only if the url is already there. - * - * Return Value: - * - * Success: 0 - * - * Faiure: -1 - */ -static int -cmyth_livetv_chain_add_prog(cmyth_recorder_t rec, char * url, - cmyth_proginfo_t prog) -{ - - int cur; - int ret = 0; - cmyth_proginfo_t tmp; - - if(rec->rec_livetv_chain) { - if(rec->rec_livetv_chain->chain_ct > 0) { - /* Is this file already in the chain? */ - if((cur = cmyth_livetv_chain_has_url(rec, url)) != -1) { - /* Release the existing handle after holding the new */ - /* this allows them to be the same. */ - tmp = rec->rec_livetv_chain->progs[cur]; - rec->rec_livetv_chain->progs[cur] = ref_hold(prog); - ref_release(tmp); - } - } - else { - cmyth_dbg(CMYTH_DBG_ERROR, - "%s: attempted to add prog for %s to an empty chain\n", - __FUNCTION__, url); - ret = -1; - } - } - else { - cmyth_dbg(CMYTH_DBG_ERROR, - "%s: attempted to add prog for %s to an non existant chain\n", - __FUNCTION__, url); - ret = -1; - } - return ret; -} - -/* - * cmyth_livetv_chain_add_url() + * cmyth_livetv_chain_add() * * Scope: PRIVATE * * Description * - * Called to add a url to a livetv chain structure. The url is added - * only if it is not already there. + * Called to add a url and file pointer to a livetv chain structure. + * The url is added only if it is not already there. The file pointer + * will be held (ref count increased) by this call if successful. * * Return Value: * - * Success: 0 + * Success: The index of the new entry in the chain * - * Faiure: -1 + * Failure: -1 if url alread exists else -errno */ static int -cmyth_livetv_chain_add_url(cmyth_recorder_t rec, char * url) +cmyth_livetv_chain_add(cmyth_recorder_t rec, char * url, cmyth_file_t file, cmyth_proginfo_t prog) { char ** tmp; cmyth_file_t * fp; cmyth_proginfo_t * pi; - int ret = 0; + int ret; - if(cmyth_livetv_chain_has_url(rec,url) == -1) { - if(rec->rec_livetv_chain->chain_ct == 0) { + if (cmyth_livetv_chain_has_url(rec, url) >= 0) { + /* url already exists in the chain */ + ret = -1; + } + else + { + /* Nothing in the chain yet, allocate the space */ + if (rec->rec_livetv_chain->chain_ct == 0) { rec->rec_livetv_chain->chain_ct = 1; - /* Nothing in the chain yet, allocate the space */ tmp = (char**)ref_alloc(sizeof(char *)); fp = (cmyth_file_t *)ref_alloc(sizeof(cmyth_file_t)); pi = (cmyth_proginfo_t *)ref_alloc(sizeof(cmyth_proginfo_t)); } + /* Reallocate space for the new url */ else { rec->rec_livetv_chain->chain_ct++; tmp = (char**)ref_realloc(rec->rec_livetv_chain->chain_urls, @@ -328,22 +209,28 @@ ref_realloc(rec->rec_livetv_chain->progs, sizeof(cmyth_proginfo_t)*rec->rec_livetv_chain->chain_ct); } - if(tmp != NULL && fp != NULL) { - rec->rec_livetv_chain->chain_urls = ref_hold(tmp); - rec->rec_livetv_chain->chain_files = ref_hold(fp); - rec->rec_livetv_chain->progs = ref_hold(pi); - ref_release(tmp); - ref_release(fp); - ref_release(pi); - rec->rec_livetv_chain->chain_urls[rec->rec_livetv_chain->chain_ct-1] - = ref_strdup(url); - rec->rec_livetv_chain->chain_files[rec->rec_livetv_chain->chain_ct-1] - = ref_hold(NULL); - rec->rec_livetv_chain->progs[rec->rec_livetv_chain->chain_ct-1] - = ref_hold(NULL); + if (tmp != NULL && fp != NULL && pi != NULL) { + int pos = rec->rec_livetv_chain->chain_ct - 1; + rec->rec_livetv_chain->chain_urls = tmp; + rec->rec_livetv_chain->chain_files = fp; + rec->rec_livetv_chain->progs = pi; + rec->rec_livetv_chain->chain_urls[pos] = ref_strdup(url); + rec->rec_livetv_chain->chain_files[pos] = ref_hold(file); + rec->rec_livetv_chain->progs[pos] = ref_hold(prog); + /* Url added. Return index of the new entry */ + ret = pos; } else { - ret = -1; + if (tmp) + ref_release(tmp); + + if (fp) + ref_release(fp); + + if (pi) + ref_release(pi); + + ret = -ENOMEM; cmyth_dbg(CMYTH_DBG_ERROR, "%s: memory allocation request failed\n", __FUNCTION__); @@ -354,39 +241,6 @@ } /* - * cmyth_livetv_chain_add() - * - * Scope: PRIVATE - * - * Description - * - * Called to add a url and file pointer to a livetv chain structure. - * The url is added only if it is not already there. The file pointer - * will be held (ref count increased) by this call if successful. - * - * Return Value: - * - * Success: 0 - * - * Faiure: -1 - */ -int -cmyth_livetv_chain_add(cmyth_recorder_t rec, char * url, cmyth_file_t ft, - cmyth_proginfo_t pi) -{ - int ret = 0; - - if(cmyth_livetv_chain_has_url(rec, url) == -1) - ret = cmyth_livetv_chain_add_url(rec, url); - if(ret != -1) - ret = cmyth_livetv_chain_add_file(rec, url, ft); - if(ret != -1) - ret = cmyth_livetv_chain_add_prog(rec, url, pi); - - return ret; -} - -/* * cmyth_livetv_chain_update() * * Scope: PUBLIC @@ -415,14 +269,14 @@ ret = 0; if (!rec) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: rec is NULL\n", __FUNCTION__); - return -1; + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); + return -EINVAL; } if (!rec->rec_livetv_chain) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: rec_livetv_chain is NULL\n", - __FUNCTION__, url); + __FUNCTION__); return -1; } @@ -459,7 +313,7 @@ * add a valid program. */ if (cmyth_file_is_open(ft) > 0) { - if(cmyth_livetv_chain_add(rec, url, ft, loc_prog) == -1) { + if (cmyth_livetv_chain_add(rec, url, ft, loc_prog) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_livetv_chain_add(%s) failed\n", __FUNCTION__, url); @@ -486,8 +340,8 @@ } else { cmyth_dbg(CMYTH_DBG_ERROR, - "%s: chainid doesn't match recorder's chainid!!\n", - __FUNCTION__, url); + "%s: chainid doesn't match recorder's chainid\n", + __FUNCTION__); ret = -1; } @@ -532,8 +386,8 @@ ret = 0; if (!rec) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: rec is NULL\n", __FUNCTION__); - return -1; + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); + return -EINVAL; } /* * Parse msg. Should be %ld %d @@ -590,8 +444,8 @@ ret = 0; if (!rec) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: rec is NULL\n", __FUNCTION__); - return -1; + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); + return -EINVAL; } /* * Parse msg. Should be 'recordid ...' @@ -665,7 +519,7 @@ */ cmyth_recorder_t cmyth_livetv_chain_setup(cmyth_recorder_t rec, uint32_t buflen, int32_t tcp_rcvbuf, - void (*prog_update_callback)(cmyth_proginfo_t)) + void (*prog_update_callback)(cmyth_proginfo_t)) { cmyth_recorder_t new_rec = NULL; @@ -674,8 +528,7 @@ cmyth_file_t ft = NULL; if (!rec) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", - __FUNCTION__); + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); return NULL; } @@ -696,9 +549,10 @@ } ref_release(rec); - if(new_rec->rec_livetv_chain == NULL) { + if (new_rec->rec_livetv_chain == NULL) { cmyth_dbg(CMYTH_DBG_DEBUG, "%s: error no livetv_chain\n", __FUNCTION__); + ref_release(new_rec); new_rec = NULL; goto out; } @@ -711,15 +565,16 @@ new_rec->rec_livetv_chain->prog_update_callback = prog_update_callback; - sprintf(url, "myth://%s:%d%s", loc_prog->proginfo_hostname, rec->rec_port, + sprintf(url, "myth://%s:%d%s", loc_prog->proginfo_hostname, new_rec->rec_port, loc_prog->proginfo_pathname); - if(cmyth_livetv_chain_has_url(new_rec, url) == -1) { + if (cmyth_livetv_chain_has_url(new_rec, url) == -1) { ft = cmyth_conn_connect_file(loc_prog, new_rec->rec_conn, new_rec->rec_livetv_chain->livetv_buflen, new_rec->rec_livetv_chain->livetv_tcp_rcvbuf); if (!ft) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_conn_connect_file(%s) failed\n", __FUNCTION__, url); + ref_release(new_rec); new_rec = NULL; goto out; } @@ -730,11 +585,13 @@ * add a valid program. */ if (cmyth_file_is_open(ft) > 0) { - if(cmyth_livetv_chain_add(new_rec, url, ft, loc_prog) == -1) { + if (cmyth_livetv_chain_add(new_rec, url, ft, loc_prog) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_livetv_chain_add(%s) failed\n", __FUNCTION__, url); + ref_release(new_rec); new_rec = NULL; + goto out; } else { /* now switch to the valid program */ @@ -761,7 +618,7 @@ /* * cmyth_livetv_chain_get_block() * - * Scope: PUBLIC + * Scope: PRIVATE * * Description * @@ -773,28 +630,16 @@ * * Failure: an int containing -errno */ -int32_t +static int32_t cmyth_livetv_chain_get_block(cmyth_recorder_t rec, char *buf, int32_t len) { - if (!rec) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", - __FUNCTION__); - return -EINVAL; - } - - return cmyth_file_get_block(rec->rec_livetv_file, buf, len); + return cmyth_file_get_block(rec->rec_livetv_file, buf, len); } static int cmyth_livetv_chain_select(cmyth_recorder_t rec, struct timeval *timeout) { - if (!rec) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", - __FUNCTION__); - return -EINVAL; - } - - return cmyth_file_select(rec->rec_livetv_file, timeout); + return cmyth_file_select(rec->rec_livetv_file, timeout); } @@ -818,6 +663,12 @@ cmyth_livetv_chain_switch(cmyth_recorder_t rec, int dir) { int ret, i; + cmyth_file_t oldfile = NULL; + + if (!rec) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); + return -EINVAL; + } if (dir == 0) return 1; @@ -859,10 +710,10 @@ } } - if((dir < 0 && rec->rec_livetv_chain->chain_current + dir >= 0) + if ((dir < 0 && rec->rec_livetv_chain->chain_current + dir >= 0) || (rec->rec_livetv_chain->chain_current < rec->rec_livetv_chain->chain_ct - dir)) { - ref_release(rec->rec_livetv_file); + oldfile = rec->rec_livetv_file; ret = rec->rec_livetv_chain->chain_current += dir; rec->rec_livetv_file = ref_hold(rec->rec_livetv_chain->chain_files[ret]); cmyth_dbg(CMYTH_DBG_DEBUG, "%s: file switch to %d\n",__FUNCTION__,ret); @@ -876,7 +727,8 @@ out: pthread_mutex_unlock(&rec->rec_conn->conn_mutex); - + if (oldfile) + ref_release(oldfile); return ret; } @@ -885,11 +737,15 @@ { int dir; - if(rec->rec_conn->conn_version < 26) + if (!rec) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); + return -EINVAL; + } + + if (!rec->rec_livetv_chain) return 1; - dir = rec->rec_livetv_chain->chain_ct - - rec->rec_livetv_chain->chain_current - 1; + dir = rec->rec_livetv_chain->chain_ct - rec->rec_livetv_chain->chain_current - 1; return cmyth_livetv_chain_switch(rec, dir); } @@ -897,7 +753,7 @@ /* * cmyth_livetv_chain_request_block() * - * Scope: PUBLIC + * Scope: PRIVATE * * Description * @@ -913,17 +769,12 @@ static int32_t cmyth_livetv_chain_request_block(cmyth_recorder_t rec, int32_t len) { - int ret, retry; + int32_t ret; + int retry; cmyth_dbg(CMYTH_DBG_DEBUG, "%s [%s:%d]: (trace) {\n", __FUNCTION__, __FILE__, __LINE__); - if (!rec) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", - __FUNCTION__); - return -EINVAL; - } - do { retry = 0; ret = cmyth_file_request_block(rec->rec_livetv_file, len); @@ -932,7 +783,7 @@ retry = cmyth_livetv_chain_switch(rec, 1); } } - while (retry); + while (retry > 0); cmyth_dbg(CMYTH_DBG_DEBUG, "%s [%s:%d]: (trace) }\n", __FUNCTION__, __FILE__, __LINE__); @@ -940,24 +791,43 @@ return ret; } -int32_t cmyth_livetv_chain_read(cmyth_recorder_t rec, char *buf, int32_t len) +/* + * cmyth_livetv_chain_read() + * + * Scope: PRIVATE + * + * Description + * + * Request and read a block of data from backend + * + * Return Value: + * + * Sucess: number of bytes transfered + * + * Failure: an int containing -errno + */ +static int32_t +cmyth_livetv_chain_read(cmyth_recorder_t rec, char *buf, int32_t len) { int ret, retry; int32_t vlen, rlen, nlen; + cmyth_livetv_chain_t chain; + cmyth_file_t file; - if (rec == NULL) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", - __FUNCTION__); - return -EINVAL; - } + if (!rec || !rec->rec_livetv_chain || !rec->rec_livetv_file) + return (int32_t) -EINVAL; + + chain = ref_hold(rec->rec_livetv_chain); + file = ref_hold(rec->rec_livetv_file); + ref_hold(rec); /* - * Set the requested block size to the recommended value. It was - * estimated the previous time. + * Set the requested block size to the recommended value. + * It was estimated the previous time. * = 0 : No limit. Use the input value (len) * > 0 : limit is capped at this value */ - vlen = rec->rec_livetv_chain->livetv_block_len; + vlen = chain->livetv_block_len; do { if (vlen == 0 || vlen > len) { @@ -968,7 +838,7 @@ } retry = 0; - ret = cmyth_file_read(rec->rec_livetv_file, buf, rlen); + ret = cmyth_file_read(file, buf, rlen); if (ret < 0) { break; } @@ -977,16 +847,18 @@ /* eof, switch to next file */ retry = cmyth_livetv_chain_switch(rec, 1); if (retry == 1) { + ref_release(file); + file = ref_hold(rec->rec_livetv_file); /* Already requested ? seek to 0 */ - cmyth_file_seek(rec->rec_livetv_file, 0, WHENCE_SET); + cmyth_file_seek(file, 0, WHENCE_SET); /* Chain switch done. Retry without limit */ vlen = 0; } - else if (rec->rec_livetv_chain->livetv_watch == 0) { + else if (retry == 0 && chain->livetv_watch == 0) { /* * Current buffer is empty on the last file. * We are waiting some time refilling buffer - * Timeout is 0.5 seconde before release. + * Timeout is 250 ms before release. */ cmyth_dbg(CMYTH_DBG_ERROR, "%s: wait some 250ms before request block\n", @@ -1007,11 +879,14 @@ vlen = 0; } - } while(retry); + } while (retry > 0); /* Store the recommended value of block size for next time */ - rec->rec_livetv_chain->livetv_block_len = vlen; + chain->livetv_block_len = vlen; + ref_release(rec); + ref_release(file); + ref_release(chain); return ret; } @@ -1030,23 +905,34 @@ * * Failure: an int containing -errno */ - int64_t cmyth_livetv_chain_duration(cmyth_recorder_t rec) { - int cur, ct; - int64_t ret=0; - ct = rec->rec_livetv_chain->chain_ct; - for (cur = 0; cur < ct; cur++) { - ret += rec->rec_livetv_chain->chain_files[cur]->file_length; - } - return ret; + int cur, ct; + int64_t ret = 0; + cmyth_livetv_chain_t chain; + + if (!rec) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); + return (int64_t) -EINVAL; + } + if (!rec->rec_livetv_chain) + return 0; + chain = ref_hold(rec->rec_livetv_chain); + + ct = chain->chain_ct; + for (cur = 0; cur < ct; cur++) { + ret += chain->chain_files[cur]->file_length; + } + + ref_release(chain); + return ret; } /* * cmyth_livetv_chain_seek() * - * Scope: PUBLIC + * Scope: PRIVATE * * Description * @@ -1068,30 +954,36 @@ cmyth_livetv_chain_seek(cmyth_recorder_t rec, int64_t offset, int8_t whence) { int64_t ret; - cmyth_file_t fp; + cmyth_file_t file, fp; + cmyth_livetv_chain_t chain; int cur, ct; - if (rec == NULL) - return -EINVAL; - + ret = (int64_t) -1; fp = NULL; cur = -1; - ct = rec->rec_livetv_chain->chain_ct; + + if (!rec || !rec->rec_livetv_chain || !rec->rec_livetv_file) + return (int64_t) -EINVAL; + chain = ref_hold(rec->rec_livetv_chain); + file = ref_hold(rec->rec_livetv_file); + ref_hold(rec); + + ct = chain->chain_ct; if (whence == WHENCE_END) { - offset = - rec->rec_livetv_file->file_req - offset; - for (cur = rec->rec_livetv_chain->chain_current; cur < ct; cur++) { - offset += rec->rec_livetv_chain->chain_files[cur]->file_length; + offset = - file->file_req - offset; + for (cur = chain->chain_current; cur < ct; cur++) { + offset += chain->chain_files[cur]->file_length; } - cur = rec->rec_livetv_chain->chain_current; - fp = rec->rec_livetv_chain->chain_files[cur]; + cur = chain->chain_current; + fp = chain->chain_files[cur]; whence = WHENCE_CUR; } if (whence == WHENCE_SET) { for (cur = 0; cur < ct; cur++) { - fp = rec->rec_livetv_chain->chain_files[cur]; + fp = chain->chain_files[cur]; if (offset < fp->file_length) break; offset -= fp->file_length; @@ -1101,15 +993,16 @@ if (whence == WHENCE_CUR) { if (offset == 0) { - cur = rec->rec_livetv_chain->chain_current; - offset += rec->rec_livetv_chain->chain_files[cur]->file_req; + cur = chain->chain_current; + offset += chain->chain_files[cur]->file_req; for (; cur > 0; cur--) { - offset += rec->rec_livetv_chain->chain_files[cur-1]->file_length; + offset += chain->chain_files[cur-1]->file_length; } - return offset; + ret = offset; + goto out; } else { - cur = rec->rec_livetv_chain->chain_current; - fp = rec->rec_livetv_chain->chain_files[cur]; + cur = chain->chain_current; + fp = chain->chain_files[cur]; } offset += fp->file_req; @@ -1117,40 +1010,48 @@ while (offset > fp->file_length) { cur++; offset -= fp->file_length; - if(cur == ct) - return -1; - fp = rec->rec_livetv_chain->chain_files[cur]; + if (cur == ct) { + ret = -1; + goto out; + } + fp = chain->chain_files[cur]; } while (offset < 0) { cur--; - if(cur < 0) - return -1; - fp = rec->rec_livetv_chain->chain_files[cur]; + if (cur < 0) { + ret = -1; + goto out; + } + fp = chain->chain_files[cur]; offset += fp->file_length; } whence = WHENCE_SET; } - if (cur >=0 && cur < rec->rec_livetv_chain->chain_ct && fp) + if (cur >= 0 && cur < chain->chain_ct && fp) { if ((ret = cmyth_file_seek(fp, offset, whence)) >= 0) { - cur -= rec->rec_livetv_chain->chain_current; + cur -= chain->chain_current; if (cmyth_livetv_chain_switch(rec, cur) == 1) { /* * Return the new position in the chain */ - for (cur = 0; cur < rec->rec_livetv_chain->chain_current; cur++) { - fp = rec->rec_livetv_chain->chain_files[cur]; + for (cur = 0; cur < chain->chain_current; cur++) { + fp = chain->chain_files[cur]; ret += fp->file_length; } - return ret; } } } - return -1; + out: + + ref_release(rec); + ref_release(chain); + ref_release(file); + return ret; } /* @@ -1168,13 +1069,22 @@ * * Failure: an int containing -errno */ -int32_t cmyth_livetv_read(cmyth_recorder_t rec, char *buf, int32_t len) +int32_t +cmyth_livetv_read(cmyth_recorder_t rec, char *buf, int32_t len) { - if(rec->rec_conn->conn_version >= 26) - return cmyth_livetv_chain_read(rec, buf, len); + int32_t rtrn; + + if (!rec) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); + return (int32_t) -EINVAL; + } + + if (rec->rec_conn->conn_version >= 26) + rtrn = cmyth_livetv_chain_read(rec, buf, len); else - return cmyth_ringbuf_read(rec, buf, len); + rtrn = cmyth_ringbuf_read(rec, buf, len); + return rtrn; } /* @@ -1204,7 +1114,12 @@ { int64_t rtrn; - if(rec->rec_conn->conn_version >= 26) + if (!rec) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); + return (int64_t) -EINVAL; + } + + if (rec->rec_conn->conn_version >= 26) rtrn = cmyth_livetv_chain_seek(rec, offset, whence); else rtrn = cmyth_ringbuf_seek(rec, offset, whence); @@ -1234,7 +1149,12 @@ { int32_t rtrn; - if(rec->rec_conn->conn_version >= 26) + if (!rec) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); + return (int32_t) -EINVAL; + } + + if (rec->rec_conn->conn_version >= 26) rtrn = cmyth_livetv_chain_request_block(rec, len); else rtrn = cmyth_ringbuf_request_block(rec, len); @@ -1247,7 +1167,12 @@ { int rtrn; - if(rec->rec_conn->conn_version >= 26) + if (!rec) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); + return -EINVAL; + } + + if (rec->rec_conn->conn_version >= 26) rtrn = cmyth_livetv_chain_select(rec, timeout); else rtrn = cmyth_ringbuf_select(rec, timeout); @@ -1268,14 +1193,19 @@ * * Sucess: number of bytes read into buf * - * Failure: -1 + * Failure: an int containing -errno */ int32_t cmyth_livetv_get_block(cmyth_recorder_t rec, char *buf, int32_t len) { int rtrn; - if(rec->rec_conn->conn_version >= 26) + if (!rec) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); + return (int32_t) -EINVAL; + } + + if (rec->rec_conn->conn_version >= 26) rtrn = cmyth_livetv_chain_get_block(rec, buf, len); else rtrn = cmyth_ringbuf_get_block(rec, buf, len); @@ -1291,14 +1221,18 @@ cmyth_recorder_t rtrn = NULL; int i; - if(rec->rec_conn->conn_version >= 26) { + if (!rec) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); + return NULL; + } + + if (rec->rec_conn->conn_version >= 26) { if (cmyth_recorder_spawn_chain_livetv(rec, channame) != 0) { *err = "Spawn livetv failed."; goto err; } - - for(i=0; i<20; i++) { - if(cmyth_recorder_is_recording(rec) != 1) + for (i = 0; i < 20; i++) { + if (cmyth_recorder_is_recording(rec) != 1) sleep(1); else break; @@ -1327,7 +1261,7 @@ } } - if(rtrn->rec_conn->conn_version < 34 && channame) { + if (rtrn->rec_conn->conn_version < 34 && channame) { if (cmyth_recorder_pause(rtrn) != 0) { *err = "Failed to pause recorder to change channel"; goto err; @@ -1343,3 +1277,74 @@ return rtrn; } + +int32_t +cmyth_livetv_chain_last(cmyth_recorder_t rec) +{ + if (!rec) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", + __FUNCTION__); + return (int32_t) -EINVAL; + } + if (!rec->rec_livetv_chain) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no chain\n", + __FUNCTION__); + return (int32_t) -EINVAL; + } + + return rec->rec_livetv_chain->chain_ct - 1; +} + +cmyth_proginfo_t +cmyth_livetv_chain_prog(cmyth_recorder_t rec, int32_t index) +{ + cmyth_proginfo_t prog; + cmyth_livetv_chain_t chain; + + if (!rec) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", + __FUNCTION__); + return NULL; + } + if (!rec->rec_livetv_chain) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no chain\n", + __FUNCTION__); + return NULL; + } + chain = ref_hold(rec->rec_livetv_chain); + if (index >= 0 && index < chain->chain_ct) { + prog = ref_hold(chain->progs[index]); + } + else + prog = NULL; + + ref_release(chain); + return prog; +} + +cmyth_file_t +cmyth_livetv_chain_file(cmyth_recorder_t rec, int32_t index) +{ + cmyth_file_t file; + cmyth_livetv_chain_t chain; + + if (!rec) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", + __FUNCTION__); + return NULL; + } + if (!rec->rec_livetv_chain) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no chain\n", + __FUNCTION__); + return NULL; + } + chain = ref_hold(rec->rec_livetv_chain); + if (index >= 0 && index < chain->chain_ct) { + file = ref_hold(chain->chain_files[index]); + } + else + file = NULL; + + ref_release(chain); + return file; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/Makefile.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/Makefile.am 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/Makefile.am 2014-01-04 10:28:12.000000000 +0000 @@ -23,9 +23,10 @@ utf8tolatin1.c \ recordingrule.c \ channel.c \ - storagegroup.c + storagegroup.c \ + epginfo.c -INCLUDES=-I$(srcdir)/../include/ $(MYSQL_INCLUDES) +INCLUDES=-I../include/ $(MYSQL_INCLUDES) $(LIB): libcmyth.la cp -f .libs/libcmyth.a . diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/mythtv_mysql.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/mythtv_mysql.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/mythtv_mysql.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/mythtv_mysql.c 2014-01-28 20:43:50.000000000 +0000 @@ -50,6 +50,15 @@ { cmyth_dbg(CMYTH_DBG_DEBUG, "%s\n", __FUNCTION__); cmyth_database_close(db); + + if (db->db_host) + ref_release(db->db_host); + if (db->db_user) + ref_release(db->db_user); + if (db->db_pass) + ref_release(db->db_pass); + if (db->db_name) + ref_release(db->db_name); } cmyth_database_t @@ -209,8 +218,6 @@ if (mysql_stat(db->mysql) == NULL) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: mysql_stat() failed: %s\n", __FUNCTION__, mysql_error(db->mysql)); cmyth_database_close(db); - mysql_close(db->mysql); - db->mysql = NULL; } } if (db->mysql == NULL) { @@ -222,8 +229,6 @@ if (NULL == mysql_real_connect(db->mysql, db->db_host, db->db_user, db->db_pass, db->db_name, db->db_port, NULL, CLIENT_FOUND_ROWS)) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: mysql_connect() failed: %s\n", __FUNCTION__, mysql_error(db->mysql)); cmyth_database_close(db); - mysql_close(db->mysql); - db->mysql = NULL; return -1; } } @@ -285,7 +290,7 @@ int cmyth_mysql_set_watched_status(cmyth_database_t db, cmyth_proginfo_t prog, int watchedStat) { - MYSQL_RES *res = NULL; + int ret; MYSQL* sql = cmyth_db_get_connection(db); const char *query_str = "UPDATE recorded SET watched = ? WHERE chanid = ? AND starttime = ?"; cmyth_mysql_query_t *query; @@ -306,25 +311,32 @@ ref_release(query); return -1; } - if (cmyth_mysql_query(query) != 0) { + + ret = cmyth_mysql_query(query); + + ref_release(query); + + if (ret < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s, finalisation/execution of query failed!\n", __FUNCTION__); - ref_release(query); - return -1; + return ret; } - mysql_free_result(res); - ref_release(query); + return (int)mysql_affected_rows(sql); } int -cmyth_mysql_get_prev_recorded(cmyth_database_t db, cmyth_program_t **prog) +cmyth_mysql_get_prev_recorded(cmyth_database_t db, cmyth_epginfolist_t *epglist) { MYSQL_RES *res = NULL; MYSQL_ROW row; - int n = 0; int rows = 0; - const char *query_str = "SELECT oldrecorded.chanid, UNIX_TIMESTAMP(CONVERT_TZ(starttime, ?, 'SYSTEM')), UNIX_TIMESTAMP(CONVERT_TZ(endtime, ?, 'SYSTEM')), title, subtitle, description, category, seriesid, programid, channel.channum, channel.callsign, channel.name, findid, rectype, recstatus, recordid, duplicate FROM oldrecorded LEFT JOIN channel ON oldrecorded.chanid = channel.chanid ORDER BY starttime ASC"; + const char *query_str = "SELECT oldrecorded.chanid, UNIX_TIMESTAMP(CONVERT_TZ(oldrecorded.starttime, ?, 'SYSTEM')), " + "UNIX_TIMESTAMP(CONVERT_TZ(oldrecorded.endtime, ?, 'SYSTEM')), oldrecorded.title, oldrecorded.description, " + "oldrecorded.subtitle, oldrecorded.programid, oldrecorded.seriesid, oldrecorded.category, " + "channel.channum, channel.callsign, channel.name " + "FROM oldrecorded LEFT JOIN channel ON oldrecorded.chanid=channel.chanid ORDER BY oldrecorded.starttime ASC"; cmyth_mysql_query_t *query; + cmyth_epginfo_t epg; if (cmyth_database_check_version(db) < 0) return -1; @@ -335,7 +347,6 @@ || cmyth_mysql_query_param_str(query, db->db_tz_name) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s, binding of query parameters failed! Maybe we're out of memory?\n", __FUNCTION__); ref_release(query); - ref_release(prog); return -1; } res = cmyth_mysql_query_result(query); @@ -345,24 +356,36 @@ return -1; } + *epglist = cmyth_epginfolist_create(); + (*epglist)->epginfolist_count = (int)mysql_num_rows(res); + (*epglist)->epginfolist_list = malloc((*epglist)->epginfolist_count * sizeof(cmyth_epginfo_t)); + if (!(*epglist)->epginfolist_list) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: malloc() failed for list\n", + __FUNCTION__); + ref_release(*epglist); + mysql_free_result(res); + return -ENOMEM; + } + memset((*epglist)->epginfolist_list, 0, (*epglist)->epginfolist_count * sizeof(cmyth_epginfo_t)); + while ((row = mysql_fetch_row(res))) { - if (rows >= n) { - n += 10; - *prog = realloc(*prog, sizeof(**prog) * (n)); - } - (*prog)[rows].chanid = safe_atol(row[0]); - (*prog)[rows].starttime = (time_t)safe_atol(row[1]); - (*prog)[rows].endtime = (time_t)safe_atol(row[2]); - sizeof_strncpy((*prog)[rows].title, row[3]); - sizeof_strncpy((*prog)[rows].subtitle, row[4]); - sizeof_strncpy((*prog)[rows].description, row[5]); - sizeof_strncpy((*prog)[rows].category, row[6]); - sizeof_strncpy((*prog)[rows].seriesid, row[7]); - sizeof_strncpy((*prog)[rows].programid, row[8]); - (*prog)[rows].channum = safe_atol(row[9]); - sizeof_strncpy((*prog)[rows].callsign, row[10]); - sizeof_strncpy((*prog)[rows].name, row[11]); - (*prog)[rows].rec_status = safe_atoi(row[14]); + epg = cmyth_epginfo_create(); + epg->chanid = safe_atol(row[0]); + epg->starttime = safe_atol(row[1]); + epg->endtime = safe_atol(row[2]); + epg->title = ref_strdup(row[3]); + epg->description = ref_strdup(row[4]); + epg->subtitle = ref_strdup(row[5]); + epg->programid = ref_strdup(row[6]); + epg->seriesid = ref_strdup(row[7]); + epg->category = ref_strdup(row[8]); + epg->category_type = ref_strdup(""); + epg->channum = safe_atol(row[9]); + epg->callsign = ref_strdup(row[10]); + epg->channame = ref_strdup(row[11]); + epg->sourceid = 0; + (*epglist)->epginfolist_list[rows] = epg; + cmyth_dbg(CMYTH_DBG_DEBUG, "%s: [%d] chanid = %"PRIu32" title = %s\n", __FUNCTION__, rows, epg->chanid, epg->title); rows++; } mysql_free_result(res); @@ -371,19 +394,23 @@ } int -cmyth_mysql_get_guide(cmyth_database_t db, cmyth_program_t **prog, uint32_t chanid, time_t starttime, time_t endtime) +cmyth_mysql_get_guide(cmyth_database_t db, cmyth_epginfolist_t *epglist, uint32_t chanid, time_t starttime, time_t endtime) { MYSQL_RES *res = NULL; MYSQL_ROW row; - const char *query_str = "SELECT program.chanid, UNIX_TIMESTAMP(CONVERT_TZ(program.starttime, ?, 'SYSTEM')), UNIX_TIMESTAMP(CONVERT_TZ(program.endtime, ?, 'SYSTEM')), " - "program.title, program.description, program.subtitle, program.programid, program.seriesid, program.category, program.category_type, " - "channel.channum, channel.callsign, channel.name, channel.sourceid " - "FROM program INNER JOIN channel ON program.chanid=channel.chanid " - "WHERE channel.chanid = ? AND ((program.endtime > ? AND program.endtime < ?) OR (program.starttime >= ? AND program.starttime <= ?) OR (program.starttime <= ? AND program.endtime >= ?)) " - "ORDER BY (channel.channum + 0), program.starttime ASC"; + const char *query_str = "SELECT program.chanid, UNIX_TIMESTAMP(CONVERT_TZ(program.starttime,?,'SYSTEM')), " + "UNIX_TIMESTAMP(CONVERT_TZ(program.endtime,?,'SYSTEM')), program.title, program.description, " + "program.subtitle, program.programid, program.seriesid, program.category, program.category_type, " + "channel.channum, channel.callsign, channel.name, channel.sourceid " + "FROM program LEFT JOIN channel on program.chanid=channel.chanid " + "WHERE channel.chanid = ? AND ((program.endtime > ? AND program.endtime < ?) OR " + "(program.starttime >= ? AND program.starttime <= ?) OR " + "(program.starttime <= ? AND program.endtime >= ?)) " + "AND program.manualid = 0 " + "ORDER BY (channel.channum + 0), program.starttime ASC"; int rows = 0; - int n = 0; cmyth_mysql_query_t *query; + cmyth_epginfo_t epg; if (cmyth_database_check_version(db) < 0) return -1; @@ -410,26 +437,36 @@ return -1; } + *epglist = cmyth_epginfolist_create(); + (*epglist)->epginfolist_count = (int)mysql_num_rows(res); + (*epglist)->epginfolist_list = malloc((*epglist)->epginfolist_count * sizeof(cmyth_epginfo_t)); + if (!(*epglist)->epginfolist_list) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: malloc() failed for list\n", + __FUNCTION__); + ref_release(*epglist); + mysql_free_result(res); + return -ENOMEM; + } + memset((*epglist)->epginfolist_list, 0, (*epglist)->epginfolist_count * sizeof(cmyth_epginfo_t)); + while ((row = mysql_fetch_row(res))) { - if (rows >= n) { - n += 10; - *prog = ref_realloc(*prog, sizeof(**prog) * (n)); - } - (*prog)[rows].chanid = safe_atol(row[0]); - (*prog)[rows].starttime = (time_t)safe_atol(row[1]); - (*prog)[rows].endtime = (time_t)safe_atol(row[2]); - sizeof_strncpy((*prog)[rows].title, row[3]); - sizeof_strncpy((*prog)[rows].description, row[4]); - sizeof_strncpy((*prog)[rows].subtitle, row[5]); - sizeof_strncpy((*prog)[rows].programid, row[6]); - sizeof_strncpy((*prog)[rows].seriesid, row[7]); - sizeof_strncpy((*prog)[rows].category, row[8]); - sizeof_strncpy((*prog)[rows].category_type, row[9]); - (*prog)[rows].channum = safe_atol(row[10]); - sizeof_strncpy((*prog)[rows].callsign, row[11]); - sizeof_strncpy((*prog)[rows].name, row[12]); - (*prog)[rows].sourceid = safe_atol(row[13]); - (*prog)[rows].rec_status = 0; + epg = cmyth_epginfo_create(); + epg->chanid = safe_atol(row[0]); + epg->starttime = safe_atol(row[1]); + epg->endtime = safe_atol(row[2]); + epg->title = ref_strdup(row[3]); + epg->description = ref_strdup(row[4]); + epg->subtitle = ref_strdup(row[5]); + epg->programid = ref_strdup(row[6]); + epg->seriesid = ref_strdup(row[7]); + epg->category = ref_strdup(row[8]); + epg->category_type = ref_strdup(row[9]); + epg->channum = safe_atol(row[10]); + epg->callsign = ref_strdup(row[11]); + epg->channame = ref_strdup(row[12]); + epg->sourceid = safe_atol(row[13]); + (*epglist)->epginfolist_list[rows] = epg; + cmyth_dbg(CMYTH_DBG_DEBUG, "%s: [%d] chanid = %"PRIu32" starttime = %lu title = %s\n", __FUNCTION__, rows, epg->chanid, epg->starttime, epg->title); rows++; } mysql_free_result(res); @@ -474,21 +511,28 @@ } int -cmyth_mysql_get_prog_finder_char_title(cmyth_database_t db, cmyth_program_t **prog, time_t starttime, char *program_name) +cmyth_mysql_get_prog_finder_char_title(cmyth_database_t db, cmyth_epginfolist_t *epglist, time_t starttime, char *program_name) { MYSQL_RES *res = NULL; MYSQL_ROW row; char *N_title; char *query_str; int rows = 0; - int n = 0; cmyth_mysql_query_t *query; + cmyth_epginfo_t epg; if (cmyth_database_check_version(db) < 0) return -1; if (strncmp(program_name, "@", 1) == 0) { - query_str = "SELECT DISTINCT title FROM program WHERE ( title NOT REGEXP '^[A-Z0-9]' AND title NOT REGEXP '^The [A-Z0-9]' AND title NOT REGEXP '^A [A-Z0-9]' AND starttime >= ?) ORDER BY title"; + query_str = "SELECT program.chanid, UNIX_TIMESTAMP(CONVERT_TZ(program.starttime,?,'SYSTEM')), " + "UNIX_TIMESTAMP(CONVERT_TZ(program.endtime,?,'SYSTEM')), program.title, program.description, " + "program.subtitle, program.programid, program.seriesid, program.category, program.category_type, " + "channel.channum, channel.callsign, channel.name, channel.sourceid " + "FROM program LEFT JOIN channel on program.chanid=channel.chanid " + "WHERE ( program.title NOT REGEXP '^[A-Z0-9]' AND program.title NOT REGEXP '^The [A-Z0-9]' " + "AND program.title NOT REGEXP '^A [A-Z0-9]' AND program.starttime >= ?) AND program.manualid = 0 " + "ORDER BY program.title ASC"; query = cmyth_mysql_query_create(db, query_str); if (cmyth_mysql_query_param_unixtime(query, starttime, db->db_tz_utc) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s, binding of query parameters failed! Maybe we're out of memory?\n", __FUNCTION__); @@ -496,7 +540,12 @@ return -1; } } else { - query_str = "SELECT DISTINCT title FROM program where starttime >= ? and title like ? ORDER BY title ASC"; + query_str = "SELECT program.chanid, UNIX_TIMESTAMP(CONVERT_TZ(program.starttime,?,'SYSTEM')), " + "UNIX_TIMESTAMP(CONVERT_TZ(program.endtime,?,'SYSTEM')), program.title, program.description, " + "program.subtitle, program.programid, program.seriesid, program.category, program.category_type, " + "channel.channum, channel.callsign, channel.name, channel.sourceid " + "FROM program LEFT JOIN channel on program.chanid=channel.chanid " + "WHERE program.starttime >= ? and program.title like ? ORDER BY program.title ASC"; query = cmyth_mysql_query_create(db, query_str); N_title = ref_alloc(strlen(program_name) * 2 + 3); sprintf(N_title, "%%%s%%", program_name); @@ -517,13 +566,36 @@ return -1; } + *epglist = cmyth_epginfolist_create(); + (*epglist)->epginfolist_count = (int)mysql_num_rows(res); + (*epglist)->epginfolist_list = malloc((*epglist)->epginfolist_count * sizeof(cmyth_epginfo_t)); + if (!(*epglist)->epginfolist_list) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: malloc() failed for list\n", + __FUNCTION__); + ref_release(*epglist); + mysql_free_result(res); + return -ENOMEM; + } + memset((*epglist)->epginfolist_list, 0, (*epglist)->epginfolist_count * sizeof(cmyth_epginfo_t)); + while ((row = mysql_fetch_row(res))) { - if (rows == n) { - n++; - *prog = realloc(*prog, sizeof(**prog) * (n)); - } - sizeof_strncpy((*prog)[rows].title, row[0]); - cmyth_dbg(CMYTH_DBG_DEBUG, "prog[%d].title = %s\n", rows, (*prog)[rows].title); + epg = cmyth_epginfo_create(); + epg->chanid = safe_atol(row[0]); + epg->starttime = safe_atol(row[1]); + epg->endtime = safe_atol(row[2]); + epg->title = ref_strdup(row[3]); + epg->description = ref_strdup(row[4]); + epg->subtitle = ref_strdup(row[5]); + epg->programid = ref_strdup(row[6]); + epg->seriesid = ref_strdup(row[7]); + epg->category = ref_strdup(row[8]); + epg->category_type = ref_strdup(row[9]); + epg->channum = safe_atol(row[10]); + epg->callsign = ref_strdup(row[11]); + epg->channame = ref_strdup(row[12]); + epg->sourceid = safe_atol(row[13]); + (*epglist)->epginfolist_list[rows] = epg; + cmyth_dbg(CMYTH_DBG_DEBUG, "%s: [%d] chanid = %"PRIu32" title = %s\n", __FUNCTION__, rows, epg->chanid, epg->title); rows++; } mysql_free_result(res); @@ -532,14 +604,20 @@ } int -cmyth_mysql_get_prog_finder_time(cmyth_database_t db, cmyth_program_t **prog, time_t starttime, char *program_name) +cmyth_mysql_get_prog_finder_time(cmyth_database_t db, cmyth_epginfolist_t *epglist, time_t starttime, char *program_name) { MYSQL_RES *res = NULL; MYSQL_ROW row; - const char *query_str = "SELECT program.chanid, UNIX_TIMESTAMP(CONVERT_TZ(program.starttime,?,'SYSTEM')), UNIX_TIMESTAMP(CONVERT_TZ(program.endtime,?,'SYSTEM')), program.title, program.description, program.subtitle, program.programid, program.seriesid, program.category, program.category_type, channel.channum, channel.callsign, channel.name, channel.sourceid FROM program LEFT JOIN channel on program.chanid=channel.chanid WHERE starttime >= ? and title = ? ORDER BY starttime ASC"; + const char *query_str = "SELECT program.chanid, UNIX_TIMESTAMP(CONVERT_TZ(program.starttime,?,'SYSTEM')), " + "UNIX_TIMESTAMP(CONVERT_TZ(program.endtime,?,'SYSTEM')), program.title, program.description, " + "program.subtitle, program.programid, program.seriesid, program.category, program.category_type, " + "channel.channum, channel.callsign, channel.name, channel.sourceid " + "FROM program LEFT JOIN channel on program.chanid=channel.chanid " + "WHERE program.starttime >= ? and program.title = ? and program.manualid = 0 " + "ORDER BY program.starttime ASC"; int rows = 0; - int n = 0; cmyth_mysql_query_t *query; + cmyth_epginfo_t epg; if (cmyth_database_check_version(db) < 0) return -1; @@ -561,27 +639,36 @@ return -1; } + *epglist = cmyth_epginfolist_create(); + (*epglist)->epginfolist_count = (int)mysql_num_rows(res); + (*epglist)->epginfolist_list = malloc((*epglist)->epginfolist_count * sizeof(cmyth_epginfo_t)); + if (!(*epglist)->epginfolist_list) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: malloc() failed for list\n", + __FUNCTION__); + ref_release(*epglist); + mysql_free_result(res); + return -ENOMEM; + } + memset((*epglist)->epginfolist_list, 0, (*epglist)->epginfolist_count * sizeof(cmyth_epginfo_t)); + while ((row = mysql_fetch_row(res))) { - if (rows == n) { - n++; - *prog = realloc(*prog, sizeof(**prog) * (n)); - } - (*prog)[rows].chanid = atol(row[0]); - (*prog)[rows].starttime = atol(row[1]); - (*prog)[rows].endtime = atol(row[2]); - sizeof_strncpy((*prog)[rows].title, row[3]); - sizeof_strncpy((*prog)[rows].description, row[4]); - sizeof_strncpy((*prog)[rows].subtitle, row[5]); - sizeof_strncpy((*prog)[rows].programid, row[6]); - sizeof_strncpy((*prog)[rows].seriesid, row[7]); - sizeof_strncpy((*prog)[rows].category, row[8]); - sizeof_strncpy((*prog)[rows].category_type, row[9]); - (*prog)[rows].channum = atol(row[10]); - sizeof_strncpy((*prog)[rows].callsign, row[11]); - sizeof_strncpy((*prog)[rows].name, row[12]); - (*prog)[rows].sourceid = atol(row[13]); - cmyth_dbg(CMYTH_DBG_DEBUG, "prog[%d].chanid = %ld\n", rows, (*prog)[rows].chanid); - cmyth_dbg(CMYTH_DBG_DEBUG, "prog[%d].title = %s\n", rows, (*prog)[rows].title); + epg = cmyth_epginfo_create(); + epg->chanid = safe_atol(row[0]); + epg->starttime = safe_atol(row[1]); + epg->endtime = safe_atol(row[2]); + epg->title = ref_strdup(row[3]); + epg->description = ref_strdup(row[4]); + epg->subtitle = ref_strdup(row[5]); + epg->programid = ref_strdup(row[6]); + epg->seriesid = ref_strdup(row[7]); + epg->category = ref_strdup(row[8]); + epg->category_type = ref_strdup(row[9]); + epg->channum = safe_atol(row[10]); + epg->callsign = ref_strdup(row[11]); + epg->channame = ref_strdup(row[12]); + epg->sourceid = safe_atol(row[13]); + (*epglist)->epginfolist_list[rows] = epg; + cmyth_dbg(CMYTH_DBG_DEBUG, "%s: [%d] chanid = %"PRIu32" title = %s\n", __FUNCTION__, rows, epg->chanid, epg->title); rows++; } mysql_free_result(res); @@ -592,7 +679,7 @@ int cmyth_mysql_update_bookmark_setting(cmyth_database_t db, cmyth_proginfo_t prog) { - MYSQL_RES *res = NULL; + int ret; MYSQL* sql = cmyth_db_get_connection(db); const char *query_str = "UPDATE recorded SET bookmark = 1 WHERE chanid = ? AND starttime = ?"; cmyth_mysql_query_t * query; @@ -609,13 +696,16 @@ ref_release(query); return -1; } - res = cmyth_mysql_query_result(query); + + ret = cmyth_mysql_query(query); + ref_release(query); - if (res == NULL) { + + if (ret < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s, finalisation/execution of query failed!\n", __FUNCTION__); - return -1; + return ret; } - mysql_free_result(res); + return (int)mysql_affected_rows(sql); } @@ -733,170 +823,6 @@ } int -cmyth_mysql_query_commbreak_count(cmyth_database_t db, int32_t chanid, time_t start_ts_dt) -{ - MYSQL_RES *res = NULL; - int count = 0; - const char * query_str = "SELECT * FROM recordedmarkup WHERE chanid = ? AND starttime = ? AND TYPE IN ( 4 )"; - cmyth_mysql_query_t * query; - - if (cmyth_database_check_version(db) < 0) - return -1; - - query = cmyth_mysql_query_create(db, query_str); - if (cmyth_mysql_query_param_int32(query, chanid) < 0 - || cmyth_mysql_query_param_unixtime(query, start_ts_dt, db->db_tz_utc) < 0) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s, binding of query parameters failed! Maybe we're out of memory?\n", __FUNCTION__); - ref_release(query); - return -1; - } - res = cmyth_mysql_query_result(query); - ref_release(query); - if (res == NULL) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s, finalisation/execution of query failed!\n", __FUNCTION__); - return -1; - } - count = (int)mysql_num_rows(res); - mysql_free_result(res); - return (count); -} - -int -cmyth_mysql_get_commbreak_list(cmyth_database_t db, uint32_t chanid, time_t start_ts_dt, cmyth_commbreaklist_t breaklist, uint32_t conn_version) -{ - MYSQL_RES *res = NULL; - MYSQL_ROW row; - int resolution = 30; - char * query_str; - int rows = 0; - int i; - cmyth_mysql_query_t * query; - cmyth_commbreak_t commbreak = NULL; - int64_t start_previous = 0; - int64_t end_previous = 0; - - if (cmyth_database_check_version(db) < 0) - return -1; - - if (conn_version >= 43) { - query_str = "SELECT m.type,m.mark,s.mark,s.offset FROM recordedmarkup m INNER JOIN recordedseek AS s ON m.chanid = s.chanid AND m.starttime = s.starttime WHERE m.chanid = ? AND m.starttime = ? AND m.type in (?,?) and FLOOR(m.mark/?)=FLOOR(s.mark/?) ORDER BY `m`.`mark` LIMIT 300 "; - } else { - query_str = "SELECT m.type AS type, m.mark AS mark, s.offset AS offset FROM recordedmarkup m INNER JOIN recordedseek AS s ON (m.chanid = s.chanid AND m.starttime = s.starttime AND (FLOOR(m.mark / 15) + 1) = s.mark) WHERE m.chanid = ? AND m.starttime = ? AND m.type IN (?, ?) ORDER BY mark;"; - } - - cmyth_dbg(CMYTH_DBG_DEBUG, "%s, query=%s\n", __FUNCTION__, query_str); - - query = cmyth_mysql_query_create(db, query_str); - - if ((conn_version >= 43) && ( - cmyth_mysql_query_param_uint32(query, chanid) < 0 - || cmyth_mysql_query_param_unixtime(query, start_ts_dt, db->db_tz_utc) < 0 - || cmyth_mysql_query_param_int(query, CMYTH_COMMBREAK_START) < 0 - || cmyth_mysql_query_param_int(query, CMYTH_COMMBREAK_END) < 0 - || cmyth_mysql_query_param_int(query, resolution) < 0 - || cmyth_mysql_query_param_int(query, resolution) < 0 - )) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s, binding of query parameters failed! Maybe we're out of memory?\n", __FUNCTION__); - ref_release(query); - return -1; - } - - if ((conn_version < 43) && ( - cmyth_mysql_query_param_uint32(query, chanid) < 0 - || cmyth_mysql_query_param_unixtime(query, start_ts_dt, db->db_tz_utc) < 0 - || cmyth_mysql_query_param_int(query, CMYTH_COMMBREAK_START) < 0 - || cmyth_mysql_query_param_int(query, CMYTH_COMMBREAK_END) < 0 - )) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s, binding of query parameters failed! Maybe we're out of memory?\n", __FUNCTION__); - ref_release(query); - return -1; - } - res = cmyth_mysql_query_result(query); - ref_release(query); - if (res == NULL) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s, finalisation/execution of query failed!\n", __FUNCTION__); - return -1; - } - - if (conn_version >= 43) { - breaklist->commbreak_count = cmyth_mysql_query_commbreak_count(db, chanid, start_ts_dt); - } else { - breaklist->commbreak_count = (int)mysql_num_rows(res) / 2; - } - breaklist->commbreak_list = malloc(breaklist->commbreak_count * sizeof(cmyth_commbreak_t)); - - if (!breaklist->commbreak_list) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: malloc() failed for list\n", __FUNCTION__); - return -1; - } - memset(breaklist->commbreak_list, 0, breaklist->commbreak_count * sizeof(cmyth_commbreak_t)); - - i = 0; - if (conn_version >= 43) { - while ((row = mysql_fetch_row(res))) { - if (safe_atoi(row[0]) == CMYTH_COMMBREAK_START) { - if (safe_atoll(row[1]) != start_previous) { - commbreak = cmyth_commbreak_create(); - commbreak->start_mark = safe_atoll(row[1]); - commbreak->start_offset = safe_atoll(row[3]); - start_previous = commbreak->start_mark; - } else if (safe_atoll(row[1]) == safe_atoll(row[2])) { - commbreak = cmyth_commbreak_create(); - commbreak->start_mark = safe_atoll(row[1]); - commbreak->start_offset = safe_atoll(row[3]); - } - } else if (safe_atoi(row[0]) == CMYTH_COMMBREAK_END) { - if (safe_atoll(row[1]) != end_previous) { - commbreak->end_mark = safe_atoll(row[1]); - commbreak->end_offset = safe_atoll(row[3]); - breaklist->commbreak_list[rows] = commbreak; - end_previous = commbreak->end_mark; - rows++; - } else if (safe_atoll(row[1]) == safe_atoll(row[2])) { - commbreak->end_mark = safe_atoll(row[1]); - commbreak->end_offset = safe_atoll(row[3]); - breaklist->commbreak_list[rows] = commbreak; - if (end_previous != safe_atoll(row[1])) { - rows++; - } - } - } else { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: Unknown COMMBREAK returned\n", __FUNCTION__); - return -1; - } - i++; - } - } - - // mythtv protolcol version < 43 - else { - while ((row = mysql_fetch_row(res))) { - if ((i % 2) == 0) { - if (safe_atoi(row[0]) != CMYTH_COMMBREAK_START) { - return -1; - } - commbreak = cmyth_commbreak_create(); - commbreak->start_mark = safe_atoll(row[1]); - commbreak->start_offset = safe_atoll(row[2]); - i++; - } else { - if (safe_atoi(row[0]) != CMYTH_COMMBREAK_END) { - return -1; - } - commbreak->end_mark = safe_atoll(row[1]); - commbreak->end_offset = safe_atoll(row[2]); - breaklist->commbreak_list[rows] = commbreak; - i = 0; - rows++; - } - } - } - mysql_free_result(res); - cmyth_dbg(CMYTH_DBG_DEBUG, "%s: COMMBREAK rows= %d\n", __FUNCTION__, rows); - return rows; -} - -int cmyth_mysql_tuner_type_check(cmyth_database_t db, cmyth_recorder_t rec, int check_tuner_type) { MYSQL_RES *res = NULL; @@ -919,13 +845,13 @@ return -1; } res = cmyth_mysql_query_result(query); + ref_release(query); if (res == NULL) { cmyth_dbg(CMYTH_DBG_ERROR, "%s, finalisation/execution\n", __FUNCTION__); return -1; } row = mysql_fetch_row(res); - ref_release(query); mysql_free_result(res); if (strcmp(row[0], "MPEG") == 0) { return (1); //return the first available MPEG tuner @@ -941,13 +867,17 @@ int cmyth_mysql_testdb_connection(cmyth_database_t db, char **message) { - char *buf = ref_alloc(sizeof(char) * 1001); + char *buf; + if (db->mysql != NULL) { if (mysql_stat(db->mysql) == NULL) { cmyth_database_close(db); return -1; } } + + buf = ref_alloc(sizeof(char) * 1001); + if (db->mysql == NULL) { db->mysql = mysql_init(NULL); if (db->mysql == NULL) { @@ -974,7 +904,17 @@ { MYSQL_RES *res = NULL; MYSQL_ROW row; - const char *query_str = "SELECT chanid, channum, name, icon, visible, sourceid, mplexid, callsign FROM channel;"; + /* + * The is_audio_service (radio) flag is only available from the channel scan. + * The subquery therefore get the flag from the most recent channel scan. + */ + const char *query_str = "SELECT DISTINCT c.chanid, c.channum, c.name, c.icon, c.visible, c.sourceid, c.mplexid, c.callsign, " + "IFNULL(cs.is_audio_service, 0) AS is_audio_service " + "FROM channel c " + "LEFT JOIN (SELECT service_id, MAX(scanid) AS scanid FROM channelscan_channel GROUP BY service_id) s " + "ON s.service_id = c.serviceid " + "LEFT JOIN channelscan_channel cs " + "ON cs.service_id = s.service_id AND cs.scanid = s.scanid;"; int rows = 0; cmyth_mysql_query_t * query; cmyth_channel_t channel; @@ -1013,6 +953,7 @@ channel->sourceid = safe_atol(row[5]); channel->multiplex = safe_atol(row[6]); channel->callsign = ref_strdup(row[7]); + channel->radio = safe_atoi(row[8]); (*chanlist)->chanlist_list[rows] = channel; rows++; } @@ -1023,44 +964,6 @@ } int -cmyth_mysql_is_radio(cmyth_database_t db, uint32_t chanid) -{ - MYSQL_RES *res = NULL; - MYSQL_ROW row; - int retval = 0; - const char *query_str = "SELECT is_audio_service FROM channelscan_channel INNER JOIN channel ON channelscan_channel.service_id=channel.serviceid WHERE channel.chanid = ? ORDER BY channelscan_channel.scanid DESC;"; - cmyth_mysql_query_t * query; - - if (cmyth_database_check_version(db) < 0) - return -1; - - query = cmyth_mysql_query_create(db, query_str); - - if (cmyth_mysql_query_param_uint32(query, chanid) < 0) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s, binding of query parameters failed! Maybe we're out of memory?\n", __FUNCTION__); - ref_release(query); - return -1; - } - - res = cmyth_mysql_query_result(query); - ref_release(query); - - if (res == NULL) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s, finalisation/execution of query failed!\n", __FUNCTION__); - return -1; - } - - if ((row = mysql_fetch_row(res))) { - retval = safe_atoi(row[0]); - } else { - cmyth_dbg(CMYTH_DBG_DEBUG, "%s, Channum %ld not found\n", __FUNCTION__, chanid); - retval = 0; - } - mysql_free_result(res); - return retval; -} - -int cmyth_mysql_get_recordingrules(cmyth_database_t db, cmyth_recordingrulelist_t *rrl) { MYSQL_RES *res = NULL; @@ -1078,8 +981,8 @@ "UNIX_TIMESTAMP(CONVERT_TZ(ADDTIME(enddate,endtime),?,'SYSTEM')),title,description, type, category, " "subtitle, recpriority, startoffset, endoffset, search, inactive, station, dupmethod, dupin, recgroup, " "storagegroup, playgroup, autotranscode, (autouserjob1 | (autouserjob2 << 1) | (autouserjob3 << 2) | " - "(autouserjob4 << 3)), autocommflag, autoexpire, maxepisodes, maxnewest, transcoder, profile, prefinput, " - "autometadata, inetref, season, episode , filter " + "(autouserjob4 << 3)), autocommflag, autoexpire, maxepisodes, maxnewest, transcoder, parentid, profile, " + "prefinput, programid, seriesid, autometadata, inetref, season, episode , filter " "FROM record ORDER BY recordid"; } else { @@ -1087,7 +990,8 @@ "UNIX_TIMESTAMP(CONVERT_TZ(ADDTIME(enddate,endtime),?,'SYSTEM')),title,description, type, category, " "subtitle, recpriority, startoffset, endoffset, search, inactive, station, dupmethod, dupin, recgroup, " "storagegroup, playgroup, autotranscode, (autouserjob1 | (autouserjob2 << 1) | (autouserjob3 << 2) | " - "(autouserjob4 << 3)), autocommflag, autoexpire, maxepisodes, maxnewest, transcoder, profile, prefinput " + "(autouserjob4 << 3)), autocommflag, autoexpire, maxepisodes, maxnewest, transcoder, parentid, profile, " + "prefinput, programid, seriesid " "FROM record ORDER BY recordid"; } @@ -1146,14 +1050,17 @@ rr->maxepisodes = safe_atol(row[24]); rr->maxnewest = safe_atoi(row[25]); rr->transcoder = safe_atol(row[26]); - rr->profile = ref_strdup(row[27]); - rr->prefinput = safe_atol(row[28]); + rr->parentid = safe_atol(row[27]); + rr->profile = ref_strdup(row[28]); + rr->prefinput = safe_atol(row[29]); + rr->programid = ref_strdup(row[30]); + rr->seriesid =ref_strdup(row[31]); if (db->db_version >= 1278) { - rr->autometadata = safe_atoi(row[29]); - rr->inetref = ref_strdup(row[30]); - rr->season = safe_atoi(row[31]); - rr->episode = safe_atoi(row[32]); - rr->filter = safe_atol(row[33]); + rr->autometadata = safe_atoi(row[32]); + rr->inetref = ref_strdup(row[33]); + rr->season = safe_atoi(row[34]); + rr->episode = safe_atoi(row[35]); + rr->filter = safe_atol(row[36]); } else { rr->autometadata = 0; @@ -1184,23 +1091,26 @@ if (cmyth_database_check_version(db) < 0) return -1; + if (!rr) + return -EINVAL; + if (db->db_version >= 1278) { query_str = "INSERT INTO record (record.type, chanid, starttime, startdate, endtime, enddate, title, " - "description, category, findid, findtime, station, subtitle, recpriority, startoffset, endoffset, " + "description, category, findtime, findday, station, subtitle, recpriority, startoffset, endoffset, " "search, inactive, dupmethod, dupin, recgroup, storagegroup, playgroup, autotranscode, autouserjob1, " "autouserjob2, autouserjob3, autouserjob4, autocommflag, autoexpire, maxepisodes, maxnewest, transcoder, " - "profile, prefinput, autometadata, inetref, season, episode, filter) " - "VALUES (?, ?, TIME(?), DATE(?), TIME(?), DATE(?), ?, ?, ?, TO_DAYS(DATE(?)), TIME(?), " - "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ,? ,?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"; + "parentid, profile, prefinput, programid, seriesid, autometadata, inetref, season, episode, filter) " + "VALUES (?, ?, TIME(?), DATE(?), TIME(?), DATE(?), ?, ?, ?, TIME(?), MOD(DAYOFWEEK(?),7), " + "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; } else { query_str = "INSERT INTO record (record.type, chanid, starttime, startdate, endtime, enddate, title, " - "description, category, findid, findtime, station, subtitle, recpriority, startoffset, endoffset, " + "description, category, findtime, findday, station, subtitle, recpriority, startoffset, endoffset, " "search, inactive, dupmethod, dupin, recgroup, storagegroup, playgroup, autotranscode, autouserjob1, " "autouserjob2, autouserjob3, autouserjob4, autocommflag, autoexpire, maxepisodes, maxnewest, transcoder, " - "profile, prefinput) " - "VALUES (?, ?, TIME(?), DATE(?), TIME(?), DATE(?), ?, ?, ?, TO_DAYS(DATE(?)), TIME(?), " - "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ,? ,?, ?, ?, ?, ?);"; + "parentid, profile, prefinput, programid, seriesid) " + "VALUES (?, ?, TIME(?), DATE(?), TIME(?), DATE(?), ?, ?, ?, TIME(?), MOD(DAYOFWEEK(?),7), " + "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ,? ,?, ?, ?, ?, ?, ?, ?, ?)"; } starttime = cmyth_timestamp_to_unixtime(rr->starttime); @@ -1240,8 +1150,11 @@ || cmyth_mysql_query_param_uint32(query, rr->maxepisodes) < 0 || cmyth_mysql_query_param_uint(query, rr->maxnewest) < 0 || cmyth_mysql_query_param_uint32(query, rr->transcoder) < 0 + || cmyth_mysql_query_param_uint32(query, rr->parentid) < 0 || cmyth_mysql_query_param_str(query, rr->profile) < 0 - || cmyth_mysql_query_param_uint32(query, rr->prefinput) < 0) + || cmyth_mysql_query_param_uint32(query, rr->prefinput) < 0 + || cmyth_mysql_query_param_str(query, rr->programid) < 0 + || cmyth_mysql_query_param_str(query, rr->seriesid) < 0) || (db->db_version >= 1278 && (cmyth_mysql_query_param_uint(query, rr->autometadata) < 0 || cmyth_mysql_query_param_str(query, rr->inetref) < 0 @@ -1266,31 +1179,72 @@ } int -cmyth_mysql_delete_recordingrule(cmyth_database_t db, uint32_t recordid) +cmyth_mysql_delete_recordingrule(cmyth_database_t db, cmyth_recordingrule_t rr) { - int ret; + int ret, rows; MYSQL* sql = cmyth_db_get_connection(db); - const char *query_str = "DELETE FROM record WHERE recordid = ?;"; + char *query_str; + cmyth_mysql_query_t * query; if (cmyth_database_check_version(db) < 0) return -1; + if (!rr || rr->recordid == 0) + return -EINVAL; + + /* Remove record */ + query_str = "DELETE FROM record WHERE recordid = ?"; query = cmyth_mysql_query_create(db, query_str); - if (cmyth_mysql_query_param_uint32(query, recordid) < 0) { + if (cmyth_mysql_query_param_uint32(query, rr->recordid) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s, binding of query parameters failed! Maybe we're out of memory?\n", __FUNCTION__); ref_release(query); return -1; } - ret = cmyth_mysql_query(query); + ref_release(query); + if (ret != 0) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s, finalisation/execution of query failed!\n", __FUNCTION__); + cmyth_dbg(CMYTH_DBG_ERROR, "%s, DELETE FROM RECORD: finalisation/execution of query failed!\n", __FUNCTION__); return -1; } - return (int)mysql_affected_rows(sql); + rows = (int)mysql_affected_rows(sql); + + /* Remove oldfind */ + query_str = "DELETE FROM oldfind WHERE recordid = ?"; + query = cmyth_mysql_query_create(db, query_str); + if (cmyth_mysql_query_param_uint32(query, rr->recordid) < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s, binding of query parameters failed! Maybe we're out of memory?\n", __FUNCTION__); + ref_release(query); + return -1; + } + ret = cmyth_mysql_query(query); + ref_release(query); + + if (ret != 0) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s, DELETE FROM OLDFIND: finalisation/execution of query failed!\n", __FUNCTION__); + } + + if (rr->searchtype == RRULE_MANUAL_SEARCH) { + /* Remove manual program */ + query_str = "DELETE FROM program WHERE manualid = ?"; + query = cmyth_mysql_query_create(db, query_str); + if (cmyth_mysql_query_param_uint32(query, rr->recordid) < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s, binding of query parameters failed! Maybe we're out of memory?\n", __FUNCTION__); + ref_release(query); + return -1; + } + ret = cmyth_mysql_query(query); + ref_release(query); + + if (ret != 0) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s, DELETE FROM PROGRAM: finalisation/execution of query failed!\n", __FUNCTION__); + } + } + + return rows; } int @@ -1306,24 +1260,31 @@ if (cmyth_database_check_version(db) < 0) return -1; + if (!rr || rr->recordid == 0) + return -EINVAL; + if (db->db_version >= 1278) { query_str = "UPDATE record SET record.type = ?, chanid = ?, starttime = TIME(?), startdate = DATE(?), " "endtime = TIME(?), enddate = DATE(?) ,title = ?, description = ?, category = ?, subtitle = ?, " - "recpriority = ?, startoffset = ?, endoffset = ?, search = ?, inactive = ?, station = ?, " - "dupmethod = ?, dupin = ?, recgroup = ?, storagegroup = ?, playgroup = ?, autotranscode = ?, " - "autouserjob1 = ?, autouserjob2 = ?, autouserjob3 = ?, autouserjob4 = ?, autocommflag = ?, " - "autoexpire = ?, maxepisodes = ?, maxnewest = ?, transcoder = ?, profile = ?, prefinput = ?, " + "recpriority = ?, startoffset = ?, endoffset = ?, search = ?, inactive = ?, findtime = TIME(?), " + "findday = MOD(DAYOFWEEK(?),7), " + "station = ?, dupmethod = ?, dupin = ?, recgroup = ?, storagegroup = ?, playgroup = ?, " + "autotranscode = ?, autouserjob1 = ?, autouserjob2 = ?, autouserjob3 = ?, autouserjob4 = ?, " + "autocommflag = ?, autoexpire = ?, maxepisodes = ?, maxnewest = ?, transcoder = ?, parentid = ?, " + "profile = ?, prefinput = ?, programid = ?, seriesid = ?, " "autometadata = ?, inetref = ?, season = ?, episode = ?, filter = ? " - "WHERE recordid = ? ;"; + "WHERE recordid = ?"; } else { query_str = "UPDATE record SET record.type = ?, chanid = ?, starttime = TIME(?), startdate = DATE(?), " "endtime = TIME(?), enddate = DATE(?) ,title = ?, description = ?, category = ?, subtitle = ?, " - "recpriority = ?, startoffset = ?, endoffset = ?, search = ?, inactive = ?, station = ?, " - "dupmethod = ?, dupin = ?, recgroup = ?, storagegroup = ?, playgroup = ?, autotranscode = ?, " - "autouserjob1 = ?, autouserjob2 = ?, autouserjob3 = ?, autouserjob4 = ?, autocommflag = ?, " - "autoexpire = ?, maxepisodes = ?, maxnewest = ?, transcoder = ?, profile = ?, prefinput = ? " - "WHERE recordid = ? ;"; + "recpriority = ?, startoffset = ?, endoffset = ?, search = ?, inactive = ?, findtime = TIME(?), " + "findday = MOD(DAYOFWEEK(?),7), " + "station = ?, dupmethod = ?, dupin = ?, recgroup = ?, storagegroup = ?, playgroup = ?, " + "autotranscode = ?, autouserjob1 = ?, autouserjob2 = ?, autouserjob3 = ?, autouserjob4 = ?, " + "autocommflag = ?, autoexpire = ?, maxepisodes = ?, maxnewest = ?, transcoder = ?, parentid = ?, " + "profile = ?, prefinput = ? , programid = ?, seriesid = ? " + "WHERE recordid = ?"; } starttime = cmyth_timestamp_to_unixtime(rr->starttime); endtime = cmyth_timestamp_to_unixtime(rr->endtime); @@ -1344,6 +1305,8 @@ || cmyth_mysql_query_param_uint(query, rr->endoffset) < 0 || cmyth_mysql_query_param_uint(query, rr->searchtype) < 0 || cmyth_mysql_query_param_uint(query, rr->inactive) < 0 + || cmyth_mysql_query_param_unixtime(query, starttime, 0) < 0 + || cmyth_mysql_query_param_unixtime(query, starttime, 0) < 0 || cmyth_mysql_query_param_str(query, rr->callsign) < 0 || cmyth_mysql_query_param_uint(query, rr->dupmethod) < 0 || cmyth_mysql_query_param_uint(query, rr->dupin) < 0 @@ -1360,8 +1323,11 @@ || cmyth_mysql_query_param_uint32(query, rr->maxepisodes) < 0 || cmyth_mysql_query_param_uint(query, rr->maxnewest) < 0 || cmyth_mysql_query_param_uint32(query, rr->transcoder) < 0 - || cmyth_mysql_query_param_str(query, rr->playgroup) < 0 - || cmyth_mysql_query_param_uint32(query, rr->prefinput) < 0) + || cmyth_mysql_query_param_uint32(query, rr->parentid) < 0 + || cmyth_mysql_query_param_str(query, rr->profile) < 0 + || cmyth_mysql_query_param_uint32(query, rr->prefinput) < 0 + || cmyth_mysql_query_param_str(query, rr->programid) < 0 + || cmyth_mysql_query_param_str(query, rr->seriesid) < 0) || (db->db_version >= 1278 && ( cmyth_mysql_query_param_uint(query, rr->autometadata) < 0 || cmyth_mysql_query_param_str(query, rr->inetref) < 0 @@ -1378,9 +1344,9 @@ ref_release(query); - if (ret == -1) { + if (ret < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s, finalisation/execution of query failed!\n", __FUNCTION__); - return -1; + return ret; } return (int)mysql_affected_rows(sql); @@ -1702,11 +1668,79 @@ } int -cmyth_mysql_get_prog_finder_time_title_chan(cmyth_database_t db, cmyth_program_t *prog, time_t starttime, char *program_name, uint32_t chanid) +cmyth_mysql_get_prog_finder_chan(cmyth_database_t db, cmyth_epginfo_t *epg, time_t attime, uint32_t chanid) +{ + MYSQL_RES *res = NULL; + MYSQL_ROW row; + const char *query_str = "SELECT program.chanid, UNIX_TIMESTAMP(CONVERT_TZ(program.starttime,?,'SYSTEM')), " + "UNIX_TIMESTAMP(CONVERT_TZ(program.endtime,?,'SYSTEM')), program.title, program.description, " + "program.subtitle, program.programid, program.seriesid, program.category, program.category_type, " + "channel.channum, channel.callsign, channel.name, channel.sourceid " + "FROM program LEFT JOIN channel on program.chanid=channel.chanid " + "WHERE program.chanid = ? AND program.starttime <= ? AND program.endtime >= ? AND program.manualid = 0 " + "ORDER BY (channel.channum + 0), program.starttime ASC"; + int rows = 0; + cmyth_mysql_query_t * query; + + if (cmyth_database_check_version(db) < 0) + return -1; + + query = cmyth_mysql_query_create(db, query_str); + + if (cmyth_mysql_query_param_str(query, db->db_tz_name) < 0 + || cmyth_mysql_query_param_str(query, db->db_tz_name) < 0 + || cmyth_mysql_query_param_uint32(query, chanid) < 0 + || cmyth_mysql_query_param_unixtime(query, attime, db->db_tz_utc) < 0 + || cmyth_mysql_query_param_unixtime(query, attime, db->db_tz_utc) < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s, binding of query parameters failed! Maybe we're out of memory?\n", __FUNCTION__); + ref_release(query); + return -1; + } + + res = cmyth_mysql_query_result(query); + ref_release(query); + + if (res == NULL) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s, finalisation/execution of query failed!\n", __FUNCTION__); + return -1; + } + + if ((row = mysql_fetch_row(res))) { + rows++; + *epg = cmyth_epginfo_create(); + (*epg)->chanid = safe_atol(row[0]); + (*epg)->starttime = safe_atol(row[1]); + (*epg)->endtime = safe_atol(row[2]); + (*epg)->title = ref_strdup(row[3]); + (*epg)->description = ref_strdup(row[4]); + (*epg)->subtitle = ref_strdup(row[5]); + (*epg)->programid = ref_strdup(row[6]); + (*epg)->seriesid = ref_strdup(row[7]); + (*epg)->category = ref_strdup(row[8]); + (*epg)->category_type = ref_strdup(row[9]); + (*epg)->channum = safe_atol(row[10]); + (*epg)->callsign = ref_strdup(row[11]); + (*epg)->channame = ref_strdup(row[12]); + (*epg)->sourceid = safe_atol(row[13]); + cmyth_dbg(CMYTH_DBG_DEBUG, "%s: chanid = %"PRIu32" title = %s\n", __FUNCTION__, (*epg)->chanid, (*epg)->title); + } + mysql_free_result(res); + cmyth_dbg(CMYTH_DBG_DEBUG, "%s: rows= %d\n", __FUNCTION__, rows); + return rows; +} + +int +cmyth_mysql_get_prog_finder_time_title_chan(cmyth_database_t db, cmyth_epginfo_t *epg, time_t starttime, char *program_name, uint32_t chanid) { MYSQL_RES *res = NULL; MYSQL_ROW row; - const char *query_str = "SELECT program.chanid,UNIX_TIMESTAMP(CONVERT_TZ(program.starttime,?,'SYSTEM')),UNIX_TIMESTAMP(CONVERT_TZ(program.endtime,?,'SYSTEM')),program.title,program.description,program.subtitle,program.programid,program.seriesid,program.category,program.category_type,channel.channum,channel.callsign,channel.name,channel.sourceid FROM program INNER JOIN channel ON program.chanid=channel.chanid WHERE program.chanid = ? AND program.title LIKE ? AND program.starttime = ? AND program.manualid = 0 ORDER BY (channel.channum + 0), program.starttime ASC"; + const char *query_str = "SELECT program.chanid, UNIX_TIMESTAMP(CONVERT_TZ(program.starttime,?,'SYSTEM')), " + "UNIX_TIMESTAMP(CONVERT_TZ(program.endtime,?,'SYSTEM')), program.title, program.description, " + "program.subtitle, program.programid, program.seriesid, program.category, program.category_type, " + "channel.channum, channel.callsign, channel.name, channel.sourceid " + "FROM program LEFT JOIN channel on program.chanid=channel.chanid " + "WHERE program.chanid = ? AND program.title LIKE ? AND program.starttime = ? AND program.manualid = 0 " + "ORDER BY (channel.channum + 0), program.starttime ASC"; int rows = 0; cmyth_mysql_query_t * query; @@ -1735,24 +1769,23 @@ if ((row = mysql_fetch_row(res))) { rows++; - if (prog) { - prog->chanid = safe_atol(row[0]); - prog->starttime = (time_t)safe_atol(row[1]); - prog->endtime = (time_t)safe_atol(row[2]); - sizeof_strncpy(prog->title, row[3]); - sizeof_strncpy(prog->description, row[4]); - sizeof_strncpy(prog->subtitle, row[5]); - sizeof_strncpy(prog->programid, row[6]); - sizeof_strncpy(prog->seriesid, row[7]); - sizeof_strncpy(prog->category, row[8]); - sizeof_strncpy(prog->category_type, row[9]); - prog->channum = safe_atol(row[10]); - sizeof_strncpy(prog->callsign, row[11]); - sizeof_strncpy(prog->name, row[12]); - prog->sourceid = safe_atol(row[13]); - } + *epg = cmyth_epginfo_create(); + (*epg)->chanid = safe_atol(row[0]); + (*epg)->starttime = safe_atol(row[1]); + (*epg)->endtime = safe_atol(row[2]); + (*epg)->title = ref_strdup(row[3]); + (*epg)->description = ref_strdup(row[4]); + (*epg)->subtitle = ref_strdup(row[5]); + (*epg)->programid = ref_strdup(row[6]); + (*epg)->seriesid = ref_strdup(row[7]); + (*epg)->category = ref_strdup(row[8]); + (*epg)->category_type = ref_strdup(row[9]); + (*epg)->channum = safe_atol(row[10]); + (*epg)->callsign = ref_strdup(row[11]); + (*epg)->channame = ref_strdup(row[12]); + (*epg)->sourceid = safe_atol(row[13]); + cmyth_dbg(CMYTH_DBG_DEBUG, "%s: chanid = %"PRIu32" title = %s\n", __FUNCTION__, (*epg)->chanid, (*epg)->title); } - mysql_free_result(res); cmyth_dbg(CMYTH_DBG_DEBUG, "%s: rows= %d\n", __FUNCTION__, rows); return rows; @@ -2198,3 +2231,168 @@ mysql_free_result(res); return rows; } + +/* + * cmyth_mysql_keep_livetv_recording() + * + * Scope: PUBLIC + * + * Description + * + * keep/ignore recording. + * + * Success: returns 0 for unavailable else 1 + * + * Failure: -1 + */ +int cmyth_mysql_keep_livetv_recording(cmyth_database_t db, cmyth_proginfo_t prog, int8_t keep) +{ + int ret; + MYSQL* sql = cmyth_db_get_connection(db); + const char *query_str = "UPDATE recorded SET autoexpire = ?, recgroup = ? WHERE chanid = ? AND starttime = ? AND storagegroup = 'LiveTV'"; + cmyth_mysql_query_t * query; + time_t starttime; + int autoexpire; + const char* recgroup; + + if (cmyth_database_check_version(db) < 0) + return -1; + + if (keep) { + char* data; + if (cmyth_mysql_get_setting(db, "AutoExpireDefault", &data) > 0) { + autoexpire = safe_atol(data); + ref_release(data); + } else { + autoexpire = 0; + } + recgroup = "Default"; + } + else + { + autoexpire = 10000; + recgroup = "LiveTV"; + } + + starttime = cmyth_timestamp_to_unixtime(prog->proginfo_rec_start_ts); + query = cmyth_mysql_query_create(db, query_str); + if (cmyth_mysql_query_param_int32(query,autoexpire) < 0 + || cmyth_mysql_query_param_str(query,recgroup) < 0 + || cmyth_mysql_query_param_uint32(query, prog->proginfo_chanId) < 0 + || cmyth_mysql_query_param_unixtime(query, starttime, db->db_tz_utc) < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s, binding of query parameters failed! Maybe we're out of memory?\n", __FUNCTION__); + ref_release(query); + return -1; + } + + ret = cmyth_mysql_query(query); + + ref_release(query); + + if (ret < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s, finalisation/execution of query failed!\n", __FUNCTION__); + return ret; + } + + return (int)mysql_affected_rows(sql); +} + +/* + * cmyth_mysql_get_recording_seek_offset() + * + * Scope: PUBLIC + * + * Description + * + * Returns seek offsets around the mark + * + * Success: + * 0 = None + * 1 = Found before the mark + * 2 = Found after the mark + * 3 = Found around the mark + * + * Failure: -1 + */ +int8_t +cmyth_mysql_get_recording_seek_offset(cmyth_database_t db, cmyth_proginfo_t prog, cmyth_recording_markup_t type, int64_t mark, int64_t *psoffset, int64_t *nsoffset) +{ + MYSQL_RES *res = NULL; + MYSQL_ROW row; + /* + * Force usage of primary key index to retrieve mark value: + * const DESC, const DESC, const DESC + */ + const char *query_str1 = "SELECT mark,offset FROM recordedseek WHERE chanid = ? AND starttime = ? AND type = ? AND mark >= ? ORDER BY chanid ASC, starttime ASC, type ASC, mark ASC LIMIT 1;"; + const char *query_str2 = "SELECT mark,offset FROM recordedseek WHERE chanid = ? AND starttime = ? AND type = ? AND mark <= ? ORDER BY chanid DESC, starttime DESC, type DESC, mark DESC LIMIT 1;"; + int64_t next_offset = 0; + int64_t prev_offset = 0; + uint8_t mask = 0; + time_t start_ts_dt; + cmyth_mysql_query_t * query; + + if (cmyth_database_check_version(db) < 0) + return -1; + + start_ts_dt = cmyth_timestamp_to_unixtime(prog->proginfo_rec_start_ts); + + query = cmyth_mysql_query_create(db, query_str1); + + if (cmyth_mysql_query_param_uint32(query, prog->proginfo_chanId) < 0 + || cmyth_mysql_query_param_unixtime(query, start_ts_dt, db->db_tz_utc) < 0 + || cmyth_mysql_query_param_int(query, type) < 0 + || cmyth_mysql_query_param_int64(query, mark) < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s, binding of query parameters failed! Maybe we're out of memory?\n", __FUNCTION__); + ref_release(query); + return -1; + } + res = cmyth_mysql_query_result(query); + ref_release(query); + if (res == NULL) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s, finalisation/execution of query 1 failed!\n", __FUNCTION__); + return -1; + } + while ((row = mysql_fetch_row(res))) { + next_offset = safe_atoll(row[1]); + mask |= 1; + } + mysql_free_result(res); + + query = cmyth_mysql_query_create(db, query_str2); + + if (cmyth_mysql_query_param_uint32(query, prog->proginfo_chanId) < 0 + || cmyth_mysql_query_param_unixtime(query, start_ts_dt, db->db_tz_utc) < 0 + || cmyth_mysql_query_param_int(query, type) < 0 + || cmyth_mysql_query_param_int64(query, mark) < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s, binding of query parameters failed! Maybe we're out of memory?\n", __FUNCTION__); + ref_release(query); + return -1; + } + res = cmyth_mysql_query_result(query); + ref_release(query); + if (res == NULL) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s, finalisation/execution of query 2 failed!\n", __FUNCTION__); + return -1; + } + while ((row = mysql_fetch_row(res))) { + prev_offset = safe_atoll(row[1]); + mask |= 2; + } + mysql_free_result(res); + + if (mask == 3) { + *psoffset = prev_offset; + *nsoffset = next_offset; + } else if (mask == 1) { + *psoffset = next_offset; + *nsoffset = 0; + } else if (mask == 2) { + *psoffset = 0; + *nsoffset = prev_offset; + } else { + *psoffset = 0; + *nsoffset = 0; + } + + return mask; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/posmap.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/posmap.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/posmap.c 2013-03-12 10:51:22.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/posmap.c 2014-01-28 20:43:50.000000000 +0000 @@ -92,3 +92,21 @@ ret->posmap_list = NULL; return ret; } + +int +cmyth_posmap_count(cmyth_posmap_t pm) +{ + if (pm) + return pm->posmap_count; + else + return 0; +} + +cmyth_keyframe_t +cmyth_posmap_keyframe(cmyth_posmap_t pm, int index) +{ + if (pm && pm->posmap_count > index) + return ref_hold(pm->posmap_list[index]); + else + return NULL; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/proginfo.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/proginfo.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/proginfo.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/proginfo.c 2014-01-04 10:28:12.000000000 +0000 @@ -67,6 +67,9 @@ if (p->proginfo_description) { ref_release(p->proginfo_description); } + if (p->proginfo_syndicated_episode) { + ref_release(p->proginfo_syndicated_episode); + } if (p->proginfo_category) { ref_release(p->proginfo_category); } @@ -212,6 +215,7 @@ ret->proginfo_description = NULL; ret->proginfo_season = 0; ret->proginfo_episode = 0; + ret->proginfo_syndicated_episode = NULL; ret->proginfo_category = NULL; ret->proginfo_chanId = 0; ret->proginfo_chanstr = NULL; @@ -257,6 +261,8 @@ ret->proginfo_videoproperties = 0; ret->proginfo_subtitletype = 0; ret->proginfo_year = 0; + ret->proginfo_partnumber = 0; + ret->proginfo_parttotal = 0; cmyth_dbg(CMYTH_DBG_DEBUG, "%s }\n", __FUNCTION__); return ret; @@ -305,6 +311,7 @@ ret->proginfo_description = ref_hold(p->proginfo_description); ret->proginfo_season = p->proginfo_season; ret->proginfo_episode = p->proginfo_episode; + ret->proginfo_syndicated_episode = ref_hold(p->proginfo_syndicated_episode); ret->proginfo_category = ref_hold(p->proginfo_category); ret->proginfo_chanId = p->proginfo_chanId; ret->proginfo_chanstr = ref_hold(p->proginfo_chanstr); @@ -350,6 +357,9 @@ ret->proginfo_videoproperties = p->proginfo_videoproperties; ret->proginfo_subtitletype = p->proginfo_subtitletype; ret->proginfo_year = p->proginfo_year; + ret->proginfo_partnumber = p->proginfo_partnumber; + ret->proginfo_parttotal = p->proginfo_parttotal; + cmyth_dbg(CMYTH_DBG_DEBUG, "%s }\n", __FUNCTION__); return ret; } @@ -378,6 +388,7 @@ len += strlen(S(prog->proginfo_title)); len += strlen(S(prog->proginfo_subtitle)); len += strlen(S(prog->proginfo_description)); + len += strlen(S(prog->proginfo_syndicated_episode)); len += strlen(S(prog->proginfo_category)); len += strlen(S(prog->proginfo_chanstr)); len += strlen(S(prog->proginfo_chansign)); @@ -426,6 +437,9 @@ sprintf(buf + strlen(buf), "%"PRIu16"[]:[]", prog->proginfo_season); sprintf(buf + strlen(buf), "%"PRIu16"[]:[]", prog->proginfo_episode); } + if (control->conn_version >= 76) { + sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_syndicated_episode)); + } sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_category)); sprintf(buf + strlen(buf), "%"PRIu32"[]:[]", prog->proginfo_chanId); sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_chanstr)); @@ -449,7 +463,7 @@ sprintf(buf + strlen(buf), "%"PRIu32"[]:[]", prog->proginfo_source_id); sprintf(buf + strlen(buf), "%"PRIu32"[]:[]", prog->proginfo_card_id); sprintf(buf + strlen(buf), "%"PRIu32"[]:[]", prog->proginfo_input_id); - sprintf(buf + strlen(buf), "%"PRId8"[]:[]", prog->proginfo_rec_priority); + sprintf(buf + strlen(buf), "%"PRId32"[]:[]", prog->proginfo_rec_priority); sprintf(buf + strlen(buf), "%"PRId8"[]:[]", prog->proginfo_rec_status); sprintf(buf + strlen(buf), "%"PRIu32"[]:[]", prog->proginfo_record_id); sprintf(buf + strlen(buf), "%"PRIu8"[]:[]", prog->proginfo_rec_type); @@ -481,7 +495,7 @@ sprintf(buf + strlen(buf), "%s[]:[]", S(prog->proginfo_playgroup)); } if (control->conn_version >= 25) { - sprintf(buf + strlen(buf), "%"PRId8"[]:[]", prog->proginfo_recpriority_2); + sprintf(buf + strlen(buf), "%"PRId32"[]:[]", prog->proginfo_recpriority_2); } if (control->conn_version >= 31) { sprintf(buf + strlen(buf), "%"PRIu32"[]:[]", prog->proginfo_parentid); @@ -497,6 +511,10 @@ if (control->conn_version >= 43) { sprintf(buf + strlen(buf), "%"PRIu16"[]:[]", prog->proginfo_year); } + if (control->conn_version >= 76) { + sprintf(buf + strlen(buf), "%"PRIu16"[]:[]", prog->proginfo_partnumber); + sprintf(buf + strlen(buf), "%"PRIu16"[]:[]", prog->proginfo_parttotal); + } #undef S return buf; @@ -542,57 +560,78 @@ * Failure: -(ERRNO) */ int -cmyth_proginfo_delete_recording(cmyth_conn_t control, cmyth_proginfo_t prog) +cmyth_proginfo_delete_recording(cmyth_conn_t control, cmyth_proginfo_t prog, uint8_t force, uint8_t forget) { - int32_t c = 0; + int32_t result_code = 0; int err = 0; int count = 0; int r = 0; int ret = 0; char *buf; char *proginfo; + char recstartts[CMYTH_TIMESTAMP_NUMERIC_LEN + 1]; + cmyth_timestamp_t t_utc; if (!control) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", __FUNCTION__); return -EINVAL; } - if (control->conn_version < 12) - { - cmyth_dbg(CMYTH_DBG_ERROR, - "%s: delete not supported with protocol ver %d\n", - __FUNCTION__, control->conn_version); - return -EINVAL; - } - proginfo = cmyth_proginfo_string(control, prog); - if (proginfo == NULL) { - cmyth_dbg(CMYTH_DBG_ERROR, - "%s: program_info failed.\n", - __FUNCTION__); - return -EINVAL; - } + if (control->conn_version < 56) { + proginfo = cmyth_proginfo_string(control, prog); + if (proginfo == NULL) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: program_info failed.\n", __FUNCTION__); + return -EINVAL; + } - buf = malloc(strlen(proginfo) + 23 + 1); - if (!buf) { + buf = malloc(strlen(proginfo) + 21 + 1); + if (!buf) { + free(proginfo); + return -ENOMEM; + } + sprintf(buf, "DELETE_RECORDING[]:[]%s", proginfo); free(proginfo); - return -ENOMEM; + } else { + if (control->conn_version < 75) { + ret = cmyth_timestamp_to_numstring(recstartts, prog->proginfo_rec_start_ts); + } else { + /* Convert local time to UTC time */ + t_utc = cmyth_timestamp_utc_from_unixtime(cmyth_timestamp_to_unixtime(prog->proginfo_rec_start_ts)); + ret = cmyth_timestamp_to_numstring(recstartts, t_utc); + ref_release(t_utc); + } + if (ret < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_timestamp_to_numstring failed.\n", __FUNCTION__); + return ret; + } + + buf = malloc(17 + CMYTH_INT32_LEN + 1 + CMYTH_TIMESTAMP_NUMERIC_LEN + 9 + 10 + 1); + if (!buf) { + return -ENOMEM; + } + sprintf(buf,"DELETE_RECORDING %"PRIu32" %s %s", + prog->proginfo_chanId, + recstartts, + force ? "FORCE" : "NO_FORCE"); + + if (control->conn_version >= 59) { + strcat(buf, forget ? " FORGET" : " NO_FORGET"); + } } - sprintf(buf, "DELETE_RECORDING 0[]:[]%s", proginfo); - free(proginfo); pthread_mutex_lock(&control->conn_mutex); - if ((err = cmyth_send_message(control, buf)) < 0) { + if ((r = cmyth_send_message(control, buf)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", - __FUNCTION__, err); - ret = err; + __FUNCTION__, r); + ret = r; goto out; } count = cmyth_rcv_length(control); - if ((r = cmyth_rcv_int32(control, &err, &c, count)) < 0) { + if ((r = cmyth_rcv_int32(control, &err, &result_code, count)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_length() failed (%d)\n", __FUNCTION__, r); @@ -600,6 +639,11 @@ goto out; } + if (result_code == -2) + ret = -1; + else + ret = 0; + out: pthread_mutex_unlock(&control->conn_mutex); free(buf); @@ -665,11 +709,11 @@ pthread_mutex_lock(&control->conn_mutex); - if ((err = cmyth_send_message(control, buf)) < 0) { + if ((r = cmyth_send_message(control, buf)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", - __FUNCTION__, err); - ret = err; + __FUNCTION__, r); + ret = r; goto out; } @@ -747,11 +791,11 @@ pthread_mutex_lock(&control->conn_mutex); - if ((err = cmyth_send_message(control, buf)) < 0) { + if ((r = cmyth_send_message(control, buf)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", - __FUNCTION__, err); - ret = err; + __FUNCTION__, r); + ret = r; goto out; } @@ -933,6 +977,37 @@ } /* + * cmyth_proginfo_syndicated_episode() + * + * + * Scope: PUBLIC + * + * Description + * + * Retrieves the 'proginfo_syndicated_episode' field of a program info structure. + * + * The returned string is a pointer to the string within the program + * info structure, so it should not be modified by the caller. + * The return value is a 'char *' for this reason. + * + * Return Value: + * + * Success: A pointer to a 'char *' pointing to the field. + * + * Failure: NULL + */ +char * +cmyth_proginfo_syndicated_episode(cmyth_proginfo_t prog) +{ + if (!prog) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL program information\n", + __FUNCTION__); + return NULL; + } + return ref_hold(prog->proginfo_syndicated_episode); +} + +/* * cmyth_proginfo_category() * * @@ -1423,6 +1498,58 @@ } /* + * cmyth_proginfo_partnumber() + * + * + * Scope: PUBLIC + * + * Description + * + * Retrieves the 'proginfo_partnumber' field of a program info + * structure. + * + * Return Value: + * + * Success: the part number for the program + * + * Failure: 0 + */ +uint16_t +cmyth_proginfo_partnumber(cmyth_proginfo_t prog) +{ + if (!prog) { + return 0; + } + return prog->proginfo_partnumber; +} + +/* + * cmyth_proginfo_parttotal() + * + * + * Scope: PUBLIC + * + * Description + * + * Retrieves the 'proginfo_total' field of a program info + * structure. + * + * Return Value: + * + * Success: the part total for the program + * + * Failure: 0 + */ +uint16_t +cmyth_proginfo_parttotal(cmyth_proginfo_t prog) +{ + if (!prog) { + return 0; + } + return prog->proginfo_parttotal; +} + +/* * cmyth_proginfo_fill() * * Scope: PRIVATE (static) @@ -1685,7 +1812,7 @@ return prog->proginfo_record_id; } -int8_t +int32_t cmyth_proginfo_priority(cmyth_proginfo_t prog) { if (!prog) { @@ -1719,31 +1846,6 @@ return ref_hold(prog->proginfo_chanicon); } -int -cmyth_get_delete_list(cmyth_conn_t conn, char * msg, cmyth_proglist_t prog) -{ - int err=0; - int count; - int prog_count=0; - - if (!conn) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", __FUNCTION__); - return -1; - } - pthread_mutex_lock(&conn->conn_mutex); - if ((err = cmyth_send_message(conn, msg)) < 0) { - fprintf (stderr, "ERROR %d \n",err); - cmyth_dbg(CMYTH_DBG_ERROR, - "%s: cmyth_send_message() failed (%d)\n",__FUNCTION__,err); - return err; - } - count = cmyth_rcv_length(conn); - cmyth_rcv_proglist(conn, &err, prog, count); - prog_count=cmyth_proglist_get_count(prog); - pthread_mutex_unlock(&conn->conn_mutex); - return prog_count; -} - cmyth_proginfo_t cmyth_proginfo_get_from_basename(cmyth_conn_t control, const char* basename) { @@ -1897,7 +1999,7 @@ count -= i; if (strcmp(msg, "OK") != 0) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: didn't recieve OK as response\n", + cmyth_dbg(CMYTH_DBG_INFO, "%s: didn't recieve OK as response\n", __FUNCTION__); goto out; } @@ -1946,3 +2048,74 @@ } } + +char * +cmyth_proginfo_storagegroup(cmyth_proginfo_t prog) +{ + if (!prog) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL program information\n", + __FUNCTION__); + return NULL; + } + return ref_hold(prog->proginfo_storagegroup); +} + +int +cmyth_proginfo_generate_pixmap(cmyth_conn_t control, cmyth_proginfo_t prog) +{ + int err = 0; + int ret = 0; + char *buf; + char *proginfo; + + if (!control) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", + __FUNCTION__); + return -EINVAL; + } + + if (!prog) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no program info\n", + __FUNCTION__); + return -EINVAL; + } + + if (control->conn_version < 61) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: protocol version doesn't support QUERY_PIXMAP2\n", + __FUNCTION__); + return -EPERM; + } + + proginfo = cmyth_proginfo_string(control, prog); + if (proginfo == NULL) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: program_info failed.\n", + __FUNCTION__); + return -EINVAL; + } + + buf = malloc(strlen(proginfo) + 37 + 1); + if (!buf) { + free(proginfo); + return -ENOMEM; + } + sprintf(buf, "QUERY_GENPIXMAP2[]:[]do_not_care[]:[]%s", proginfo); + free(proginfo); + + pthread_mutex_lock(&control->conn_mutex); + + if ((err = cmyth_send_message(control, buf)) < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", __FUNCTION__, err); + ret = err; + goto out; + } + + if ((ret = cmyth_rcv_okay(control)) < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_okay() failed\n", __FUNCTION__); + } + + out: + pthread_mutex_unlock(&control->conn_mutex); + free(buf); + + return ret; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/proglist.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/proglist.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/proglist.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/proglist.c 2014-01-04 10:28:12.000000000 +0000 @@ -618,10 +618,10 @@ switch (sort) { case MYTHTV_SORT_DATE_RECORDED: /* Default Date Recorded */ - qsort((cmyth_proginfo_t)pl->proglist_list, count, sizeof(pl->proglist_list) , recorded_compare); + qsort((cmyth_proginfo_t)pl->proglist_list, count, pl->proglist_count, recorded_compare); break; case MYTHTV_SORT_ORIGINAL_AIRDATE: /*Default Date Recorded */ - qsort((cmyth_proginfo_t)pl->proglist_list, count, sizeof(pl->proglist_list) , airdate_compare); + qsort((cmyth_proginfo_t)pl->proglist_list, count, pl->proglist_count, airdate_compare); break; default: printf("Unsupported MythTV sort type\n"); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/recorder.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/recorder.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/recorder.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/recorder.c 2014-01-28 20:43:50.000000000 +0000 @@ -185,11 +185,11 @@ snprintf(msg, sizeof(msg), "QUERY_RECORDER %"PRIu32"[]:[]IS_RECORDING", rec->rec_id); - if ((err=cmyth_send_message(rec->rec_conn, msg)) < 0) { + if ((r = cmyth_send_message(rec->rec_conn, msg)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", - __FUNCTION__, err); - ret = err; + __FUNCTION__, r); + ret = r; goto out; } @@ -247,16 +247,16 @@ snprintf(msg, sizeof(msg), "QUERY_RECORDER %"PRIu32"[]:[]GET_FRAMERATE", rec->rec_id); - if ((err=cmyth_send_message(rec->rec_conn, msg)) < 0) { + if ((r = cmyth_send_message(rec->rec_conn, msg)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", - __FUNCTION__, err); - ret = err; + __FUNCTION__, r); + ret = r; goto out; } count = cmyth_rcv_length(rec->rec_conn); - if ((r=cmyth_rcv_string(rec->rec_conn, &err, + if ((r = cmyth_rcv_string(rec->rec_conn, &err, reply, sizeof(reply), count)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_string() failed (%d)\n", @@ -292,7 +292,48 @@ int64_t cmyth_recorder_get_frames_written(cmyth_recorder_t rec) { - return (int64_t) -ENOSYS; + int r, err, count; + int64_t ret; + char msg[256]; + + if (!rec || !rec->rec_conn) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", + __FUNCTION__); + return (int64_t) -EINVAL; + } + + pthread_mutex_lock(&rec->rec_conn->conn_mutex); + + if (rec->rec_conn->conn_version >= 66) + { + snprintf(msg, sizeof(msg), "QUERY_RECORDER %"PRIu32"[]:[]GET_FRAMES_WRITTEN", rec->rec_id); + + if ((r = cmyth_send_message(rec->rec_conn, msg)) < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, + "%s: cmyth_send_message() failed (%d)\n", + __FUNCTION__, r); + ret = r; + goto fail; + } + + count = cmyth_rcv_length(rec->rec_conn); + if ((r = cmyth_rcv_int64(rec->rec_conn, &err, &ret, count)) < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, + "%s: cmyth_rcv_int64() failed (%d)\n", + __FUNCTION__, r); + ret = err; + goto fail; + } + } + else + { + ret = (int64_t) -EPERM; + } + +fail: + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); + + return ret; } /* @@ -318,7 +359,7 @@ } /* - * cmyth_recorder_get_key_frame() + * cmyth_recorder_get_keyframe_pos() * * Scope: PUBLIC * @@ -336,7 +377,48 @@ int64_t cmyth_recorder_get_keyframe_pos(cmyth_recorder_t rec, uint32_t keynum) { - return (int64_t)-ENOSYS; + int r, err, count; + int64_t ret; + char msg[256]; + + if (!rec || !rec->rec_conn) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", + __FUNCTION__); + return (int64_t) -EINVAL; + } + + pthread_mutex_lock(&rec->rec_conn->conn_mutex); + + if (rec->rec_conn->conn_version >= 66) + { + snprintf(msg, sizeof(msg), "QUERY_RECORDER %"PRIu32"[]:[]GET_KEYFRAME_POS[]:[]%"PRIu32, rec->rec_id, keynum); + + if ((r = cmyth_send_message(rec->rec_conn, msg)) < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, + "%s: cmyth_send_message() failed (%d)\n", + __FUNCTION__, r); + ret = r; + goto fail; + } + + count = cmyth_rcv_length(rec->rec_conn); + if ((r = cmyth_rcv_int64(rec->rec_conn, &err, &ret, count)) < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, + "%s: cmyth_rcv_int64() failed (%d)\n", + __FUNCTION__, r); + ret = err; + goto fail; + } + } + else + { + ret = (int64_t) -EPERM; + } + +fail: + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); + + return ret; } /* @@ -352,16 +434,159 @@ * * Return Value: * - * Success: 0 + * Success: A non-NULL, held cmyth_posmap_t + * Failure: A NULL pointer + */ +cmyth_posmap_t +cmyth_recorder_get_position_map(cmyth_recorder_t rec, uint32_t start, uint32_t end) +{ + int err, count, consumed; + cmyth_posmap_t ret = NULL; + char msg[256]; + char tmp[1024]; + + if (!rec || !rec->rec_conn) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", + __FUNCTION__); + return NULL; + } + + pthread_mutex_lock(&rec->rec_conn->conn_mutex); + + if (rec->rec_conn->conn_version >= 43) + { + snprintf(msg, sizeof(msg), "QUERY_RECORDER %"PRIu32"[]:[]FILL_POSITION_MAP[]:[]%"PRIu32"[]:[]%"PRIu32, rec->rec_id, start, end); + + if ((err = cmyth_send_message(rec->rec_conn, msg)) < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, + "%s: cmyth_send_message() failed (%d)\n", + __FUNCTION__, err); + goto fail; + } + + count = cmyth_rcv_length(rec->rec_conn); + if (count < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, + "%s: cmyth_rcv_length() failed (%d)\n", + __FUNCTION__, count); + goto fail; + } + + ret = cmyth_posmap_create(); + if (ret == NULL) { + cmyth_dbg(CMYTH_DBG_ERROR, + "%s: cmyth_posmap_create() failed\n", + __FUNCTION__); + goto fail; + } + + if (count > 2) { + consumed = cmyth_rcv_posmap(rec->rec_conn, &err, ret, count); + count -= consumed; + if (err) { + cmyth_dbg(CMYTH_DBG_ERROR, + "%s: cmyth_rcv_posmap() failed (%d)\n", + __FUNCTION__, err); + ref_release(ret); + ret = NULL; + } + } + err = 0; + while(count > 0 && err == 0) { + consumed = cmyth_rcv_data(rec->rec_conn, &err, (unsigned char*)tmp, sizeof(tmp) - 1, count); + cmyth_dbg(CMYTH_DBG_ERROR, "%s: leftover data: count %i, read %i, errno %i\n", __FUNCTION__, count, consumed, err); + count -= consumed; + } + } + +fail: + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); + + return ret; +} + +/* + * cmyth_recorder_get_duration_map() * - * Failure: -(ERRNO) + * Scope: PUBLIC + * + * Description + * + * Request a list of {keynum, duration} pairs starting at keynum + * 'start' and ending with keynum 'end' from the current recording on + * recorder 'rec'. + * + * Return Value: + * + * Success: A non-NULL, held cmyth_posmap_t + * Failure: A NULL pointer */ cmyth_posmap_t -cmyth_recorder_get_position_map(cmyth_recorder_t rec, - uint32_t start, - uint32_t end) +cmyth_recorder_get_duration_map(cmyth_recorder_t rec, uint32_t start, uint32_t end) { - return NULL; + int err, count, consumed; + cmyth_posmap_t ret = NULL; + char msg[256]; + char tmp[1024]; + + if (!rec || !rec->rec_conn) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", + __FUNCTION__); + return NULL; + } + + pthread_mutex_lock(&rec->rec_conn->conn_mutex); + + if (rec->rec_conn->conn_version >= 77) + { + snprintf(msg, sizeof(msg), "QUERY_RECORDER %"PRIu32"[]:[]FILL_DURATION_MAP[]:[]%"PRIu32"[]:[]%"PRIu32, rec->rec_id, start, end); + + if ((err = cmyth_send_message(rec->rec_conn, msg)) < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, + "%s: cmyth_send_message() failed (%d)\n", + __FUNCTION__, err); + goto fail; + } + + count = cmyth_rcv_length(rec->rec_conn); + if (count < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, + "%s: cmyth_rcv_length() failed (%d)\n", + __FUNCTION__, count); + goto fail; + } + + ret = cmyth_posmap_create(); + if (ret == NULL) { + cmyth_dbg(CMYTH_DBG_ERROR, + "%s: cmyth_posmap_create() failed\n", + __FUNCTION__); + goto fail; + } + + if (count > 2) { + consumed = cmyth_rcv_posmap(rec->rec_conn, &err, ret, count); + count -= consumed; + if (err) { + cmyth_dbg(CMYTH_DBG_ERROR, + "%s: cmyth_rcv_posmap() failed (%d)\n", + __FUNCTION__, err); + ref_release(ret); + ret = NULL; + } + } + err = 0; + while(count > 0 && err == 0) { + consumed = cmyth_rcv_data(rec->rec_conn, &err, (unsigned char*)tmp, sizeof(tmp) - 1, count); + cmyth_dbg(CMYTH_DBG_ERROR, "%s: leftover data: count %i, read %i, errno %i\n", __FUNCTION__, count, consumed, err); + count -= consumed; + } + } + +fail: + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); + + return ret; } /* @@ -455,7 +680,7 @@ if (!rec) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); - return -ENOSYS; + return -EINVAL; } pthread_mutex_lock(&rec->rec_conn->conn_mutex); @@ -514,14 +739,14 @@ pthread_mutex_lock(&rec->rec_conn->conn_mutex); sprintf(Buffer, "QUERY_RECORDER %"PRIu32"[]:[]PAUSE", rec->rec_id); - if ((ret=cmyth_send_message(rec->rec_conn, Buffer)) < 0) { + if ((ret = cmyth_send_message(rec->rec_conn, Buffer)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message('%s') failed\n", __FUNCTION__, Buffer); goto err; } - if ((ret=cmyth_rcv_okay(rec->rec_conn)) < 0) { + if ((ret = cmyth_rcv_okay(rec->rec_conn)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_okay() failed\n", __FUNCTION__); goto err; @@ -616,12 +841,13 @@ int err; int ret = -1; char msg[256]; - cmyth_livetv_chain_t newchain = 0; + cmyth_livetv_chain_t newchain = NULL; + cmyth_livetv_chain_t oldchain = NULL; if (!rec) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); - return -ENOSYS; + return -EINVAL; } pthread_mutex_lock(&rec->rec_conn->conn_mutex); @@ -630,36 +856,38 @@ "QUERY_RECORDER %"PRIu32"[]:[]CHANGE_CHANNEL[]:[]%d", rec->rec_id, direction); - if ((err=cmyth_send_message(rec->rec_conn, msg)) < 0) { + if ((err = cmyth_send_message(rec->rec_conn, msg)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", __FUNCTION__, err); - goto fail; + goto out; } - if ((err=cmyth_rcv_okay(rec->rec_conn)) < 0) { + if ((err = cmyth_rcv_okay(rec->rec_conn)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_okay() failed (%d)\n", __FUNCTION__, err); - goto fail; + goto out; } - if(rec->rec_ring) + if (rec->rec_ring) rec->rec_ring->file_pos = 0; else { - newchain = cmyth_livetv_chain_create(rec->rec_livetv_chain->chainid); - newchain->progs = rec->rec_livetv_chain->progs; - ref_release(rec->rec_livetv_file); - rec->rec_livetv_file = NULL; - ref_release(rec->rec_livetv_chain); + oldchain = rec->rec_livetv_chain; + newchain = cmyth_livetv_chain_create(oldchain->chainid); + newchain->livetv_buflen = oldchain->livetv_buflen; + newchain->livetv_tcp_rcvbuf = oldchain->livetv_tcp_rcvbuf; + newchain->prog_update_callback = oldchain->prog_update_callback; + newchain->chain_switch_on_create = 1; rec->rec_livetv_chain = newchain; } ret = 0; - fail: +out: pthread_mutex_unlock(&rec->rec_conn->conn_mutex); - + if (oldchain) + ref_release(oldchain); return ret; } @@ -689,12 +917,13 @@ int err; int ret = -1; char msg[256]; - cmyth_livetv_chain_t newchain = 0; + cmyth_livetv_chain_t newchain = NULL; + cmyth_livetv_chain_t oldchain = NULL; if (!rec) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); - return -ENOSYS; + return -EINVAL; } pthread_mutex_lock(&rec->rec_conn->conn_mutex); @@ -703,36 +932,38 @@ "QUERY_RECORDER %"PRIu32"[]:[]SET_CHANNEL[]:[]%s", rec->rec_id, channame); - if ((err=cmyth_send_message(rec->rec_conn, msg)) < 0) { + if ((err = cmyth_send_message(rec->rec_conn, msg)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", __FUNCTION__, err); - goto fail; + goto out; } - if ((err=cmyth_rcv_okay(rec->rec_conn)) < 0) { + if ((err = cmyth_rcv_okay(rec->rec_conn)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_okay() failed (%d)\n", __FUNCTION__, err); - goto fail; + goto out; } - if(rec->rec_ring) + if (rec->rec_ring) rec->rec_ring->file_pos = 0; else { - newchain = cmyth_livetv_chain_create(rec->rec_livetv_chain->chainid); - newchain->progs = rec->rec_livetv_chain->progs; - ref_release(rec->rec_livetv_file); - rec->rec_livetv_file = NULL; - ref_release(rec->rec_livetv_chain); + oldchain = rec->rec_livetv_chain; + newchain = cmyth_livetv_chain_create(oldchain->chainid); + newchain->livetv_buflen = oldchain->livetv_buflen; + newchain->livetv_tcp_rcvbuf = oldchain->livetv_tcp_rcvbuf; + newchain->prog_update_callback = oldchain->prog_update_callback; + newchain->chain_switch_on_create = 1; rec->rec_livetv_chain = newchain; } ret = 0; - fail: +out: pthread_mutex_unlock(&rec->rec_conn->conn_mutex); - + if (oldchain) + ref_release(oldchain); return ret; } @@ -895,14 +1126,14 @@ "QUERY_RECORDER %"PRIu32"[]:[]CHECK_CHANNEL[]:[]%s", rec->rec_id, channame); - if ((err=cmyth_send_message(rec->rec_conn, msg)) < 0) { + if ((err = cmyth_send_message(rec->rec_conn, msg)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", __FUNCTION__, err); goto fail; } - if ((err=cmyth_rcv_feedback(rec->rec_conn, "1")) < 0) { + if ((err = cmyth_rcv_feedback(rec->rec_conn, "1", 1)) < 0) { ret = 0; goto fail; } @@ -978,14 +1209,14 @@ } pthread_mutex_lock(&rec->rec_conn->conn_mutex); - if(rec->rec_conn->conn_version >= 26) + if (rec->rec_conn->conn_version >= 26) snprintf(msg, sizeof(msg), "QUERY_RECORDER %"PRIu32"[]:[]GET_CURRENT_RECORDING", rec->rec_id); else snprintf(msg, sizeof(msg), "QUERY_RECORDER %"PRIu32"[]:[]GET_PROGRAM_INFO", rec->rec_id); - if ((err=cmyth_send_message(rec->rec_conn, msg)) < 0) { + if ((err = cmyth_send_message(rec->rec_conn, msg)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", __FUNCTION__, err); @@ -996,7 +1227,7 @@ count = cmyth_rcv_length(rec->rec_conn); - if(rec->rec_conn->conn_version >= 26) + if (rec->rec_conn->conn_version >= 26) ct = cmyth_rcv_proginfo(rec->rec_conn, &err, proginfo, count); else ct = cmyth_rcv_chaninfo(rec->rec_conn, &err, proginfo, count); @@ -1088,7 +1319,7 @@ cmyth_browsedir_t direction) { int err, count; - int ret = -ENOSYS; + int ret = -1; char msg[256]; char title[256], subtitle[256], desc[256], category[256]; char callsign[256], iconpath[256]; @@ -1101,7 +1332,7 @@ if (!rec) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); - return -ENOSYS; + return -EINVAL; } control = rec->rec_conn; @@ -1118,7 +1349,7 @@ rec->rec_id, cur_prog->proginfo_channame, cur_prog->proginfo_chanId, direction, date); - if ((err=cmyth_send_message(control, msg)) < 0) { + if ((err = cmyth_send_message(control, msg)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", __FUNCTION__, err); @@ -1348,7 +1579,7 @@ if (!rec) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); - return -ENOSYS; + return -EINVAL; } pthread_mutex_lock(&rec->rec_conn->conn_mutex); @@ -1356,14 +1587,14 @@ snprintf(msg, sizeof(msg), "QUERY_RECORDER %"PRIu32"[]:[]SPAWN_LIVETV", rec->rec_id); - if ((err=cmyth_send_message(rec->rec_conn, msg)) < 0) { + if ((err = cmyth_send_message(rec->rec_conn, msg)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", __FUNCTION__, err); goto fail; } - if ((err=cmyth_rcv_okay(rec->rec_conn)) < 0) { + if ((err = cmyth_rcv_okay(rec->rec_conn)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_okay() failed (%d)\n", __FUNCTION__, err); @@ -1392,7 +1623,7 @@ if (!rec) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); - return -ENOSYS; + return -EINVAL; } pthread_mutex_lock(&rec->rec_conn->conn_mutex); @@ -1406,7 +1637,7 @@ strftime(datestr, 32, "%Y-%m-%dT%H:%M:%S", localtime(&t)); /* Now build the SPAWN_LIVETV message */ - if(rec->rec_conn->conn_version >= 34 && channame) + if (rec->rec_conn->conn_version >= 34 && channame) snprintf(msg, sizeof(msg), "QUERY_RECORDER %"PRIu32"[]:[]SPAWN_LIVETV[]:[]live-%s-%s[]:[]%d[]:[]%s", rec->rec_id, myhostname, datestr, 0, channame); @@ -1415,14 +1646,14 @@ "QUERY_RECORDER %"PRIu32"[]:[]SPAWN_LIVETV[]:[]live-%s-%s[]:[]%d", rec->rec_id, myhostname, datestr, 0); - if ((err=cmyth_send_message(rec->rec_conn, msg)) < 0) { + if ((err = cmyth_send_message(rec->rec_conn, msg)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", __FUNCTION__, err); goto fail; } - if ((err=cmyth_rcv_okay(rec->rec_conn)) < 0) { + if ((err = cmyth_rcv_okay(rec->rec_conn)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_okay() failed (%d)\n", __FUNCTION__, err); @@ -1451,7 +1682,7 @@ if (!rec) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); - return -ENOSYS; + return -EINVAL; } pthread_mutex_lock(&rec->rec_conn->conn_mutex); @@ -1459,14 +1690,14 @@ snprintf(msg, sizeof(msg), "QUERY_RECORDER %"PRIu32"[]:[]STOP_LIVETV", rec->rec_id); - if ((err=cmyth_send_message(rec->rec_conn, msg)) < 0) { + if ((err = cmyth_send_message(rec->rec_conn, msg)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", __FUNCTION__, err); goto fail; } - if ((err=cmyth_rcv_okay(rec->rec_conn)) < 0) { + if ((err = cmyth_rcv_okay(rec->rec_conn)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_okay() failed (%d)\n", __FUNCTION__, err); @@ -1491,10 +1722,10 @@ if (!rec) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); - return -ENOSYS; + return -EINVAL; } - if(rec->rec_conn->conn_version >= 26) + if (rec->rec_conn->conn_version >= 26) return 0; pthread_mutex_lock(&rec->rec_conn->conn_mutex); @@ -1502,14 +1733,14 @@ snprintf(msg, sizeof(msg), "QUERY_RECORDER %"PRIu32"[]:[]DONE_RINGBUF", rec->rec_id); - if ((err=cmyth_send_message(rec->rec_conn, msg)) < 0) { + if ((err = cmyth_send_message(rec->rec_conn, msg)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", __FUNCTION__, err); goto fail; } - if ((err=cmyth_rcv_okay(rec->rec_conn)) < 0) { + if ((err = cmyth_rcv_okay(rec->rec_conn)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_okay() failed (%d)\n", __FUNCTION__, err); @@ -1606,3 +1837,49 @@ return rec->rec_id; } + +int +cmyth_recorder_set_live_recording(cmyth_recorder_t rec, uint8_t recording) +{ + int err; + int ret = -1; + char msg[256]; + + if (!rec) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", + __FUNCTION__); + return -ENOSYS; + } + + pthread_mutex_lock(&rec->rec_conn->conn_mutex); + + if (rec->rec_conn->conn_version >= 26) + { + snprintf(msg, sizeof(msg), "QUERY_RECORDER %d[]:[]SET_LIVE_RECORDING[]:[]%u", rec->rec_id, recording); + + if ((err=cmyth_send_message(rec->rec_conn, msg)) < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, + "%s: cmyth_send_message() failed (%d)\n", + __FUNCTION__, err); + goto fail; + } + + if ((err=cmyth_rcv_okay(rec->rec_conn)) < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, + "%s: cmyth_rcv_okay() failed (%d)\n", + __FUNCTION__, err); + goto fail; + } + + ret = recording; + } + else + { + ret = -EPERM; + } + +fail: + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); + + return ret; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/recordingrule.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/recordingrule.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/recordingrule.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/recordingrule.c 2014-01-28 20:43:50.000000000 +0000 @@ -55,6 +55,10 @@ ref_release(rr->description); if (rr->category) ref_release(rr->category); + if (rr->subtitle) + ref_release(rr->subtitle); + if (rr->callsign) + ref_release(rr->callsign); if (rr->recgroup) ref_release(rr->recgroup); if (rr->storagegroup) @@ -69,6 +73,10 @@ ref_release(rr->profile); if (rr->inetref) ref_release(rr->inetref); + if (rr->programid) + ref_release(rr->programid); + if (rr->seriesid) + ref_release(rr->seriesid); } /* @@ -102,21 +110,7 @@ } ref_set_destroy(ret, (ref_destroy_t)cmyth_recordingrule_destroy); - ret->starttime = cmyth_timestamp_create(); - if (!ret->starttime) { - cmyth_dbg(CMYTH_DBG_DEBUG, "%s: cmyth_timestamp_create() failed\n", __FUNCTION__); - goto err; - } - ret->endtime = cmyth_timestamp_create(); - if (!ret->endtime) { - cmyth_dbg(CMYTH_DBG_DEBUG, "%s: cmyth_timestamp_create() failed\n", __FUNCTION__); - goto err; - } return ret; - - err: - ref_release(ret); - return NULL; } /* @@ -223,7 +217,7 @@ cmyth_recordingrule_set_endtime(rr, 0); cmyth_recordingrule_set_title(rr, ""); cmyth_recordingrule_set_description(rr, ""); - cmyth_recordingrule_set_type(rr, RRULE_DONT_RECORD); + cmyth_recordingrule_set_type(rr, RRULE_NOT_RECORDING); cmyth_recordingrule_set_category(rr, ""); cmyth_recordingrule_set_subtitle(rr, ""); cmyth_recordingrule_set_recpriority(rr, 0); @@ -243,8 +237,11 @@ cmyth_recordingrule_set_maxepisodes(rr, 0); cmyth_recordingrule_set_maxnewest(rr, 0); cmyth_recordingrule_set_transcoder(rr, 0); - cmyth_recordingrule_set_profile(rr, "Default"); + cmyth_recordingrule_set_parentid(rr, 0); + cmyth_recordingrule_set_profile(rr, "Default"); cmyth_recordingrule_set_prefinput(rr, 0); + cmyth_recordingrule_set_programid(rr, ""); + cmyth_recordingrule_set_seriesid(rr, ""); cmyth_recordingrule_set_autometadata(rr, 0); cmyth_recordingrule_set_inetref(rr, ""); cmyth_recordingrule_set_season(rr, 0); @@ -252,6 +249,69 @@ cmyth_recordingrule_set_filter(rr, 0); return rr; } +/* + * cmyth_recordingrule_dup() + * + * Scope: PUBLIC + * + * Description + * + * Duplicate a recording rule. + * Before forgetting the reference to this recording schedule structure + * the caller must call ref_release(). + * + * Return Value: + * + * Success: A non-NULL cmyth_recordingrule_t (this type is a pointer) + * + * Failure: NULL + */ +cmyth_recordingrule_t +cmyth_recordingrule_dup(cmyth_recordingrule_t rule) { + cmyth_recordingrule_t rr = cmyth_recordingrule_create(); + if (!rr) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_recordingrule_create failed\n", __FUNCTION__); + return NULL; + } + cmyth_recordingrule_set_recordid(rr, rule->recordid); + cmyth_recordingrule_set_chanid(rr, rule->chanid); + cmyth_recordingrule_set_callsign(rr, rule->callsign); + cmyth_recordingrule_set_starttime(rr, cmyth_timestamp_to_unixtime(rule->starttime)); + cmyth_recordingrule_set_endtime(rr, cmyth_timestamp_to_unixtime(rule->endtime)); + cmyth_recordingrule_set_title(rr, rule->title); + cmyth_recordingrule_set_description(rr, rule->description); + cmyth_recordingrule_set_type(rr, rule->type); + cmyth_recordingrule_set_category(rr, rule->category); + cmyth_recordingrule_set_subtitle(rr, rule->subtitle); + cmyth_recordingrule_set_recpriority(rr, rule->recpriority); + cmyth_recordingrule_set_startoffset(rr, rule->startoffset); + cmyth_recordingrule_set_endoffset(rr, rule->endoffset); + cmyth_recordingrule_set_searchtype(rr, rule->searchtype); + cmyth_recordingrule_set_inactive(rr, rule->inactive); + cmyth_recordingrule_set_dupmethod(rr, rule->dupmethod); + cmyth_recordingrule_set_dupin(rr, rule->dupin); + cmyth_recordingrule_set_recgroup(rr, rule->recgroup); + cmyth_recordingrule_set_storagegroup(rr, rule->storagegroup); + cmyth_recordingrule_set_playgroup(rr, rule->playgroup); + cmyth_recordingrule_set_autotranscode(rr, rule->autotranscode); + cmyth_recordingrule_set_userjobs(rr, rule->userjobs); + cmyth_recordingrule_set_autocommflag(rr, rule->autocommflag); + cmyth_recordingrule_set_autoexpire(rr, rule->autoexpire); + cmyth_recordingrule_set_maxepisodes(rr, rule->maxepisodes); + cmyth_recordingrule_set_maxnewest(rr, rule->maxnewest); + cmyth_recordingrule_set_transcoder(rr, rule->transcoder); + cmyth_recordingrule_set_parentid(rr, rule->parentid); + cmyth_recordingrule_set_profile(rr, rule->profile); + cmyth_recordingrule_set_prefinput(rr, rule->prefinput); + cmyth_recordingrule_set_programid(rr, rule->programid); + cmyth_recordingrule_set_seriesid(rr, rule->seriesid); + cmyth_recordingrule_set_autometadata(rr, rule->autometadata); + cmyth_recordingrule_set_inetref(rr, rule->inetref); + cmyth_recordingrule_set_season(rr, rule->season); + cmyth_recordingrule_set_episode(rr, rule->episode); + cmyth_recordingrule_set_filter(rr, rule->filter); + return rr; +} uint32_t cmyth_recordingrule_recordid(cmyth_recordingrule_t rr) @@ -678,6 +738,21 @@ rr->transcoder = transcoder; } +uint32_t +cmyth_recordingrule_parentid(cmyth_recordingrule_t rr) +{ + if (!rr) { + return 0; + } + return rr->parentid; +} + +void +cmyth_recordingrule_set_parentid(cmyth_recordingrule_t rr, uint32_t parentid) +{ + rr->parentid = parentid; +} + char * cmyth_recordingrule_profile(cmyth_recordingrule_t rr) { @@ -710,6 +785,40 @@ rr->prefinput = prefinput; } +char * +cmyth_recordingrule_programid(cmyth_recordingrule_t rr) +{ + if (!rr) { + return NULL; + } + return ref_hold(rr->programid); +} + +void +cmyth_recordingrule_set_programid(cmyth_recordingrule_t rr, char *programid) +{ + if (rr->programid) + ref_release(rr->programid); + rr->programid = ref_strdup(programid); +} + +char * +cmyth_recordingrule_seriesid(cmyth_recordingrule_t rr) +{ + if (!rr) { + return NULL; + } + return ref_hold(rr->seriesid); +} + +void +cmyth_recordingrule_set_seriesid(cmyth_recordingrule_t rr, char *seriesid) +{ + if (rr->seriesid) + ref_release(rr->seriesid); + rr->seriesid = ref_strdup(seriesid); +} + uint8_t cmyth_recordingrule_autometadata(cmyth_recordingrule_t rr) { diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/ringbuf.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/ringbuf.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/ringbuf.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/ringbuf.c 2014-01-04 10:28:12.000000000 +0000 @@ -122,7 +122,7 @@ cmyth_recorder_t cmyth_ringbuf_setup(cmyth_recorder_t rec) { - static const char service[]="rbuf://"; + static const char service[] = "rbuf://"; cmyth_recorder_t new_rec = NULL; char *host = NULL; char *port = NULL; @@ -138,8 +138,7 @@ cmyth_conn_t control; if (!rec) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", - __FUNCTION__); + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); return NULL; } @@ -151,7 +150,7 @@ "QUERY_RECORDER %"PRIu32"[]:[]SETUP_RING_BUFFER[]:[]0", rec->rec_id); - if ((err=cmyth_send_message(control, msg)) < 0) { + if ((err = cmyth_send_message(control, msg)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", __FUNCTION__, err); @@ -167,7 +166,7 @@ r = cmyth_rcv_string(control, &err, url, sizeof(url)-1, count); count -= r; - if ((r=cmyth_rcv_int64(control, &err, &size, count)) < 0) { + if ((r = cmyth_rcv_int64(control, &err, &size, count)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_length() failed (%d)\n", __FUNCTION__, r); @@ -175,7 +174,7 @@ } count -= r; - if ((r=cmyth_rcv_int64(control, &err, &fill, count)) < 0) { + if ((r = cmyth_rcv_int64(control, &err, &fill, count)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_length() failed (%d)\n", __FUNCTION__, r); @@ -245,7 +244,12 @@ char * cmyth_ringbuf_pathname(cmyth_recorder_t rec) { - return ref_hold(rec->rec_ring->ringbuf_url); + if (!rec) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); + return NULL; + } + + return ref_hold(rec->rec_ring->ringbuf_url); } /* @@ -261,7 +265,7 @@ * * Success: number of bytes read into buf * - * Failure: -1 + * Failure: an int containing -errno */ int32_t cmyth_ringbuf_get_block(cmyth_recorder_t rec, char *buf, int32_t len) @@ -269,8 +273,10 @@ struct timeval tv; fd_set fds; - if (rec == NULL) - return -EINVAL; + if (!rec) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); + return (int32_t) -EINVAL; + } if(len > rec->rec_ring->conn_data->conn_tcp_rcvbuf) len = rec->rec_ring->conn_data->conn_tcp_rcvbuf; @@ -295,8 +301,11 @@ fd_set fds; int ret; cmyth_socket_t fd; - if (rec == NULL) + + if (!rec) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); return -EINVAL; + } fd = rec->rec_ring->conn_data->conn_fd; @@ -339,9 +348,8 @@ char msg[256]; if (!rec) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", - __FUNCTION__); - return -EINVAL; + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); + return (int32_t) -EINVAL; } pthread_mutex_lock(&rec->rec_conn->conn_mutex); @@ -353,11 +361,11 @@ "QUERY_RECORDER %"PRIu32"[]:[]REQUEST_BLOCK_RINGBUF[]:[]%"PRId32, rec->rec_id, len); - if ((err = cmyth_send_message(rec->rec_conn, msg)) < 0) { + if ((r = cmyth_send_message(rec->rec_conn, msg)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", - __FUNCTION__, err); - ret = err; + __FUNCTION__, r); + ret = r; goto out; } @@ -394,7 +402,8 @@ * * Failure: an int containing -errno */ -int32_t cmyth_ringbuf_read(cmyth_recorder_t rec, char *buf, int32_t len) +int32_t +cmyth_ringbuf_read(cmyth_recorder_t rec, char *buf, int32_t len) { int err, count; int ret, req, nfds; @@ -403,11 +412,9 @@ struct timeval tv; fd_set fds; - if (!rec) - { - cmyth_dbg (CMYTH_DBG_ERROR, "%s: no connection\n", - __FUNCTION__); - return -EINVAL; + if (!rec) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); + return (int32_t) -EINVAL; } pthread_mutex_lock (&rec->rec_conn->conn_mutex); @@ -542,8 +549,10 @@ int64_t c, ret; cmyth_ringbuf_t ring; - if (rec == NULL) - return -EINVAL; + if (!rec) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); + return (int64_t) -EINVAL; + } ring = rec->rec_ring; @@ -561,16 +570,16 @@ (int32_t)(ring->file_pos >> 32), (int32_t)(ring->file_pos & 0xffffffff)); - if ((err = cmyth_send_message(rec->rec_conn, msg)) < 0) { + if ((r = cmyth_send_message(rec->rec_conn, msg)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", - __FUNCTION__, err); - ret = err; + __FUNCTION__, r); + ret = r; goto out; } count = cmyth_rcv_length(rec->rec_conn); - if ((r=cmyth_rcv_int64(rec->rec_conn, &err, &c, count)) < 0) { + if ((r = cmyth_rcv_int64(rec->rec_conn, &err, &c, count)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_length() failed (%d)\n", __FUNCTION__, r); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/socket.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/socket.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/socket.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/socket.c 2014-01-28 20:43:50.000000000 +0000 @@ -236,7 +236,7 @@ tv.tv_usec = 0; FD_ZERO(&fds); FD_SET(conn->conn_fd, &fds); - if ((r=select((int)conn->conn_fd+1, &fds, NULL, NULL, &tv)) == 0) { + if ((r = select((int)conn->conn_fd+1, &fds, NULL, NULL, &tv)) == 0) { conn->conn_hang = 1; return -ETIMEDOUT; } else if (r > 0) { @@ -248,7 +248,7 @@ cmyth_dbg(CMYTH_DBG_ERROR, "%s: read failed (%d)\n", __FUNCTION__, errno); - conn->conn_hang = 1; + conn->conn_hang = 1; if ( r == 0 ) return -1 * EBADF; else @@ -651,9 +651,9 @@ "%s: did not consume everything\n", __FUNCTION__); while(count > 0 && err == 0) { - consumed = cmyth_rcv_string(conn, &err, tmp, sizeof(tmp) - 1, count); + consumed = cmyth_rcv_data(conn, &err, (unsigned char*)tmp, sizeof(tmp) - 1, count); + cmyth_dbg(CMYTH_DBG_DEBUG, "%s: leftover data: count %i, read %i, errno %i\n", __FUNCTION__, count, consumed, err); count -= consumed; - cmyth_dbg(CMYTH_DBG_DEBUG, "%s: leftover data %s\n", __FUNCTION__, tmp); } } return ret; @@ -677,7 +677,7 @@ * Failure: -(errno) */ int -cmyth_rcv_feedback(cmyth_conn_t conn, char *fb) +cmyth_rcv_feedback(cmyth_conn_t conn, char *fb, int fblen) { int count, consumed; char buf[8]; @@ -697,7 +697,7 @@ return -err; } count -= consumed; - ret = (strncmp(buf, fb, sizeof(fb)) == 0) ? 0 : -1; + ret = (strncmp(buf, fb, fblen) == 0) ? 0 : -1; if (count > 0) { cmyth_dbg(CMYTH_DBG_INFO, "%s: did not consume everything\n", @@ -1268,8 +1268,8 @@ /* * Allow for the timestamp to be empty in the case of livetv */ - if ((strlen(tbuf) == 1) && (tbuf[0] = ' ')) - return consumed; + if ((strlen(tbuf) == 1) && (tbuf[0] == ' ')) + return consumed; if (strlen(tbuf) == 0) return consumed; @@ -1584,6 +1584,22 @@ } } + if (buf->proginfo_version >= 76) { + /* + * Get proginfo_syndicated_episode (string) + */ + consumed = cmyth_rcv_string(conn, err, tmp_str, sizeof(tmp_str) - 1, count); + count -= consumed; + total += consumed; + if (*err) { + failed = "cmyth_rcv_string"; + goto fail; + } + if (buf->proginfo_syndicated_episode) + ref_release(buf->proginfo_syndicated_episode); + buf->proginfo_syndicated_episode = ref_strdup(tmp_str); + } + /* * Get proginfo_category (string) */ @@ -1853,7 +1869,7 @@ /* * Get proginfo_rec_priority (byte) */ - consumed = cmyth_rcv_int8(conn, err, + consumed = cmyth_rcv_int32(conn, err, &buf->proginfo_rec_priority, count); count -= consumed; total += consumed; @@ -2195,7 +2211,7 @@ /* * Get proginfo_recpriority_2 (byte) */ - consumed = cmyth_rcv_int8(conn, err, + consumed = cmyth_rcv_int32(conn, err, &buf->proginfo_recpriority_2, count); count -= consumed; @@ -2278,6 +2294,26 @@ } } + if (buf->proginfo_version >= 76) { + /* + * Get partnumber and parttotal + */ + consumed = cmyth_rcv_uint16(conn, err, &buf->proginfo_partnumber, count); + count -= consumed; + total += consumed; + if (*err) { + failed = "cmyth_rcv_ushort proginfo_partnumber"; + goto fail; + } + consumed = cmyth_rcv_uint16(conn, err, &buf->proginfo_parttotal, count); + count -= consumed; + total += consumed; + if (*err) { + failed = "cmyth_rcv_ushort proginfo_parttotal"; + goto fail; + } + } + cmyth_dbg(CMYTH_DBG_INFO, "%s: got recording info\n", __FUNCTION__); cmyth_proginfo_parse_url(buf); @@ -2691,15 +2727,121 @@ int count) { int tmp_err; + int consumed; + int total = 0; + char *failed = NULL; if (!err) { err = &tmp_err; } + if (count <= 0) { + *err = EINVAL; + return 0; + } + if(!buf) { + *err = EINVAL; + cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL buffer\n", __FUNCTION__); + return 0; + } + + *err = 0; + /* - * For now this is unimplemented. + * Get frame number (uint32) */ - *err = ENOSYS; - return 0; + consumed = cmyth_rcv_uint32(conn, err, &(buf->keyframe_number), count); + count -= consumed; + total += consumed; + if (*err) { + failed = "cmyth_rcv_uint32"; + goto fail; + } + + /* + * Get position (int64) + */ + consumed = cmyth_rcv_int64(conn, err, &(buf->keyframe_pos) , count); + count -= consumed; + total += consumed; + if (*err) { + failed = "cmyth_rcv_int64"; + goto fail; + } + + return total; + +fail: + cmyth_dbg(CMYTH_DBG_ERROR, "%s: %s() failed (%d) (count = %d)\n", + __FUNCTION__, failed, *err, count); + return total; +} + +int +cmyth_rcv_posmap(cmyth_conn_t conn, int *err, cmyth_posmap_t buf, + int count) +{ + int tmp_err; + int consumed = 0; + int r; + int c; + cmyth_keyframe_t kf; + int i; + void *ptr; + + cmyth_dbg(CMYTH_DBG_DEBUG, "%s\n", __FUNCTION__); + if (!err) { + err = &tmp_err; + } + if (count <= 0) { + *err = EINVAL; + return 0; + } + if(!buf) { + *err = EINVAL; + cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL buffer\n", __FUNCTION__); + return 0; + } + + *err = 0; + c = i = 0; + + while (count > 0) { + kf = cmyth_keyframe_create(); + if (!kf) { + cmyth_dbg(CMYTH_DBG_ERROR, + "%s: cmyth_keyframe_create() failed\n", + __FUNCTION__); + *err = ENOMEM; + break; + } + r = cmyth_rcv_keyframe(conn, err, kf, count); + consumed += r; + count -= r; + if (*err) { + ref_release(kf); + cmyth_dbg(CMYTH_DBG_ERROR, + "%s: cmyth_rcv_keyframe() failed (%d)\n", + __FUNCTION__, *err); + break; + } + + if (c <= i) { + c += 100; + ptr = realloc(buf->posmap_list, c * sizeof(cmyth_keyframe_t)); + if (!ptr) { + ref_release(kf); + *err = ENOMEM; + cmyth_dbg(CMYTH_DBG_ERROR, + "%s: %s: realloc() failed for list\n", + __FUNCTION__, *err); + break; + } + buf->posmap_list = ptr; + } + buf->posmap_list[i++] = kf; + buf->posmap_count = i; + } + return consumed; } /* @@ -2848,90 +2990,116 @@ } /* - * cmyth_rcv_data(cmyth_conn_t conn, int *err, unsigned char *buf, int count) + * cmyth_rcv_data(cmyth_conn_t conn, int *err, unsigned char *buf, int buflen, int count) * * Scope: PRIVATE (mapped to __cmyth_rcv_data) * * Description * * Receive raw data from the socket specified by 'conn' and place it - * in 'buf'. This function consumes 'count' bytes and places them in - * 'buf'. If an error is encountered and 'err' is not NULL, an + * in 'buf'. This function consumes 'count' bytes and places them in + * 'buf'. If an error is encountered and 'err' is not NULL, an * indication of the nature of the error will be recorded by placing * an error code in the location pointed to by 'err'. If all goes - * well, 'err' wil be set to 0. + * well, 'err' will be set to 0. * * Return Value: * * A value >=0 indicating the number of bytes consumed. */ int -cmyth_rcv_data(cmyth_conn_t conn, int *err, unsigned char *buf, int count) +cmyth_rcv_data(cmyth_conn_t conn, int *err, unsigned char *buf, int buflen, int count) { - int r; - int total = 0; - unsigned char *p; - int tmp_err; - struct timeval tv; - fd_set fds; + int consumed = 0; + int placed = 0; + int tmp; if (!err) { - err = &tmp_err; + err = &tmp; } - if (count <= 0) { + + if (count < 0) { + /* + * Data is terminated at the end of the payload. If the last data + * requested in the payload is empty, count will be zero. + * In this case we should return an empty buffer rather than an error. + */ *err = EINVAL; return 0; } - *err = 0; + if (!conn) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", __FUNCTION__); - *err = EINVAL; + *err = EBADF; return 0; } - p = buf; - while (count > 0) { - tv.tv_sec = 10; - tv.tv_usec = 0; - FD_ZERO(&fds); - FD_SET(conn->conn_fd, &fds); - if (select((int)conn->conn_fd+1, &fds, NULL, NULL, &tv) == 0) { - conn->conn_hang = 1; - return -ETIMEDOUT; - } else { - conn->conn_hang = 0; + + if (conn->conn_fd < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: not connected\n", + __FUNCTION__); + *err = EBADF; + return 0; + } + + if (!conn->conn_buf) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection buffer\n", + __FUNCTION__); + *err = EBADF; + return 0; + } + + if (!buf) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: no output buffer\n", + __FUNCTION__); + *err = EBADF; + return 0; + } + + while (1) { + if (consumed >= count) { + /* + * We have consumed all the characters we were + * asked to from the stream. Force a refill + * on the next call, and return 'consumed'. + */ + conn->conn_pos = conn->conn_len = 0; + break; } - r = recv(conn->conn_fd, p, count, 0); - if (r < 0) { - if (total == 0) { - cmyth_dbg(CMYTH_DBG_ERROR, - "%s: read failed (%d)\n", - __FUNCTION__, errno); - conn->conn_hang = 1; - if (r == 0) - *err = -1 * EBADF; - else - *err = -1 * errno; - return 0; + + if (conn->conn_pos >= conn->conn_len) { + /* + * We run out of (or never had any) bytes + * from the connection. Refill the buffer. + */ + *err = cmyth_conn_refill(conn, count - consumed); + if (*err < 0) { + *err = -1 * (*err); + break; } + } + + if (placed < buflen) { /* - * There were bytes read before the error, use them and - * then report the error next time. + * This character goes in the output buffer, + * put it there. */ - break; + buf[placed++] = conn->conn_buf[conn->conn_pos]; } - total += r; - count -= r; - p += r; + ++conn->conn_pos; + ++consumed; } - return total; + buf[placed] = '\0'; + cmyth_dbg(CMYTH_DBG_PROTO, "%s: data received '%s'\n", + __FUNCTION__, buf); + return consumed; } void cmyth_toupper_string(char *str) { + size_t i; if (str) { - int i; - for ( i=0 ; i < sizeof(str) && str[i] != '\0' ; i++ ) { + for (i=0 ; i < sizeof(str) && str[i] != '\0' ; i++) { str[i] = toupper(str[i]); } } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/storagegroup.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/storagegroup.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/storagegroup.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/storagegroup.c 2014-01-04 10:28:12.000000000 +0000 @@ -105,12 +105,12 @@ if (!control) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", __FUNCTION__); - return -1; + return -EINVAL; } if (!file) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no file specified\n", __FUNCTION__); - return -1; + return -EINVAL; } snprintf(msg, sizeof(msg), "QUERY_SG_FILEQUERY[]:[]%s[]:[]%s[]:[]%s", file->hostname , file->storagegroup, file->filename); @@ -118,7 +118,7 @@ err = cmyth_send_message(control, msg); if (err < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", __FUNCTION__, err); - return -1; + return err; } count = cmyth_rcv_length(control); @@ -165,14 +165,14 @@ int err = 0; int i = 0; int listsize = 10; - cmyth_storagegroup_filelist_t ret = 0; - cmyth_storagegroup_file_t file = 0; + cmyth_storagegroup_filelist_t ret = NULL; + cmyth_storagegroup_file_t file = NULL; int consumed = 0; /* = profiles; */ char tmp_str[32768]; if (!control) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", __FUNCTION__); - return 0; + return NULL; } pthread_mutex_lock(&control->conn_mutex); @@ -195,8 +195,6 @@ if (!ret) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: alloc() failed for list\n", __FUNCTION__); - ref_release(ret); - ret = 0; goto out; } @@ -205,7 +203,7 @@ if (!ret->storagegroup_filelist_list) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: alloc() failed for filelist list\n", __FUNCTION__); ref_release(ret); - ret = 0; + ret = NULL; goto out; } while (count) { @@ -214,7 +212,7 @@ if (err) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_rcv_string() failed (%d)\n", __FUNCTION__, count); ref_release(ret); - ret = 0; + ret = NULL; goto out; } if (res>listsize-1) @@ -224,7 +222,7 @@ if (!ret->storagegroup_filelist_list) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: realloc() failed for filelist list\n", __FUNCTION__); ref_release(ret); - ret = 0; + ret = NULL; goto out; } } @@ -270,7 +268,7 @@ } cmyth_storagegroup_file_t -cmyth_storagegroup_get_fileinfo(cmyth_conn_t control, char *storagegroup, char *hostname, char *filename) +cmyth_storagegroup_get_fileinfo(cmyth_conn_t control, char *hostname, char *storagegroup, char *filename) { char msg[256]; int count = 0; @@ -307,7 +305,7 @@ ret = NULL; goto out; } else if (count == 0) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: QUERY_SG_FILEQUERY failed(%s)\n", __FUNCTION__, tmp_str); + cmyth_dbg(CMYTH_DBG_WARN, "%s: QUERY_SG_FILEQUERY failed(%s)\n", __FUNCTION__, tmp_str); ret = NULL; goto out; } @@ -372,4 +370,4 @@ return 0; } return file->size; -} \ No newline at end of file +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/timestamp.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/timestamp.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/libcmyth/timestamp.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/timestamp.c 2014-01-04 10:28:12.000000000 +0000 @@ -61,6 +61,7 @@ ret->timestamp_minute = 0; ret->timestamp_second = 0; ret->timestamp_isdst = -1; + ret->timestamp_isutc = 0; return ret; } @@ -86,15 +87,16 @@ cmyth_timestamp_from_string(const char *str) { cmyth_timestamp_t ret; - unsigned int i; - int datetime = 1; + int i; + int format = 2; char *yyyy; char *MM; char *dd; char *hh; char *mm; char *ss; - char buf[CMYTH_TIMESTAMP_LEN + 1]; + char buf[CMYTH_TIMESTAMP_UTC_LEN + 1]; + int len; if (!str) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL string\n", __FUNCTION__); @@ -108,6 +110,7 @@ hh = buf + 11; mm = buf + 14; ss = buf + 17; + len = strlen(buf); ret = cmyth_timestamp_create(); if (!ret) { @@ -115,24 +118,37 @@ __FUNCTION__); return NULL; } - if (strlen(buf) != CMYTH_TIMESTAMP_LEN) { - datetime = 0; - if (strlen(buf) != CMYTH_DATESTAMP_LEN) { - cmyth_dbg(CMYTH_DBG_ERROR, - "%s: string is not a timestamp '%s'\n", - __FUNCTION__, buf); - goto err; + + ret->timestamp_isutc = 1; + if (len != CMYTH_TIMESTAMP_UTC_LEN) { + format = 1; + ret->timestamp_isutc = 0; + if (len != CMYTH_TIMESTAMP_LEN) { + format = 0; + if (len != CMYTH_DATESTAMP_LEN) { + cmyth_dbg(CMYTH_DBG_ERROR, + "%s: string is not a timestamp '%s'\n", + __FUNCTION__, buf); + goto err; + } } } - if ((datetime == 1) && + if ((format == 2) && + ((buf[4] != '-') || (buf[7] != '-') || (buf[10] != 'T') || + (buf[13] != ':') || (buf[16] != ':') || (buf[19] != 'Z'))) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: string is badly formed '%s'\n", + __FUNCTION__, buf); + goto err; + } + if ((format == 1) && ((buf[4] != '-') || (buf[7] != '-') || (buf[10] != 'T') || (buf[13] != ':') || (buf[16] != ':'))) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: string is badly formed '%s'\n", __FUNCTION__, buf); goto err; } - if ((datetime == 0) && + if ((format == 0) && ((buf[4] != '-') || (buf[7] != '-'))) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: string is badly formed '%s'\n", __FUNCTION__, buf); @@ -141,13 +157,14 @@ buf[4] = '\0'; buf[7] = '\0'; - if (datetime) { + if (format > 0) { buf[10] = '\0'; buf[13] = '\0'; buf[16] = '\0'; + buf[19] = '\0'; } for (i = 0; - i < (datetime ? CMYTH_TIMESTAMP_LEN : CMYTH_DATESTAMP_LEN); + i < len; ++i) { if (buf[i] && !isdigit(buf[i])) { cmyth_dbg(CMYTH_DBG_ERROR, @@ -170,7 +187,7 @@ goto err; } - if (datetime == 0) + if (format == 0) return ret; ret->timestamp_hour = atoi(hh); @@ -198,7 +215,7 @@ return NULL; } -cmyth_timestamp_t +static cmyth_timestamp_t cmyth_timestamp_from_tm(struct tm * tm_datetime) { cmyth_timestamp_t ret = cmyth_timestamp_create(); @@ -229,18 +246,93 @@ * * Return Value: * - * Success: cmyth_timestamp_t object + * Success: cmyth_timestamp_t structure * - * Failure: -(ERRNO) + * Failure: NULL */ cmyth_timestamp_t cmyth_timestamp_from_unixtime(time_t l) { struct tm tm_datetime; - localtime_r(&l,&tm_datetime); + localtime_r(&l, &tm_datetime); return cmyth_timestamp_from_tm(&tm_datetime); } +/* + * cmyth_timestamp_utc_from_unixtime(time_t l) + * + * Scope: PUBLIC + * + * Description + * + * Create and fill out a UTC timestamp structure using the time_t 'l'. + * + * Return Value: + * + * Success: cmyth_timestamp_t structure + * + * Failure: NULL + */ +cmyth_timestamp_t +cmyth_timestamp_utc_from_unixtime(time_t l) +{ + struct tm tm_datetime; + cmyth_timestamp_t ts; + gmtime_r(&l, &tm_datetime); + ts = cmyth_timestamp_from_tm(&tm_datetime); + ts->timestamp_isutc = 1; + return ts; +} + +/* + * cmyth_timestamp_to_utc(cmyth_timestamp_t ts) + * + * Scope: PUBLIC + * + * Description + * + * Create and fill out a UTC timestamp structure + * + * Return Value: + * + * Success: cmyth_timestamp_t structure + * + * Failure: NULL + */ +cmyth_timestamp_t +cmyth_timestamp_to_utc(cmyth_timestamp_t ts) +{ + time_t l; + struct tm tm_datetime; + cmyth_timestamp_t ret; + + if (!ts) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL timestamp\n", + __FUNCTION__); + return NULL; + } + if (ts->timestamp_isutc) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: UTC timestamp provided\n", + __FUNCTION__); + return NULL; + } + l = cmyth_timestamp_to_unixtime(ts); + gmtime_r(&l, &tm_datetime); + ret = cmyth_timestamp_from_tm(&tm_datetime); + ret->timestamp_isutc = 1; + return ret; +} + +int +cmyth_timestamp_isutc(cmyth_timestamp_t ts) +{ + if (!ts) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL timestamp\n", + __FUNCTION__); + return -EINVAL; + } + return ts->timestamp_isutc; +} /* * cmyth_timestamp_to_longlong( cmyth_timestamp_t ts) @@ -267,7 +359,12 @@ if (!ts) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL timestamp provided\n", __FUNCTION__); - return -EINVAL; + return (time_t) -1; + } + if (ts->timestamp_isutc == 1) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: UTC timestamp provided\n", + __FUNCTION__); + return (time_t) -1; } tm_datetime.tm_sec = ts->timestamp_second; @@ -312,14 +409,29 @@ __FUNCTION__); return -EINVAL; } - sprintf(str, - "%4.4ld-%2.2ld-%2.2ldT%2.2ld:%2.2ld:%2.2ld", - ts->timestamp_year, - ts->timestamp_month, - ts->timestamp_day, - ts->timestamp_hour, - ts->timestamp_minute, - ts->timestamp_second); + /* ISO 8601 formats */ + if (ts->timestamp_isutc == 1) + { + sprintf(str, + "%4.4ld-%2.2ld-%2.2ldT%2.2ld:%2.2ld:%2.2ldZ", + ts->timestamp_year, + ts->timestamp_month, + ts->timestamp_day, + ts->timestamp_hour, + ts->timestamp_minute, + ts->timestamp_second); + } + else + { + sprintf(str, + "%4.4ld-%2.2ld-%2.2ldT%2.2ld:%2.2ld:%2.2ld", + ts->timestamp_year, + ts->timestamp_month, + ts->timestamp_day, + ts->timestamp_hour, + ts->timestamp_minute, + ts->timestamp_second); + } return 0; } @@ -398,6 +510,18 @@ ts->timestamp_second, pm ? "PM" : "AM"); } + /* ISO 8601 formats */ + else if (ts->timestamp_isutc == 1) + { + sprintf(str, + "%4.4ld-%2.2ld-%2.2ldT%2.2ld:%2.2ld:%2.2ldZ", + ts->timestamp_year, + ts->timestamp_month, + ts->timestamp_day, + ts->timestamp_hour, + ts->timestamp_minute, + ts->timestamp_second); + } else { sprintf(str, @@ -446,6 +570,11 @@ __FUNCTION__); return -EINVAL; } + if (ts->timestamp_isutc == 1) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: UTC timestamp provided\n", + __FUNCTION__); + return -EINVAL; + } memset(&tm_datetime, 0, sizeof(tm_datetime)); tm_datetime.tm_year = ts->timestamp_year - 1900; @@ -590,5 +719,5 @@ tm_datetime.tm_isdst = ts2->timestamp_isdst; end = mktime(&tm_datetime); - return (int)(end - start); + return (int)difftime(end, start); } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/librefmem/alloc.c xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/librefmem/alloc.c --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/librefmem/alloc.c 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/librefmem/alloc.c 2014-01-04 10:28:12.000000000 +0000 @@ -533,7 +533,7 @@ total_bytecount -= ( sizeof(refcounter_t) + ref->length); free(block); } - if (refcount < 0) + else if (refcount < 0) fprintf(stderr, "*** %s(): %p refcount %d ***\n", __FUNCTION__, p, ref->refcount); } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/librefmem/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/librefmem/Makefile.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/librefmem/Makefile.am 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/librefmem/Makefile.am 2014-01-04 10:28:12.000000000 +0000 @@ -3,7 +3,7 @@ librefmem_la_SOURCES = alloc.c \ debug_refmem.c -INCLUDES=-I$(srcdir)/../include/ -I$(srcdir)/../libcmyth/ +INCLUDES=-I../include/ -I../libcmyth/ $(LIB): librefmem.la cp -f .libs/librefmem.a . diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/Win32/libcmyth.vcxproj xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/Win32/libcmyth.vcxproj --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/Win32/libcmyth.vcxproj 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/Win32/libcmyth.vcxproj 2014-01-04 10:28:12.000000000 +0000 @@ -16,6 +16,7 @@ + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/Win32/libcmyth.vcxproj.filters xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/Win32/libcmyth.vcxproj.filters --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/cmyth/Win32/libcmyth.vcxproj.filters 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/Win32/libcmyth.vcxproj.filters 2014-01-04 10:28:12.000000000 +0000 @@ -88,6 +88,9 @@ Source Files + + Source Files + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/jsoncpp/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/jsoncpp/Makefile.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/jsoncpp/Makefile.am 2013-12-13 13:17:21.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/jsoncpp/Makefile.am 2014-01-04 10:28:12.000000000 +0000 @@ -4,7 +4,7 @@ src/lib_json/json_value.cpp \ src/lib_json/json_writer.cpp -INCLUDES=-I$(srcdir)/include/ +INCLUDES=-Iinclude/ $(LIB): libjsoncpp.la cp -f .libs/libjsoncpp.a . diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/channel.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/channel.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/channel.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/channel.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,165 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "request.h" +#include "response.h" +#include "xml_object_serializer.h" + +using namespace dvblinkremote; +using namespace dvblinkremoteserialization; + +Channel::Channel(const std::string& id, const long dvbLinkId, const std::string& name, const DVBLinkChannelType type, const int number, const int subNumber) + : m_id(id), + m_dvbLinkId(dvbLinkId), + m_name(name), + m_type(type), + Number(number), + SubNumber(subNumber), + ChildLock(false) +{ + +} + +Channel::Channel(Channel& channel) + : m_id(channel.GetID()), + m_dvbLinkId(channel.GetDvbLinkID()), + m_name(channel.GetName()), + m_type(channel.GetChannelType()), + Number(channel.Number), + SubNumber(channel.SubNumber), + ChildLock(channel.ChildLock) +{ + +} + +Channel::~Channel() +{ + +} + +std::string& Channel::GetID() +{ + return m_id; +} + +long Channel::GetDvbLinkID() +{ + return m_dvbLinkId; +} + +std::string& Channel::GetName() +{ + return m_name; +} + +Channel::DVBLinkChannelType& Channel::GetChannelType() +{ + return m_type; +} + +ChannelList::ChannelList() +{ + +} + +ChannelList::~ChannelList() +{ + for (std::vector::const_iterator it = begin(); it < end(); it++) + { + delete (*it); + } +} + +GetChannelsRequest::GetChannelsRequest() +{ + +} + +GetChannelsRequest::~GetChannelsRequest() +{ + +} + +bool GetChannelsRequestSerializer::WriteObject(std::string& serializedData, GetChannelsRequest& objectGraph) +{ + PrepareXmlDocumentForObjectSerialization("channels"); + tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); + GetXmlDocument().Accept(printer); + serializedData = std::string(printer->CStr()); + + return true; +} + +bool GetChannelsResponseSerializer::ReadObject(ChannelList& object, const std::string& xml) +{ + tinyxml2::XMLDocument& doc = GetXmlDocument(); + + if (doc.Parse(xml.c_str()) == tinyxml2::XML_NO_ERROR) { + tinyxml2::XMLElement* elRoot = doc.FirstChildElement("channels"); + GetChannelsResponseXmlDataDeserializer* xmlDataDeserializer = new GetChannelsResponseXmlDataDeserializer(*this, object); + elRoot->Accept(xmlDataDeserializer); + delete xmlDataDeserializer; + + return true; + } + + return false; +} + +GetChannelsResponseSerializer::GetChannelsResponseXmlDataDeserializer::GetChannelsResponseXmlDataDeserializer(GetChannelsResponseSerializer& parent, ChannelList& channelList) + : m_parent(parent), + m_channelList(channelList) +{ + +} + +GetChannelsResponseSerializer::GetChannelsResponseXmlDataDeserializer::~GetChannelsResponseXmlDataDeserializer() +{ + +} + +bool GetChannelsResponseSerializer::GetChannelsResponseXmlDataDeserializer::VisitEnter(const tinyxml2::XMLElement& element, const tinyxml2::XMLAttribute* attribute) +{ + if (strcmp(element.Name(), "channel") == 0) + { + long channelDvbLinkId = Util::GetXmlFirstChildElementTextAsLong(&element, "channel_dvblink_id"); + std::string channelId = Util::GetXmlFirstChildElementText(&element, "channel_id"); + std::string channelName = Util::GetXmlFirstChildElementText(&element, "channel_name"); + int channelNumber = Util::GetXmlFirstChildElementTextAsInt(&element, "channel_number"); + int channelSubNumber = Util::GetXmlFirstChildElementTextAsInt(&element, "channel_subnumber"); + Channel::DVBLinkChannelType channelType = (Channel::DVBLinkChannelType)Util::GetXmlFirstChildElementTextAsInt(&element, "channel_type"); + + Channel* channel = new Channel(channelId, channelDvbLinkId, channelName, channelType, channelNumber, channelSubNumber); + + if (m_parent.HasChildElement(*&element, "channel_child_lock")) + { + channel->ChildLock = Util::GetXmlFirstChildElementTextAsBoolean(&element, "channel_child_lock"); + } + + m_channelList.push_back(channel); + + return false; + } + + return true; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/COPYING xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/COPYING --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/COPYING 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/COPYING 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,5 @@ +Copyright (C) 2012 Marcus Efraimsson +Distributed Under MIT License + +Documentation and Full License Available at: +https://github.com/marefr/dvblinkremote diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/curlhttpclient.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/curlhttpclient.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/curlhttpclient.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/curlhttpclient.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,311 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "curlhttpclient.h" + +using namespace dvblinkremotehttp; + +CurlHttpClient::CurlHttpClient() + : m_curlHandle(NULL), + m_curlCallbackPrepared(false), + m_curlAuthenticationPrepared(false), + m_requestSuccess(false), + m_proxyUrl(""), + m_verboseLogging(false), + HttpClient() +{ + ClearCurlCallbackBuffers(); + m_curlHandle = curl_easy_init(); +} + +CurlHttpClient::CurlHttpClient(const std::string& proxyUrl) + : m_curlHandle(NULL), + m_curlCallbackPrepared(false), + m_curlAuthenticationPrepared(false), + m_requestSuccess(false), + m_proxyUrl(proxyUrl), + m_verboseLogging(false), + HttpClient() +{ + ClearCurlCallbackBuffers(); + m_curlHandle = curl_easy_init(); +} + +CurlHttpClient::CurlHttpClient(CurlHttpClientDebugCallbackFunc& debugCallbackFunction) + : m_curlHandle(NULL), + m_curlCallbackPrepared(false), + m_curlAuthenticationPrepared(false), + m_requestSuccess(false), + m_proxyUrl(""), + m_verboseLogging(true), + m_debugCallbackFunction(debugCallbackFunction), + HttpClient() +{ + ClearCurlCallbackBuffers(); + m_curlHandle = curl_easy_init(); +} + +CurlHttpClient::CurlHttpClient(const std::string& proxyUrl, CurlHttpClientDebugCallbackFunc& debugCallbackFunction) + : m_curlHandle(NULL), + m_curlCallbackPrepared(false), + m_curlAuthenticationPrepared(false), + m_requestSuccess(false), + m_proxyUrl(proxyUrl), + m_verboseLogging(true), + m_debugCallbackFunction(debugCallbackFunction), + HttpClient() +{ + ClearCurlCallbackBuffers(); + m_curlHandle = curl_easy_init(); +} + +CurlHttpClient::~CurlHttpClient() +{ + if (m_curlHandle) { + curl_easy_cleanup(m_curlHandle); + m_curlHandle = NULL; + } +} + +bool CurlHttpClient::SendRequest(HttpWebRequest& request) +{ + bool result = false; + + PrepareCurlRequest(request); + curl_easy_setopt(m_curlHandle, CURLOPT_URL, request.GetUrl().c_str()); + + struct curl_slist* headers = NULL; + PrepareCurlHeaders(request, headers); + + if (request.Method == DVBLINK_REMOTE_HTTP_POST_METHOD) { + curl_easy_setopt(m_curlHandle, CURLOPT_POST, 1); + curl_easy_setopt(m_curlHandle, CURLOPT_POSTFIELDS, request.GetRequestData().c_str()); + + if (request.ContentLength > 0) { + curl_easy_setopt(m_curlHandle, CURLOPT_POSTFIELDSIZE, request.ContentLength); + } + } + + PrepareCurlAuthentication(request); + + if (curl_easy_perform(m_curlHandle) == CURLE_OK) { + m_requestSuccess = true; + result = true; + } + + if (headers) { + curl_slist_free_all(headers); + } + + return result; +} + +HttpWebResponse* CurlHttpClient::GetResponse() +{ + if (!m_requestSuccess || !m_curlHandle) { + return NULL; + } + + long responseCode; + + curl_easy_getinfo(m_curlHandle, CURLINFO_RESPONSE_CODE, &responseCode); + + HttpWebResponse* response = new HttpWebResponse(responseCode, m_callbackData); + + char* contentType; + curl_easy_getinfo(m_curlHandle, CURLINFO_CONTENT_TYPE, &contentType); + + if (contentType) { + response->ContentType.assign(contentType); + } + + double contentLength; + curl_easy_getinfo(m_curlHandle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &contentLength); + + if (contentLength != -1) { + response->ContentLength = (long)contentLength; + } + + return response; +} + +void CurlHttpClient::GetLastError(std::string& err) +{ + m_errorBuffer[dvblinkremote::DVBLINK_REMOTE_DEFAULT_BUFFER_SIZE - 1] = dvblinkremote::DVBLINK_REMOTE_EOF; + err.assign(m_errorBuffer); +} + +void CurlHttpClient::UrlEncode(const std::string& str, std::string& outEncodedStr) +{ + if (m_curlHandle) { + outEncodedStr.assign(curl_easy_escape(m_curlHandle, str.c_str(), str.length())); + } +} + +void CurlHttpClient::PrepareCurlRequest(HttpWebRequest& request) +{ + if (!m_curlHandle) { + return; + } + + // Reset any existing request we may have + curl_easy_setopt(m_curlHandle, CURLOPT_CUSTOMREQUEST, NULL); + + ClearCurlCallbackBuffers(); + PrepareCurlCurlback(); + PrepareCurlAuthentication(request); +} + +void CurlHttpClient::PrepareCurlCurlback() +{ + if (!m_curlHandle) { + return; + } + + if (!m_curlCallbackPrepared) { + // Set buffer to get error + curl_easy_setopt(m_curlHandle, CURLOPT_ERRORBUFFER, m_errorBuffer); + + // Set callback function to get response + curl_easy_setopt( m_curlHandle, CURLOPT_WRITEFUNCTION, CurlWriteCallback); + curl_easy_setopt( m_curlHandle, CURLOPT_WRITEDATA, this); + + if (!m_proxyUrl.empty()) { + curl_easy_setopt(m_curlHandle, CURLOPT_PROXY, m_proxyUrl.c_str()); + } + + if (m_verboseLogging) { + curl_easy_setopt(m_curlHandle, CURLOPT_VERBOSE, 1); + curl_easy_setopt(m_curlHandle, CURLOPT_DEBUGFUNCTION, CurlHttpClient::CurlDebugCallback); + curl_easy_setopt(m_curlHandle, CURLOPT_DEBUGDATA, this); + } + + m_curlCallbackPrepared = true; + } +} + +void CurlHttpClient::PrepareCurlHeaders(HttpWebRequest& request, curl_slist* headers) +{ + if (!m_curlHandle) { + return; + } + + if (!request.ContentType.empty()) { + headers = curl_slist_append(headers, std::string(DVBLINK_REMOTE_HTTP_HEADER_CONTENT_TYPE + ":" + request.ContentType).c_str()); + } + + if (headers) { + curl_easy_setopt(m_curlHandle, CURLOPT_HTTPHEADER, headers); + } +} + +void CurlHttpClient::PrepareCurlAuthentication(HttpWebRequest& request) +{ + if (!m_curlHandle) { + return; + } + + if (!m_curlAuthenticationPrepared && + (!request.UserName.empty() || !request.Password.empty())) { + std::string credentials = request.UserName + ":" + request.Password; + + curl_easy_setopt(m_curlHandle, CURLOPT_USERPWD, credentials.c_str()); + curl_easy_setopt(m_curlHandle, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); + + m_curlAuthenticationPrepared = true; + } +} + +void CurlHttpClient::ClearCurlCallbackBuffers() +{ + m_callbackData = ""; + memset(m_errorBuffer, 0, dvblinkremote::DVBLINK_REMOTE_EOF); + m_requestSuccess = false; +} + +size_t CurlHttpClient::CurlWriteCallback(char* buffer, size_t size, size_t nmemb, CurlHttpClient* pHttpCurlClientObj) +{ + size_t writtenSize = 0; + + if (pHttpCurlClientObj && buffer) { + writtenSize = pHttpCurlClientObj->SaveLastWebResponse(buffer, (size * nmemb)); + } + + return writtenSize; +} + +size_t CurlHttpClient::SaveLastWebResponse(char*& buffer, size_t size) +{ + size_t bytesWritten = 0; + + if (buffer && size ) + { + m_callbackData.append(buffer, size); + bytesWritten = size; + } + + return bytesWritten; +} + +int CurlHttpClient::CurlDebugCallback(CURL* curl, curl_infotype infotype, char* data, size_t size, CurlHttpClient* pHttpCurlClientObj) +{ + if (pHttpCurlClientObj && pHttpCurlClientObj->m_verboseLogging && pHttpCurlClientObj->m_debugCallbackFunction && data) { + pHttpCurlClientObj->Debug(infotype, data, size); + } + + return 0; +} + +void CurlHttpClient::Debug(curl_infotype infotype, char* data, size_t size) +{ + size_t newSize = size; + + if (data[size - 1] == dvblinkremote::DVBLINK_REMOTE_NEWLINE) { + newSize = size - 1; + } + + std::string message = std::string(data, newSize); + std::string type = ""; + + switch(infotype) + { + case CURLINFO_TEXT: + type = DVBLINK_REMOTE_HTTP_CURL_DEBUG_MESSAGE_TYPE_TEXT; + break; + case CURLINFO_DATA_OUT: + type = DVBLINK_REMOTE_HTTP_CURL_DEBUG_MESSAGE_TYPE_SENT_REQUEST_DATA; + break; + case CURLINFO_DATA_IN: + type = DVBLINK_REMOTE_HTTP_CURL_DEBUG_MESSAGE_TYPE_RECIEVED_RESPONSE_DATA; + break; + case CURLINFO_HEADER_OUT: + type = DVBLINK_REMOTE_HTTP_CURL_DEBUG_MESSAGE_TYPE_SENT_REQUEST_HEADERS; + break; + case CURLINFO_HEADER_IN: + type = DVBLINK_REMOTE_HTTP_CURL_DEBUG_MESSAGE_TYPE_RECIEVED_RESPONSE_HEADERS; + break; + } + + // Call the registered callback debug function. + m_debugCallbackFunction(type, message); +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/curlhttpclient.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/curlhttpclient.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/curlhttpclient.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/curlhttpclient.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,75 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#pragma once + +#include +#include "dvblinkremote.h" +#include "dvblinkremotehttp.h" +#include "curl/curl.h" + +namespace dvblinkremotehttp +{ + typedef void (CurlHttpClientDebugCallbackFunc)(std::string type, std::string message); + + const std::string DVBLINK_REMOTE_HTTP_CURL_DEBUG_MESSAGE_TYPE_TEXT = "TEXT"; + const std::string DVBLINK_REMOTE_HTTP_CURL_DEBUG_MESSAGE_TYPE_SENT_REQUEST_DATA = "SENT_REQUEST_DATA"; + const std::string DVBLINK_REMOTE_HTTP_CURL_DEBUG_MESSAGE_TYPE_SENT_REQUEST_HEADERS = "SENT_REQUEST_HEADERS"; + const std::string DVBLINK_REMOTE_HTTP_CURL_DEBUG_MESSAGE_TYPE_RECIEVED_RESPONSE_DATA = "RECIEVED_RESPONSE_DATA"; + const std::string DVBLINK_REMOTE_HTTP_CURL_DEBUG_MESSAGE_TYPE_RECIEVED_RESPONSE_HEADERS = "RECIEVED_RESPONSE_HEADERS"; + + class CurlHttpClient : public HttpClient + { + public: + CurlHttpClient(); + CurlHttpClient(const std::string& proxyUrl); + CurlHttpClient(CurlHttpClientDebugCallbackFunc& debugCallbackFunction); + CurlHttpClient(const std::string& proxyUrl, CurlHttpClientDebugCallbackFunc& debugCallbackFunction); + ~CurlHttpClient(); + bool SendRequest(HttpWebRequest& request); + HttpWebResponse* GetResponse(); + void GetLastError(std::string& err); + void UrlEncode(const std::string& str, std::string& outEncodedStr); + + private: + CURL* m_curlHandle; + char m_errorBuffer[dvblinkremote::DVBLINK_REMOTE_DEFAULT_BUFFER_SIZE]; + std::string m_callbackData; + bool m_curlCallbackPrepared; + bool m_curlAuthenticationPrepared; + bool m_requestSuccess; + std::string m_proxyUrl; + bool m_verboseLogging; + CurlHttpClientDebugCallbackFunc* m_debugCallbackFunction; + + void PrepareCurlRequest(HttpWebRequest& request); + void PrepareCurlCurlback(); + void PrepareCurlHeaders(HttpWebRequest& request, curl_slist* headers); + void PrepareCurlAuthentication(HttpWebRequest& request); + size_t SaveLastWebResponse(char*& buffer, size_t size); + void Debug(curl_infotype infotype, char* data, size_t size); + void ClearCurlCallbackBuffers(); + static size_t CurlWriteCallback(char* buffer, size_t size, size_t nmemb, CurlHttpClient* pHttpCurlClientObj); + static int CurlDebugCallback(CURL* curl, curl_infotype infotype, char* data, size_t size, CurlHttpClient* pHttpCurlClientObj); + }; +}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/dvblinkremotecommunication.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremotecommunication.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/dvblinkremotecommunication.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremotecommunication.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,356 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "dvblinkremoteconnection.h" +#include "xml_object_serializer.h" +#include "generic_response.h" + +using namespace dvblinkremote; +using namespace dvblinkremoteserialization; + +DVBLinkRemoteCommunication::DVBLinkRemoteCommunication(dvblinkremotehttp::HttpClient& httpClient, const std::string& hostAddress, const long port) + : m_httpClient(httpClient), + m_hostAddress(hostAddress), + m_port(port) +{ + m_username = ""; + m_password = ""; +} + +DVBLinkRemoteCommunication::DVBLinkRemoteCommunication(dvblinkremotehttp::HttpClient& httpClient, const std::string& hostAddress, const long port, const std::string& username, const std::string& password) + : m_httpClient(httpClient), + m_hostAddress(hostAddress), + m_port(port), + m_username(username), + m_password(password) +{ + +} + +DVBLinkRemoteCommunication::~DVBLinkRemoteCommunication() +{ + +} + +std::string DVBLinkRemoteCommunication::GetStatusCodeDescription(DVBLinkRemoteStatusCode status) +{ + std::string str = ""; + + switch (status) + { + case DVBLINK_REMOTE_STATUS_OK: + str = DVBLINK_REMOTE_STATUS_DESC_OK; + break; + case DVBLINK_REMOTE_STATUS_ERROR: + str = DVBLINK_REMOTE_STATUS_DESC_ERROR; + break; + case DVBLINK_REMOTE_STATUS_INVALID_DATA: + str = DVBLINK_REMOTE_STATUS_DESC_INVALID_DATA; + break; + case DVBLINK_REMOTE_STATUS_INVALID_PARAM: + str = DVBLINK_REMOTE_STATUS_DESC_INVALID_PARAM; + break; + case DVBLINK_REMOTE_STATUS_NOT_IMPLEMENTED: + str = DVBLINK_REMOTE_STATUS_DESC_NOT_IMPLEMENTED; + break; + case DVBLINK_REMOTE_STATUS_MC_NOT_RUNNING: + str = DVBLINK_REMOTE_STATUS_DESC_MC_NOT_RUNNING; + break; + case DVBLINK_REMOTE_STATUS_NO_DEFAULT_RECORDER: + str = DVBLINK_REMOTE_STATUS_DESC_NO_DEFAULT_RECORDER; + break; + case DVBLINK_REMOTE_STATUS_MCE_CONNECTION_ERROR: + str = DVBLINK_REMOTE_STATUS_DESC_MCE_CONNECTION_ERROR; + break; + case DVBLINK_REMOTE_STATUS_CONNECTION_ERROR: + str = DVBLINK_REMOTE_STATUS_DESC_CONNECTION_ERROR; + break; + case DVBLINK_REMOTE_STATUS_UNAUTHORISED: + str = DVBLINK_REMOTE_STATUS_DESC_UNAUTHORIZED; + break; + } + + return str; +} + +void DVBLinkRemoteCommunication::GetLastError(std::string& err) +{ + m_errorBuffer[dvblinkremote::DVBLINK_REMOTE_DEFAULT_BUFFER_SIZE - 1] = dvblinkremote::DVBLINK_REMOTE_EOF; + err.assign(m_errorBuffer); +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::GetChannels(const GetChannelsRequest& request, ChannelList& response) +{ + return GetData(DVBLINK_REMOTE_GET_CHANNELS_CMD, request, response); +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::SearchEpg(const EpgSearchRequest& request, EpgSearchResult& response) +{ + return GetData(DVBLINK_REMOTE_SEARCH_EPG_CMD, request, response); +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::PlayChannel(const StreamRequest& request, Stream& response) +{ + return GetData(DVBLINK_REMOTE_PLAY_CHANNEL_CMD, request, response); +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::StopChannel(const StopStreamRequest& request) +{ + Response* response = new Response(); + DVBLinkRemoteStatusCode status = GetData(DVBLINK_REMOTE_STOP_CHANNEL_CMD, request, *response); + delete response; + + return status; +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::GetRecordings(const GetRecordingsRequest& request, RecordingList& response) +{ + return GetData(DVBLINK_REMOTE_GET_RECORDINGS_CMD, request, response); +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::RemoveRecording(const RemoveRecordingRequest& request) +{ + Response* response = new Response(); + DVBLinkRemoteStatusCode status = GetData(DVBLINK_REMOTE_REMOVE_RECORDING_CMD, request, *response); + delete response; + + return status; +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::AddSchedule(const AddScheduleRequest& request) +{ + Response* response = new Response(); + DVBLinkRemoteStatusCode status = GetData(DVBLINK_REMOTE_ADD_SCHEDULE_CMD, request, *response); + delete response; + + return status; +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::GetSchedules(const GetSchedulesRequest& request, StoredSchedules& response) +{ + return GetData(DVBLINK_REMOTE_GET_SCHEDULES_CMD, request, response); +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::UpdateSchedule(const UpdateScheduleRequest& request) +{ + Response* response = new Response(); + DVBLinkRemoteStatusCode status = GetData(DVBLINK_REMOTE_UPDATE_SCHEDULE_CMD, request, *response); + delete response; + + return status; +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::RemoveSchedule(const RemoveScheduleRequest& request) +{ + Response* response = new Response(); + DVBLinkRemoteStatusCode status = GetData(DVBLINK_REMOTE_REMOVE_SCHEDULE_CMD, request, *response); + delete response; + + return status; +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::GetParentalStatus(const GetParentalStatusRequest& request, ParentalStatus& response) +{ + return GetData(DVBLINK_REMOTE_GET_PARENTAL_STATUS_CMD, request, response); +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::SetParentalLock(const SetParentalLockRequest& request, ParentalStatus& response) +{ + return GetData(DVBLINK_REMOTE_SET_PARENTAL_LOCK_CMD, request, response); +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::GetPlaybackObject(const GetPlaybackObjectRequest& request, GetPlaybackObjectResponse& response ) +{ + return GetData(DVBLINK_REMOTE_GET_OBJECT_CMD, request,response); +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::RemovePlaybackObject(const RemovePlaybackObjectRequest& request) +{ + Response* response = new Response(); + DVBLinkRemoteStatusCode status = GetData(DVBLINK_REMOTE_REMOVE_OBJECT_CMD, request, *response); + delete response; + + return status; +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::StopRecording(const StopRecordingRequest& request) +{ + Response* response = new Response(); + DVBLinkRemoteStatusCode status = GetData(DVBLINK_REMOTE_STOP_RECORDING_CMD, request, *response); + delete response; + + return status; +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::GetStreamingCapabilities(const GetStreamingCapabilitiesRequest& request, StreamingCapabilities& response) +{ + return GetData(DVBLINK_REMOTE_GET_STREAMING_CAPABILITIES_CMD, request, response); +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::GetRecordingSettings(const GetRecordingSettingsRequest& request, RecordingSettings& response) +{ + return GetData(DVBLINK_REMOTE_GET_RECORDING_SETTINGS_CMD, request, response); +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::SetRecordingSettings(const SetRecordingSettingsRequest& request) +{ + Response* response = new Response(); + DVBLinkRemoteStatusCode status = GetData(DVBLINK_REMOTE_SET_RECORDING_SETTING_CMD, request, *response); + delete response; + + return status; +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::GetM3uPlaylist(const GetM3uPlaylistRequest& request, M3uPlaylist& response) +{ + return GetData(DVBLINK_REMOTE_GET_PLAYLIST_M3U_CMD, request, response); +} + +std::string DVBLinkRemoteCommunication::GetUrl() +{ + char buffer[2000]; + int length = _snprintf_s(buffer, sizeof(buffer), 2000, DVBLINK_REMOTE_SERVER_URL_FORMAT.c_str(), DVBLINK_REMOTE_SERVER_URL_SCHEME.c_str(), m_hostAddress.c_str(), m_port, DVBLINK_REMOTE_SERVER_URL_PATH.c_str()); + std::string url(buffer, length); + return url; +} + +std::string DVBLinkRemoteCommunication::CreateRequestDataParameter(const std::string& command, const std::string& xmlData) +{ + std::string encodedCommand = ""; + std::string encodedXmlData = ""; + + m_httpClient.UrlEncode(command, encodedCommand); + m_httpClient.UrlEncode(xmlData, encodedXmlData); + + std::string data = DVBLINK_REMOTE_HTTP_COMMAND_QUERYSTRING + "="; + data.append(encodedCommand); + data.append("&" + DVBLINK_REMOTE_HTTP_XML_PARAM_QUERYSTRING + "="); + data.append(encodedXmlData); + + return data; +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::GetData(const std::string& command, const Request& request, Response& responseObject) +{ + DVBLinkRemoteStatusCode status; + std::string xmlData; + + ClearErrorBuffer(); + + if ((status = SerializeRequestObject(command, request, xmlData)) != DVBLINK_REMOTE_STATUS_OK) { + WriteError("Serialization of request object failed with error code %d (%s).\n", status, GetStatusCodeDescription(status).c_str()); + return status; + } + + std::string requestData = CreateRequestDataParameter(command, xmlData); + + dvblinkremotehttp::HttpWebRequest* httpRequest = new dvblinkremotehttp::HttpWebRequest(GetUrl()); + httpRequest->Method = DVBLINK_REMOTE_HTTP_METHOD; + httpRequest->ContentType = DVBLINK_REMOTE_HTTP_CONTENT_TYPE; + httpRequest->ContentLength = requestData.length(); + httpRequest->UserName = m_username; + httpRequest->Password = m_password; + httpRequest->SetRequestData(requestData); + + if (!m_httpClient.SendRequest(*httpRequest)) { + status = DVBLINK_REMOTE_STATUS_CONNECTION_ERROR; + WriteError("HTTP request failed with error code %d (%s).\n", status, GetStatusCodeDescription(status).c_str()); + } + else { + dvblinkremotehttp::HttpWebResponse* httpResponse = m_httpClient.GetResponse(); + + if (httpResponse->GetStatusCode() == 401) { + status = DVBLINK_REMOTE_STATUS_UNAUTHORISED; + WriteError("HTTP response returned status code %d (%s).\n", httpResponse->GetStatusCode(), GetStatusCodeDescription(status).c_str()); + } + else if (httpResponse->GetStatusCode() != 200) { + status = DVBLINK_REMOTE_STATUS_ERROR; + WriteError("HTTP response returned status code %d.\n", httpResponse->GetStatusCode()); + } + else { + std::string responseData = httpResponse->GetResponseData(); + + if ((status = DeserializeResponseData(command, responseData, responseObject)) != DVBLINK_REMOTE_STATUS_OK) { + WriteError("Deserialization of response data failed with error code %d (%s).\n", status, GetStatusCodeDescription(status).c_str()); + } + } + + delete httpResponse; + } + + delete httpRequest; + + return status; +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::SerializeRequestObject(const std::string& command, const Request& request, std::string& serializedXmlData) +{ + DVBLinkRemoteStatusCode status = DVBLINK_REMOTE_STATUS_OK; + + if (!XmlObjectSerializerFactory::Serialize(command, request, serializedXmlData)) { + status = DVBLINK_REMOTE_STATUS_INVALID_DATA; + } + + return status; +} + +DVBLinkRemoteStatusCode DVBLinkRemoteCommunication::DeserializeResponseData(const std::string& command, const std::string& responseData, Response& responseObject) +{ + DVBLinkRemoteStatusCode status = DVBLINK_REMOTE_STATUS_OK; + + if (command == DVBLINK_REMOTE_GET_PLAYLIST_M3U_CMD) + { + ((M3uPlaylist&)responseObject).FileContent.assign(responseData); + } + else + { + GenericResponseSerializer* genericResponseSerializer = new GenericResponseSerializer(); + GenericResponse* genericResponse = new GenericResponse(); + + if (genericResponseSerializer->ReadObject(*genericResponse, responseData)) { + if ((status = (DVBLinkRemoteStatusCode)genericResponse->GetStatusCode()) == DVBLINK_REMOTE_STATUS_OK) { + if (!XmlObjectSerializerFactory::Deserialize(command, genericResponse->GetXmlResult(), responseObject)) { + status = DVBLINK_REMOTE_STATUS_INVALID_DATA; + } + } + } + + delete genericResponse; + delete genericResponseSerializer; + } + + return status; +} + +void DVBLinkRemoteCommunication::WriteError(const char* format, ...) +{ + va_list args; + va_start(args, format); + vsprintf_s(m_errorBuffer, format, args); + va_end(args); +} + +void DVBLinkRemoteCommunication::ClearErrorBuffer() +{ + memset(m_errorBuffer, 0, dvblinkremote::DVBLINK_REMOTE_EOF); +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/dvblinkremoteconnection.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremoteconnection.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/dvblinkremoteconnection.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremoteconnection.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,85 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#pragma once + +#include +#include "dvblinkremote.h" +#include "dvblinkremotehttp.h" +#include "response.h" +#include "request.h" + +namespace dvblinkremote +{ + + #ifndef _MSC_VER + #define vsprintf_s vsprintf + #define _snprintf_s(a,b,c,...) snprintf(a,b,__VA_ARGS__) + #endif + + class DVBLinkRemoteCommunication : public IDVBLinkRemoteConnection + { + public: + DVBLinkRemoteCommunication(dvblinkremotehttp::HttpClient& httpClient, const std::string& hostAddress, const long port); + DVBLinkRemoteCommunication(dvblinkremotehttp::HttpClient& httpClient, const std::string& hostAddress, const long port, const std::string& username, const std::string& password); + ~DVBLinkRemoteCommunication(); + + DVBLinkRemoteStatusCode GetChannels(const GetChannelsRequest& request, ChannelList& response); + DVBLinkRemoteStatusCode SearchEpg(const EpgSearchRequest& request, EpgSearchResult& response); + DVBLinkRemoteStatusCode PlayChannel(const StreamRequest& request, Stream& response); + DVBLinkRemoteStatusCode StopChannel(const StopStreamRequest& request); + DVBLinkRemoteStatusCode GetRecordings(const GetRecordingsRequest& request, RecordingList& response); + DVBLinkRemoteStatusCode RemoveRecording(const RemoveRecordingRequest& request); + DVBLinkRemoteStatusCode AddSchedule(const AddScheduleRequest& request); + DVBLinkRemoteStatusCode GetSchedules(const GetSchedulesRequest& request, StoredSchedules& response); + DVBLinkRemoteStatusCode UpdateSchedule(const UpdateScheduleRequest& request); + DVBLinkRemoteStatusCode RemoveSchedule(const RemoveScheduleRequest& request); + DVBLinkRemoteStatusCode GetParentalStatus(const GetParentalStatusRequest& request, ParentalStatus& response); + DVBLinkRemoteStatusCode SetParentalLock(const SetParentalLockRequest& request, ParentalStatus& response); + DVBLinkRemoteStatusCode GetM3uPlaylist(const GetM3uPlaylistRequest& request, M3uPlaylist& response); + DVBLinkRemoteStatusCode GetPlaybackObject(const GetPlaybackObjectRequest& request, GetPlaybackObjectResponse& response); + DVBLinkRemoteStatusCode RemovePlaybackObject(const RemovePlaybackObjectRequest& request); + DVBLinkRemoteStatusCode StopRecording(const StopRecordingRequest& request); + DVBLinkRemoteStatusCode GetStreamingCapabilities(const GetStreamingCapabilitiesRequest& request, StreamingCapabilities& response); + DVBLinkRemoteStatusCode GetRecordingSettings(const GetRecordingSettingsRequest& request, RecordingSettings& response); + DVBLinkRemoteStatusCode SetRecordingSettings(const SetRecordingSettingsRequest& request); + void GetLastError(std::string& err); + + private: + dvblinkremotehttp::HttpClient& m_httpClient; + std::string m_hostAddress; + long m_port; + std::string m_username; + std::string m_password; + char m_errorBuffer[dvblinkremote::DVBLINK_REMOTE_DEFAULT_BUFFER_SIZE]; + + DVBLinkRemoteStatusCode GetData(const std::string& command, const Request& request, Response& response); + DVBLinkRemoteStatusCode SerializeRequestObject(const std::string& command, const Request& request, std::string& requestXmlData); + DVBLinkRemoteStatusCode DeserializeResponseData(const std::string& command, const std::string& responseData, Response& responseObject); + std::string GetUrl(); + std::string CreateRequestDataParameter(const std::string& command, const std::string& xmlData); + std::string GetStatusCodeDescription(DVBLinkRemoteStatusCode status); + void WriteError(const char* format, ...); + void ClearErrorBuffer(); + }; +}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/dvblinkremote.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremote.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/dvblinkremote.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremote.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,58 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "dvblinkremote.h" +#include "dvblinkremoteconnection.h" + +using namespace dvblinkremote; + +IDVBLinkRemoteConnection::~IDVBLinkRemoteConnection() +{ +} + +IDVBLinkRemoteConnection* DVBLinkRemote::Connect(dvblinkremotehttp::HttpClient& httpClient, const std::string& hostAddress, const long port) +{ + return new DVBLinkRemoteCommunication(httpClient, hostAddress, port); +} + +IDVBLinkRemoteConnection* DVBLinkRemote::Connect(dvblinkremotehttp::HttpClient& httpClient, const std::string& hostAddress, const long port, const std::string& username, const std::string& password) +{ + return new DVBLinkRemoteCommunication(httpClient, hostAddress, port, username, password); +} + +void DVBLinkRemote::GetCopyrightNotice(std::string& copyright) +{ + copyright.assign(LIBDVBLINKREMOTE_COPYRIGHT); +} + +void DVBLinkRemote::GetVersion(std::string& version) +{ + version.assign(LIBDVBLINKREMOTE_VERSION); +} + +void DVBLinkRemote::GetVersion(int& major, int& minor, int& patch) +{ + major = LIBDVBLINKREMOTE_VERSION_MAJOR; + minor = LIBDVBLINKREMOTE_VERSION_MINOR; + patch = LIBDVBLINKREMOTE_VERSION_PATCH; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/dvblinkremote.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremote.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/dvblinkremote.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremote.h 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,496 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#pragma once + +#include +#include "dvblinkremotehttp.h" +#include "response.h" +#include "request.h" +#include "scheduling.h" +#include "version.h" + +/** + * Default namespace for DVBLink Remote API library. + */ +namespace dvblinkremote +{ + /** + * A constant integer representing the default buffer size. + */ + const int DVBLINK_REMOTE_DEFAULT_BUFFER_SIZE = 1024; + + /** + * A constant char representing the EOF string. + */ + const char DVBLINK_REMOTE_EOF = '\0'; + + /** + * A constant char representing the newline string. + */ + const char DVBLINK_REMOTE_NEWLINE = '\n'; + + /** + * A constant string for the scheme used to communicate with DVBLink server. + */ + const std::string DVBLINK_REMOTE_SERVER_URL_SCHEME = "http"; + + /** + * A constant string for the path specifying how to find the resource where DVBLink Remote API requests should be sent to. + */ + const std::string DVBLINK_REMOTE_SERVER_URL_PATH = "cs/"; + + /** + * A constant string used to format a DVBLink server URL. + * The default format is <scheme>://<domain>:<port>/<path>. + * \remark Parameters will be interpreted in the following order: + * 1. The value of DVBLINK_REMOTE_SERVER_URL_SCHEME. + * 2. The domain/host address of DVBLink server. + * 3. The port number specifies the base streaming port of DVBLink server. + * 4. The value of DVBLINK_REMOTE_SERVER_URL_PATH. + */ + const std::string DVBLINK_REMOTE_SERVER_URL_FORMAT = "%s://%s:%ld/%s"; + + /** + * A constant string representing the HTTP method used to communicate with the DVBLink Remote API. + */ + const std::string DVBLINK_REMOTE_HTTP_METHOD = dvblinkremotehttp::DVBLINK_REMOTE_HTTP_POST_METHOD; + + /** + * A constant string representing the MIME type of the data sent via DVBLink Remote API requests. + */ + const std::string DVBLINK_REMOTE_HTTP_CONTENT_TYPE = "application/x-www-form-urlencoded; charset=utf-8"; + + /** + * A constant string representing the name of the DVBLink command querystring used for data to be sent in a DVBLink Remote API request. + */ + const std::string DVBLINK_REMOTE_HTTP_COMMAND_QUERYSTRING = "command"; + + /** + * A constant string representing the name of the DVBLink xml data querystring used for data to be sent in a DVBLink Remote API request. + */ + const std::string DVBLINK_REMOTE_HTTP_XML_PARAM_QUERYSTRING = "xml_param"; + + /** + * A constant string representing the DVBLink command for retrieving channels. + */ + const std::string DVBLINK_REMOTE_GET_CHANNELS_CMD = "get_channels"; + + /** + * A constant string representing the DVBLink command for playing a channel. + */ + const std::string DVBLINK_REMOTE_PLAY_CHANNEL_CMD = "play_channel"; + + /** + * A constant string representing the DVBLink command for stopping one or several playing channels. + */ + const std::string DVBLINK_REMOTE_STOP_CHANNEL_CMD = "stop_channel"; + + /** + * A constant string representing the DVBLink command for searching the electronic program guide (EPG). + */ + const std::string DVBLINK_REMOTE_SEARCH_EPG_CMD = "search_epg"; + + /** + * A constant string representing the DVBLink command for retrieving recordings. + */ + const std::string DVBLINK_REMOTE_GET_RECORDINGS_CMD = "get_recordings"; + + /** + * A constant string representing the DVBLink command for adding a recording schedule. + */ + const std::string DVBLINK_REMOTE_ADD_SCHEDULE_CMD = "add_schedule"; + + /** + * A constant string representing the DVBLink command for removing a recording schedule. + */ + const std::string DVBLINK_REMOTE_REMOVE_SCHEDULE_CMD = "remove_schedule"; + + /** + * A constant string representing the DVBLink command for removing a recording. + */ + const std::string DVBLINK_REMOTE_REMOVE_RECORDING_CMD = "remove_recording"; + + /** + * A constant string representing the DVBLink command for setting a parental lock. + */ + const std::string DVBLINK_REMOTE_SET_PARENTAL_LOCK_CMD = "set_parental_lock"; + + /** + * A constant string representing the DVBLink command for retrieving parental lock status. + */ + const std::string DVBLINK_REMOTE_GET_PARENTAL_STATUS_CMD = "get_parental_status"; + + /** + * A constant string representing the DVBLink command for retrieving schedules. + */ + const std::string DVBLINK_REMOTE_GET_SCHEDULES_CMD = "get_schedules"; + + /** + * A constant string representing the DVBLink command for updating a schedule. + */ + const std::string DVBLINK_REMOTE_UPDATE_SCHEDULE_CMD = "update_schedule"; + + /** + * A constant string representing the DVBLink command for retrieving a M3U playlist of channels. + */ + const std::string DVBLINK_REMOTE_GET_PLAYLIST_M3U_CMD = "get_playlist_m3u"; + + /** + * A constant string representing the DVBLink command for retrieving a playlist object. + */ + const std::string DVBLINK_REMOTE_GET_OBJECT_CMD = "get_object"; + + /** + * A constant string representing the DVBLink command for removing a playlist object. + */ + const std::string DVBLINK_REMOTE_REMOVE_OBJECT_CMD = "remove_object"; + + /** + * A constant string representing the DVBLink command for stopping an active recording. + */ + const std::string DVBLINK_REMOTE_STOP_RECORDING_CMD = "stop_recording"; + + /** + * A constant string representing the DVBLink command for retrieving streaming capabilities. + */ + const std::string DVBLINK_REMOTE_GET_STREAMING_CAPABILITIES_CMD = "get_streaming_capabilities"; + + /** + * A constant string representing the DVBLink command for retrieving recording settings. + */ + const std::string DVBLINK_REMOTE_GET_RECORDING_SETTINGS_CMD = "get_recording_settings"; + + /** + * A constant string representing the DVBLink command for setting recording settings. + */ + const std::string DVBLINK_REMOTE_SET_RECORDING_SETTING_CMD = "set_recording_settings"; + + /** + * A constant string representing a Real Time Transport Protocol stream type for Android devices. + */ + const std::string DVBLINK_REMOTE_STREAM_TYPE_ANDROID = "rtp"; + + /** + * A constant string representing a Http Live stream type for IOS devices. + */ + const std::string DVBLINK_REMOTE_STREAM_TYPE_IPHONE = "hls"; + + /** + * A constant string representing a Windows Media stream type for Windows phone devices. + */ + const std::string DVBLINK_REMOTE_STREAM_TYPE_WINPHONE = "asf"; + + /** + * A constant string representing a Raw HTTP stream type. + */ + const std::string DVBLINK_REMOTE_STREAM_TYPE_RAW_HTTP = "raw_http"; + + /** + * A constant string representing a Raw UDP stream type. + */ + const std::string DVBLINK_REMOTE_STREAM_TYPE_RAW_UDP = "raw_udp"; + + /** + * An enum representing the different status codes that DVBLink Remote API request could return. + */ + enum DVBLinkRemoteStatusCode + { + DVBLINK_REMOTE_STATUS_OK = 0, /**< DVBLink Remote API command was successful. */ + DVBLINK_REMOTE_STATUS_ERROR = 1000, /**< An unspecified error occurred. */ + DVBLINK_REMOTE_STATUS_INVALID_DATA = 1001, /**< Invalid request data provided. */ + DVBLINK_REMOTE_STATUS_INVALID_PARAM = 1002, /**< Invalid request parameter provided. */ + DVBLINK_REMOTE_STATUS_NOT_IMPLEMENTED = 1003, /**< An invalid command was provied to the DVBLink Remote API. */ + DVBLINK_REMOTE_STATUS_MC_NOT_RUNNING = 1005, /**< Windows Media Center is not running. */ + DVBLINK_REMOTE_STATUS_NO_DEFAULT_RECORDER = 1006, /**< No default recorder is configured. */ + DVBLINK_REMOTE_STATUS_MCE_CONNECTION_ERROR = 1008, /**< An error occurred when trying to establish a connection to Windows Media Center. */ + DVBLINK_REMOTE_STATUS_CONNECTION_ERROR = 2000, /**< An error occurred when trying to connect to the DVBLink Connect! Server. */ + DVBLINK_REMOTE_STATUS_UNAUTHORISED = 2001 /**< An authentication error occurred when trying to establish a connection to the DVBLink Connect! Server. */ + }; + + /** + * A constant string representing a description of the DVBLink Remote API status code DVBLINK_REMOTE_STATUS_OK. + * @see DVBLinkRemoteStatusCode + */ + const std::string DVBLINK_REMOTE_STATUS_DESC_OK = "DVBLink Remote API command was successful"; + + /** + * A constant string representing a description of the DVBLink Remote API status code DVBLINK_REMOTE_STATUS_ERROR. + * @see DVBLinkRemoteStatusCode + */ + const std::string DVBLINK_REMOTE_STATUS_DESC_ERROR = "An unspecified error occurred"; + + /** + * A constant string representing a description of the DVBLink Remote API status code DVBLINK_REMOTE_STATUS_INVALID_DATA. + * @see DVBLinkRemoteStatusCode + */ + const std::string DVBLINK_REMOTE_STATUS_DESC_INVALID_DATA = "Invalid request data provided"; + + /** + * A constant string representing a description of the DVBLink Remote API status code DVBLINK_REMOTE_STATUS_INVALID_PARAM. + * @see DVBLinkRemoteStatusCode + */ + const std::string DVBLINK_REMOTE_STATUS_DESC_INVALID_PARAM = "Invalid request parameter provided"; + + /** + * A constant string representing a description of the DVBLink Remote API status code DVBLINK_REMOTE_STATUS_NOT_IMPLEMENTED. + * @see DVBLinkRemoteStatusCode + */ + const std::string DVBLINK_REMOTE_STATUS_DESC_NOT_IMPLEMENTED = "An invalid command was provided to the DVBLink Remote API"; + + /** + * A constant string representing a description of the DVBLink Remote API status code DVBLINK_REMOTE_STATUS_MC_NOT_RUNNING. + * @see DVBLinkRemoteStatusCode + */ + const std::string DVBLINK_REMOTE_STATUS_DESC_MC_NOT_RUNNING = "Windows Media Center is not running"; + + /** + * A constant string representing a description of the DVBLink Remote API status code DVBLINK_REMOTE_STATUS_NO_DEFAULT_RECORDER. + * @see DVBLinkRemoteStatusCode + */ + const std::string DVBLINK_REMOTE_STATUS_DESC_NO_DEFAULT_RECORDER = "No default recorder is configured"; + + /** + * A constant string representing a description of the DVBLink Remote API status code DVBLINK_REMOTE_STATUS_MCE_CONNECTION_ERROR. + * @see DVBLinkRemoteStatusCode + */ + const std::string DVBLINK_REMOTE_STATUS_DESC_MCE_CONNECTION_ERROR = "An error occurred when trying to establish a connection to Windows Media Center"; + + /** + * A constant string representing a description of the DVBLink Remote API status code DVBLINK_REMOTE_STATUS_CONNECTION_ERROR. + * @see DVBLinkRemoteStatusCode + */ + const std::string DVBLINK_REMOTE_STATUS_DESC_CONNECTION_ERROR = "An error occurred when trying to establish a connection to the DVBLink Connect! Server"; + + /** + * A constant string representing a description of the DVBLink Remote API status code DVBLINK_REMOTE_STATUS_UNAUTHORISED. + * @see DVBLinkRemoteStatusCode + */ + const std::string DVBLINK_REMOTE_STATUS_DESC_UNAUTHORIZED = "An authentication error occurred when trying to establish a connection to the DVBLink Connect! Server"; + + /** + * Interface representing the available DVBLink Remote API methods. + * This is the interface for communicating with a DVBLink Connect! server. This + * class is abstract. + */ + class IDVBLinkRemoteConnection + { + public: + virtual ~IDVBLinkRemoteConnection(); + + /** + * Gets a list of all available channels. + * @param[in] request A constant GetChannelsRequest reference representing the get channel request criterias. + * @param[in,out] response A ChannelList reference that will be populated with channels. + * @return A DVBLinkRemoteStatusCode representing the status of the executed method. + */ + virtual DVBLinkRemoteStatusCode GetChannels(const GetChannelsRequest& request, ChannelList& response) = 0; + + /** + * Search the electronic program guide (EPG). + * @param[in] request A constant GetChannelsRequest reference representing the EPG search request criterias. + * @param[in,out] response A EpgSearchResult reference that will be populated with ChannelEPGData objects. + * @return A DVBLinkRemoteStatusCode representing the status of the executed method. + */ + virtual DVBLinkRemoteStatusCode SearchEpg(const EpgSearchRequest& request, EpgSearchResult& response) = 0; + + /** + * Start stream of a channel. + * @param[in] request A constant StreamRequest reference representing the stream request criterias. + * @param[in,out] response A Stream reference that will be populated with details of a playing stream. + * @return A DVBLinkRemoteStatusCode representing the status of the executed method. + */ + virtual DVBLinkRemoteStatusCode PlayChannel(const StreamRequest& request, Stream& response) = 0; + + /** + * Stop a streaming channel or channels. + * @param[in] request A constant StopStreamRequest reference representing the stop stream request criterias. + * @return A DVBLinkRemoteStatusCode representing the status of the executed method. + */ + virtual DVBLinkRemoteStatusCode StopChannel(const StopStreamRequest& request) = 0; + + /** + * Add a schedule. + * @param[in] request A constant AddScheduleRequest reference representing the add schedule request criterias. + * @return A DVBLinkRemoteStatusCode representing the status of the executed method. + */ + virtual DVBLinkRemoteStatusCode AddSchedule(const AddScheduleRequest& request) = 0; + + /** + * Gets a list of all schedules. + * @param[in] request A constant GetSchedulesRequest reference representing the get schedules request criterias. + * @param[in,out] response A ScheduleList reference that will be populated with Schedule objects. + * @return A DVBLinkRemoteStatusCode representing the status of the executed method. + */ + virtual DVBLinkRemoteStatusCode GetSchedules(const GetSchedulesRequest& request, StoredSchedules& response) = 0; + + /** + * Update a schedule. + * @param[in] request A constant UpdateScheduleReqest reference representing the update schedule request criterias. + * @return A DVBLinkRemoteStatusCode representing the status of the executed method. + */ + virtual DVBLinkRemoteStatusCode UpdateSchedule(const UpdateScheduleRequest& request) = 0; + + /** + * Remove a schedule. + * @param[in] request A constant RemoveScheduleRequest reference representing the remove schedule request criterias. + * @return A DVBLinkRemoteStatusCode representing the status of the executed method. + */ + virtual DVBLinkRemoteStatusCode RemoveSchedule(const RemoveScheduleRequest& request) = 0; + + /** + * Gets a list of all recordings. + * @param[in] request A constant GetRecordingsRequest reference representing the get recordings request criterias. + * @param[in,out] response A RecordingList reference that will be populated with Recording objects. + * @return A DVBLinkRemoteStatusCode representing the status of the executed method. + */ + virtual DVBLinkRemoteStatusCode GetRecordings(const GetRecordingsRequest& request, RecordingList& response) = 0; + + /** + * Removes a recording. + * @param[in] request A constant RemoveRecordingRequest reference representing the remove recording request criterias. + * @return A DVBLinkRemoteStatusCode representing the status of the executed method. + */ + virtual DVBLinkRemoteStatusCode RemoveRecording(const RemoveRecordingRequest& request) = 0; + + /** + * Get parental status. + * @param[in] request A constant GetParentalStatusRequest reference representing the get parental status request criterias. + * @param[in,out] response A ParentalStatus reference that will be populated with parental status details. + * @return A DVBLinkRemoteStatusCode representing the status of the executed method. + */ + virtual DVBLinkRemoteStatusCode GetParentalStatus(const GetParentalStatusRequest& request, ParentalStatus& response) = 0; + + /** + * Sets the parental lock. + * @param[in] request A constant SetParentalLockRequest reference representing the set parental lock request criterias. + * @param[in,out] response A ParentalStatus reference that will be populated with parental status details. + * @return A DVBLinkRemoteStatusCode representing the status of the executed method. + */ + virtual DVBLinkRemoteStatusCode SetParentalLock(const SetParentalLockRequest& request, ParentalStatus& response) = 0; + + /** + * Gets a M3U playlist with direct HTTP links to all channels. + * @param[in] request A constant GetM3uPlaylistRequest reference representing the get M3U playlist request criterias. + * @param[in,out] response A M3uPlaylist reference that will be populated with M3U playlist file content. + * @return A DVBLinkRemoteStatusCode representing the status of the executed method. + */ + virtual DVBLinkRemoteStatusCode GetM3uPlaylist(const GetM3uPlaylistRequest& request, M3uPlaylist& response) = 0; + + /** + * Gets a playback object. + * @param[in] request A constant GetPlaybackObjectRequest reference representing the get playback object request criterias. + * @param[in,out] response A GetObjectResult reference that will be populated with playback object details. + * @return A DVBLinkRemoteStatusCode representing the status of the executed method. + */ + virtual DVBLinkRemoteStatusCode GetPlaybackObject(const GetPlaybackObjectRequest& request, GetPlaybackObjectResponse& response ) = 0; + + /** + * Remove a playback object. + * @param[in] request A constant RemovePlaybackObjectRequest reference representing the remove playback object request criterias. + * @return A DVBLinkRemoteStatusCode representing the status of the executed method. + */ + virtual DVBLinkRemoteStatusCode RemovePlaybackObject(const RemovePlaybackObjectRequest& request) = 0; + + /** + * Stops a recording. + * @param[in] request A constant StopRecordingRequest reference representing the stop recording request criterias. + * @return A DVBLinkRemoteStatusCode representing the status of the executed method. + */ + virtual DVBLinkRemoteStatusCode StopRecording(const StopRecordingRequest& request) = 0; + + /** + * Gets streams and protocols actually supported by a given instance of DVBLink server. + * @param[in] request A constant GetStreamingCapabilitiesRequest reference representing the get streaming capabilities request criterias. + * @param[in,out] response A StreamingCapabilities reference that will be populated with streaming capability details. + * @return A DVBLinkRemoteStatusCode representing the status of the executed method. + */ + virtual DVBLinkRemoteStatusCode GetStreamingCapabilities(const GetStreamingCapabilitiesRequest& request, StreamingCapabilities& response) = 0; + + /** + * Gets recording settings. + * @param[in] request A constant GetRecordingSettingsRequest reference representing the get recording settings request criterias. + * @param[in,out] response A RecordingSettings reference that will be populated with recording settings details. + * @return A DVBLinkRemoteStatusCode representing the status of the executed method. + */ + virtual DVBLinkRemoteStatusCode GetRecordingSettings(const GetRecordingSettingsRequest& request, RecordingSettings& response) = 0; + + /** + * Sets the recording settings. + * @param[in] request A constant SetRecordingSettingsRequest reference representing the set recording settings request criterias. + * @return A DVBLinkRemoteStatusCode representing the status of the executed method. + */ + virtual DVBLinkRemoteStatusCode SetRecordingSettings(const SetRecordingSettingsRequest& request) = 0; + + /** + * Gets a description of the last occured error. + * @param[in,out] err A string reference representing the string where the description of the last error will be provided. + */ + virtual void GetLastError(std::string& err) = 0; + }; + + /** + * Class used for connecting to a DVBLink Connect! server. + */ + class DVBLinkRemote + { + public: + /** + * Connect to a DVBLink Connect! server and recieve a IDVBLinkRemoteConnection instance for executing DVBLink Remote API methods against it. + * @param[in] httpClient A dvblinkremotehttp::HttpClient reference to be used for sending and recieving HTTP requests/responses to/from the DVBLink Connect! server. + * @param[in] hostAddress A constanst string reference representing the host address of the DVBLink Connect! server. + * @param[in] port A constanst long representing the base streaming port of the DVBLink Connect! server. + */ + static IDVBLinkRemoteConnection* Connect(dvblinkremotehttp::HttpClient& httpClient, const std::string& hostAddress, const long port); + + /** + * Connect to a DVBLink Connect! server and recieve a IDVBLinkRemoteConnection instance for executing DVBLink Remote API methods against it. + * @param[in] httpClient A dvblinkremotehttp::HttpClient reference to be used for sending and recieving HTTP requests/responses to/from the DVBLink Connect! server. + * @param[in] hostAddress A constanst string reference representing the host address of the DVBLink Connect! server. + * @param[in] port A constanst long representing the base streaming port of the DVBLink Connect! server. + * @param[in] username A constanst string reference representing the user name to be used for authentication towards the DVBLink Connect! server. + * @param[in] password A constanst string reference representing the password to be used for authentication towards the DVBLink Connect! server. + */ + static IDVBLinkRemoteConnection* Connect(dvblinkremotehttp::HttpClient& httpClient, const std::string& hostAddress, const long port, const std::string& username, const std::string& password); + + /** + * Gets the copyright notice of the DVBLink Remote API library. + * @param[in,out] copyright A string reference representing the string where the copyright notice will be provided. + */ + static void GetCopyrightNotice(std::string& copyright); + + /** + * Gets the version information of the DVBLink Remote API library. + * @param[in,out] version A string reference representing the string where the version information will be provided. + */ + static void GetVersion(std::string& version); + + /** + * Gets the version numbers of the DVBLink Remote API library. + * @param[in,out] major An integer reference representing the integer where the major version information will be provided. + * @param[in,out] minor An integer reference representing the integer where the minor version information will be provided. + * @param[in,out] patch An integer reference representing the integer where the patch version information will be provided. + */ + static void GetVersion(int& major, int& minor, int& patch); + }; +}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/dvblinkremotehttp.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremotehttp.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/dvblinkremotehttp.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremotehttp.cpp 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,82 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "dvblinkremotehttp.h" + +using namespace dvblinkremotehttp; + +HttpWebRequest::HttpWebRequest(const std::string& url) + : m_url(url) +{ + Method = DVBLINK_REMOTE_HTTP_POST_METHOD; + ContentType = ""; + ContentLength = 0; + m_requestData = ""; +} + +HttpWebRequest::~HttpWebRequest() +{ + +} + +std::string& HttpWebRequest::GetUrl() +{ + return m_url; +} + +std::string& HttpWebRequest::GetRequestData() +{ + return m_requestData; +} + +void HttpWebRequest::SetRequestData(const std::string& data) +{ + m_requestData = data; +} + +HttpWebResponse::HttpWebResponse(const int statusCode, const std::string& responseData) + : m_statusCode(statusCode), + m_responseData(responseData) +{ + ContentType = ""; + ContentLength = 0; +} + +HttpWebResponse::~HttpWebResponse() +{ + +} + +int HttpWebResponse::GetStatusCode() +{ + return m_statusCode; +} + +std::string& HttpWebResponse::GetResponseData() +{ + return m_responseData; +} + +HttpClient::~HttpClient() +{ +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/dvblinkremotehttp.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremotehttp.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/dvblinkremotehttp.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremotehttp.h 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,202 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#pragma once + +#include + +/** + * Namespace for HTTP specific functionality in the DVBLink Remote API library. + */ +namespace dvblinkremotehttp +{ + /** + * A constant string representing the HTTP method for post-requests. + */ + const std::string DVBLINK_REMOTE_HTTP_POST_METHOD = "POST"; + + /** + * A constant string representing the name of the HTTP header Accept. + */ + const std::string DVBLINK_REMOTE_HTTP_HEADER_ACCEPT = "Accept"; + + /** + * A constant string representing the name of the HTTP header Accept-Charset. + */ + const std::string DVBLINK_REMOTE_HTTP_HEADER_ACCEPT_CHARSET = "Accept-Charset"; + + /** + * A constant string representing the name of the HTTP header Content-Type. + */ + const std::string DVBLINK_REMOTE_HTTP_HEADER_CONTENT_TYPE = "Content-Type"; + + /** + * Class for defining a HTTP web request. + * This is used as input parameter for the HttpClient::SendRequest() method. + * @see HttpClient::SendRequest() + */ + class HttpWebRequest + { + public: + /** + * Initializes a new instance of the dvblinkremotehttp::HttpWebRequest class. + * @param url A constant string representing the URL for which the request will be sent. + */ + HttpWebRequest(const std::string& url); + + /** + * Destructor for cleaning up allocated memory. + */ + ~HttpWebRequest(); + + /** + * Gets the URL. + * @return A string reference + */ + std::string& GetUrl(); + + /** + * Gets the data to be sent in the request (using POST method). + * @return A string reference + */ + std::string& GetRequestData(); + + /** + * Sets the data to be sent in the request (using POST method). + * @param data A constant string reference representing the data to be sent in the request. + */ + void SetRequestData(const std::string& data); + + /** + * The HTTP method to be used in request. + * @see DVBLINK_REMOTE_HTTP_POST_METHOD for definition of the POST-method. + */ + std::string Method; + + /** + * The MIME type of the data to be sent in request (using POST method). + */ + std::string ContentType; + + /** + * The length of the data to be sent in request (using POST method). + */ + long ContentLength; + + /** + * The user name to be used for basic authentication sent in request. + */ + std::string UserName; + + /** + * The password to be used for basic authentication sent in request. + */ + std::string Password; + + private: + std::string m_url; + std::string m_requestData; + }; + + /** + * Class for defining a HTTP web response. + * This is used as return parameter for the HttpClient::GetResponse method. + * @see HttpClient::GetResponse() + */ + class HttpWebResponse + { + public: + /** + * Initializes a new instance of the dvblinkremotehttp::HttpWebResponse class. + * @param statusCode A constant integer representing the HTTP response code. + * @param responseData A constant string reference representing the HTTP response data. + */ + HttpWebResponse(const int statusCode, const std::string& responseData); + + /** + * Destructor for cleaning up allocated memory. + */ + ~HttpWebResponse(); + + /** + * Gets the HTTP response code. + * @return An integer value + */ + int GetStatusCode(); + + /** + * Gets the HTTP response data. + * @return A string reference + */ + std::string& GetResponseData(); + + /** + * The HTTP response data MIME type. + */ + std::string ContentType; + + /** + * The HTTP response data length. + */ + long ContentLength; + + private: + int m_statusCode; + std::string m_responseData; + }; + + /** + * An abstract base class for communicating with a server using the HTTP protocol. + */ + class HttpClient + { + public: + virtual ~HttpClient(); + + /** + * Send a HTTP request. + * @param[in] request A HttpWebRequest reference representing the HTTP request to be sent. + * @return Boolean value representing if sending the HTTP request was successful or not. + */ + virtual bool SendRequest(HttpWebRequest& request) = 0; + + /** + * Get the HTTP response returned from a HTTP request. + @return HttpWebResponse pointer representing the response returned from server. + */ + virtual HttpWebResponse* GetResponse() = 0; + + /** + * Gets a description of the last occured error. + * @param[in,out] err A string reference representing the string where the description of the last error will be provided. + */ + virtual void GetLastError(std::string& err) = 0; + + /** + * URL encodes a string. + * @param[in] str A constant string reference representing the url to be encoded. + * @param[in,out] outEncodedStr A constant string reference where the encoded url will be written. + */ + virtual void UrlEncode(const std::string& str, std::string& outEncodedStr) = 0; + }; +}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/dvblinkremoteserialization.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremoteserialization.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/dvblinkremoteserialization.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremoteserialization.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,49 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#pragma once + +#include + +/** + * Namespace for serialization specific functionality in the DVBLink Remote API library. + */ +namespace dvblinkremoteserialization { + /** + * A constant string representing the XML declaration part for XML data used in all requests + * in the DVBLink Remote API library. + */ + const std::string DVBLINK_REMOTE_SERIALIZATION_XML_DECLARATION = "xml version=\"1.0\" encoding=\"utf-8\" "; + + /** + * A constant string representing the xmlns:i namespace of the XML root node part off every + * requests made in the DVBLink Remote API library. + */ + const std::string DVBLINK_REMOTE_SERIALIZATION_XML_I_NAMESPACE = "http://www.w3.org/2001/XMLSchema-instance"; + + /** + * A constant string representing the xmlns namespace of the XML root node part off every + * requests made in the DVBLink Remote API library. + */ + const std::string DVBLINK_REMOTE_SERIALIZATION_XML_NAMESPACE = "http://www.dvblogic.com"; +}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/epg.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/epg.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/epg.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/epg.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,261 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "request.h" +#include "xml_object_serializer.h" + +using namespace dvblinkremote; +using namespace dvblinkremoteserialization; + +const long EpgSearchRequest::EPG_SEARCH_TIME_NOT_BOUND = -1; + +EpgSearchRequest::EpgSearchRequest(const std::string& channelId, const long startTime, const long endTime, const bool shortEpg) +{ + m_channelIdList = new ChannelIdentifierList(); + m_channelIdList->push_back(channelId); + ProgramID = ""; + Keywords = ""; + m_startTime = startTime; + m_endTime = endTime; + m_shortEpg = shortEpg; +} + +EpgSearchRequest::EpgSearchRequest(const ChannelIdentifierList& channelIdentifierList, const long startTime, const long endTime, const bool shortEpg) +{ + m_channelIdList = new ChannelIdentifierList(channelIdentifierList); + ProgramID = ""; + Keywords = ""; + m_startTime = startTime; + m_endTime = endTime; + m_shortEpg = shortEpg; +} + +EpgSearchRequest::~EpgSearchRequest() +{ + delete m_channelIdList; +} + +ChannelIdentifierList& EpgSearchRequest::GetChannelIdentifiers() +{ + return *m_channelIdList; +} + +void EpgSearchRequest::AddChannelID(const std::string& channelId) +{ + m_channelIdList->push_back(channelId); +} + +long EpgSearchRequest::GetStartTime() { return m_startTime; } + +void EpgSearchRequest::SetStartTime(const long startTime) { m_startTime = startTime; } + +long EpgSearchRequest::GetEndTime() { return m_endTime; } + +void EpgSearchRequest::SetEndTime(const long endTime) { m_endTime = endTime; } + +bool EpgSearchRequest::IsShortEpg() { return m_shortEpg; } + +void EpgSearchRequest::SetShortEpg(const bool shortEpg) { m_shortEpg = shortEpg; } + +EpgData::EpgData() +{ + +} + +EpgData::EpgData(EpgData& epgData) +{ + for (std::vector::iterator it = epgData.begin(); it < epgData.end(); it++) + { + Program* program = new Program(*((Program*)*it)); + push_back(program); + } +} + +EpgData::~EpgData() +{ + for (std::vector::iterator it = begin(); it < end(); it++) + { + delete (*it); + } +} + +ChannelEpgData::ChannelEpgData(const std::string& channelId) + : m_channelId(channelId) +{ + m_epgData = new EpgData(); +} + +ChannelEpgData::ChannelEpgData(ChannelEpgData& channelEpgData) + : m_channelId(channelEpgData.GetChannelID()) +{ + m_epgData = new EpgData(channelEpgData.GetEpgData()); +} + +ChannelEpgData::~ChannelEpgData() +{ + delete m_epgData; +} + +std::string& ChannelEpgData::GetChannelID() +{ + return m_channelId; +} + +EpgData& ChannelEpgData::GetEpgData() +{ + return *m_epgData; +} + +void ChannelEpgData::AddProgram(const Program* program) +{ + m_epgData->push_back((Program*)program); +} + +ChannelIdentifierList::ChannelIdentifierList() +{ + +} + +ChannelIdentifierList::~ChannelIdentifierList() +{ + +} + +EpgSearchResult::EpgSearchResult() +{ + +} + +EpgSearchResult::~EpgSearchResult() +{ + for (std::vector::iterator it = begin(); it < end(); it++) + { + delete (*it); + } +} + +bool EpgSearchRequestSerializer::WriteObject(std::string& serializedData, EpgSearchRequest& objectGraph) +{ + tinyxml2::XMLElement* rootElement = PrepareXmlDocumentForObjectSerialization("epg_searcher"); + tinyxml2::XMLElement* xmlChannelIdsElement = rootElement->GetDocument()->NewElement("channels_ids"); + + for (ChannelIdentifierList::iterator it = objectGraph.GetChannelIdentifiers().begin(); it < objectGraph.GetChannelIdentifiers().end(); it++) + { + xmlChannelIdsElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "channel_id", (*it))); + } + + rootElement->InsertEndChild(xmlChannelIdsElement); + + if (!objectGraph.ProgramID.empty()) { + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "program_id", objectGraph.ProgramID)); + } + + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "keywords", objectGraph.Keywords)); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "start_time", objectGraph.GetStartTime())); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "end_time", objectGraph.GetEndTime())); + + if (objectGraph.IsShortEpg()) { + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "epg_short", objectGraph.IsShortEpg())); + } + + tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); + GetXmlDocument().Accept(printer); + serializedData = std::string(printer->CStr()); + + return true; +} + +bool EpgSearchResponseSerializer::ReadObject(EpgSearchResult& object, const std::string& xml) +{ + tinyxml2::XMLDocument& doc = GetXmlDocument(); + + if (doc.Parse(xml.c_str()) == tinyxml2::XML_NO_ERROR) { + tinyxml2::XMLElement* elRoot = doc.FirstChildElement("epg_searcher"); + ChannelEpgXmlDataDeserializer* xmlDataDeserializer = new ChannelEpgXmlDataDeserializer(*this, object); + elRoot->Accept(xmlDataDeserializer); + delete xmlDataDeserializer; + + return true; + } + + return false; +} + +EpgSearchResponseSerializer::ChannelEpgXmlDataDeserializer::ChannelEpgXmlDataDeserializer(EpgSearchResponseSerializer& parent, EpgSearchResult& epgSearchResult) + : m_parent(parent), m_epgSearchResult(epgSearchResult) +{ + +} + +EpgSearchResponseSerializer::ChannelEpgXmlDataDeserializer::~ChannelEpgXmlDataDeserializer() +{ + +} + +bool EpgSearchResponseSerializer::ChannelEpgXmlDataDeserializer::VisitEnter(const tinyxml2::XMLElement& element, const tinyxml2::XMLAttribute* attribute) +{ + if (strcmp(element.Name(), "channel_epg") == 0) + { + std::string channelId = Util::GetXmlFirstChildElementText(&element, "channel_id"); + + if (!channelId.empty()) { + ChannelEpgData* channelEpgData = new ChannelEpgData(channelId); + + ProgramListXmlDataDeserializer* xmlDataDeserializer = new ProgramListXmlDataDeserializer(m_parent, *channelEpgData); + element.FirstChildElement("dvblink_epg")->Accept(xmlDataDeserializer); + delete xmlDataDeserializer; + + m_epgSearchResult.push_back(channelEpgData); + } + + return false; + } + + return true; +} + +EpgSearchResponseSerializer::ProgramListXmlDataDeserializer::ProgramListXmlDataDeserializer(EpgSearchResponseSerializer& parent, ChannelEpgData& channelEpgData) + : m_parent(parent), m_channelEpgData(channelEpgData) +{ + +} + +EpgSearchResponseSerializer::ProgramListXmlDataDeserializer::~ProgramListXmlDataDeserializer() +{ + +} + +bool EpgSearchResponseSerializer::ProgramListXmlDataDeserializer::VisitEnter(const tinyxml2::XMLElement& element, const tinyxml2::XMLAttribute* attribute) +{ + if (strcmp(element.Name(), "program") == 0) + { + Program* p = new Program(); + ProgramSerializer::Deserialize((XmlObjectSerializer&)m_parent, element, *p); + + m_channelEpgData.AddProgram(p); + + return false; + } + + return true; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/generic_response.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/generic_response.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/generic_response.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/generic_response.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,95 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "generic_response.h" +#include "xml_object_serializer.h" + +using namespace dvblinkremote; +using namespace dvblinkremoteserialization; + +GenericResponse::GenericResponse() +{ + m_statusCode = DVBLINK_REMOTE_STATUS_OK; + m_xmlResult = ""; +} + +GenericResponse::GenericResponse(const int statusCode, const std::string& xmlResult) + : m_statusCode(statusCode), m_xmlResult(xmlResult) +{ + +} + +GenericResponse::~GenericResponse() +{ + +}; + +int GenericResponse::GetStatusCode(void) +{ + return m_statusCode; +} + +void GenericResponse::SetStatusCode(const int statusCode) +{ + m_statusCode = statusCode; +} + +std::string& GenericResponse::GetXmlResult() +{ + return m_xmlResult; +} + +void GenericResponse::SetXmlResult(const std::string& xmlResult) +{ + m_xmlResult = std::string(xmlResult); +} + +GenericResponseSerializer::GenericResponseSerializer() + : XmlObjectSerializer() +{ + +} + +bool GenericResponseSerializer::ReadObject(GenericResponse& object, const std::string& xml) +{ + tinyxml2::XMLDocument& doc = GetXmlDocument(); + + if (doc.Parse(xml.c_str()) == tinyxml2::XML_NO_ERROR) { + tinyxml2::XMLElement* elRoot = doc.FirstChildElement("response"); + int statusCode = Util::GetXmlFirstChildElementTextAsInt(elRoot, "status_code"); + + if (statusCode == -1) { + object.SetStatusCode(DVBLINK_REMOTE_STATUS_INVALID_DATA); + } + + std::string xml_result = std::string(Util::GetXmlFirstChildElementText(elRoot, "xml_result")); + + if (!xml_result.empty()) { + object.SetXmlResult(xml_result); + } + + return true; + } + + return false; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/generic_response.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/generic_response.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/generic_response.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/generic_response.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,46 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#pragma once + +#include +#include "dvblinkremote.h" + +namespace dvblinkremote { + class GenericResponse + { + public: + GenericResponse(); + GenericResponse(const int statusCode, const std::string& xmlResult); + ~GenericResponse(); + + int GetStatusCode(); + void SetStatusCode(const int statusCode); + std::string& GetXmlResult(); + void SetXmlResult(const std::string& xmlResult); + + private: + int m_statusCode; + std::string m_xmlResult; + }; +}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/item_metadata.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/item_metadata.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/item_metadata.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/item_metadata.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,255 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "response.h" +#include "xml_object_serializer.h" + +using namespace dvblinkremote; +using namespace dvblinkremoteserialization; + +ItemMetadata::ItemMetadata() +{ + m_title = ""; + m_startTime = 0; + m_duration = 0; + ShortDescription = ""; + SubTitle = ""; + Language = ""; + Actors = ""; + Directors = ""; + Writers = ""; + Producers = ""; + Guests = ""; + Keywords = ""; + Image = ""; + Year = 0; + EpisodeNumber = 0; + SeasonNumber = 0; + Rating = 0; + MaximumRating = 0; + IsHdtv = false; + IsPremiere = false; + IsRepeat = false; + IsSeries = false; + IsRecord = false; + IsRepeatRecord = false; + IsCatAction = false; + IsCatComedy = false; + IsCatDocumentary = false; + IsCatDrama = false; + IsCatEducational = false; + IsCatHorror = false; + IsCatKids = false; + IsCatMovie = false; + IsCatMusic = false; + IsCatNews = false; + IsCatReality = false; + IsCatRomance = false; + IsCatScifi = false; + IsCatSerial = false; + IsCatSoap = false; + IsCatSpecial = false; + IsCatSports = false; + IsCatThriller = false; + IsCatAdult = false; +} + +ItemMetadata::ItemMetadata(const std::string& title, const long startTime, const long duration) + : m_title(title), + m_startTime(startTime), + m_duration(duration) +{ + ShortDescription = ""; + SubTitle = ""; + Language = ""; + Actors = ""; + Directors = ""; + Writers = ""; + Producers = ""; + Guests = ""; + Keywords = ""; + Image = ""; + Year = 0; + EpisodeNumber = 0; + SeasonNumber = 0; + Rating = 0; + MaximumRating = 0; + IsHdtv = false; + IsPremiere = false; + IsRepeat = false; + IsSeries = false; + IsRecord = false; + IsRepeatRecord = false; + IsCatAction = false; + IsCatComedy = false; + IsCatDocumentary = false; + IsCatDrama = false; + IsCatEducational = false; + IsCatHorror = false; + IsCatKids = false; + IsCatMovie = false; + IsCatMusic = false; + IsCatNews = false; + IsCatReality = false; + IsCatRomance = false; + IsCatScifi = false; + IsCatSerial = false; + IsCatSoap = false; + IsCatSpecial = false; + IsCatSports = false; + IsCatThriller = false; + IsCatAdult = false; +} + +ItemMetadata::ItemMetadata(ItemMetadata& itemMetadata) + : m_title(itemMetadata.GetTitle()), + m_startTime(itemMetadata.GetStartTime()), + m_duration(itemMetadata.GetDuration()) +{ + ShortDescription = itemMetadata.ShortDescription; + SubTitle = itemMetadata.SubTitle; + Language = itemMetadata.Language; + Actors = itemMetadata.Actors; + Directors = itemMetadata.Directors; + Writers = itemMetadata.Writers; + Producers = itemMetadata.Producers; + Guests = itemMetadata.Guests; + Keywords = itemMetadata.Keywords; + Image = itemMetadata.Image; + Year = itemMetadata.Year; + EpisodeNumber = itemMetadata.EpisodeNumber; + SeasonNumber = itemMetadata.SeasonNumber; + Rating = itemMetadata.Rating; + MaximumRating = itemMetadata.MaximumRating; + IsHdtv = itemMetadata.IsHdtv; + IsPremiere = itemMetadata.IsPremiere; + IsRepeat = itemMetadata.IsRepeat; + IsSeries = itemMetadata.IsSeries; + IsRecord = itemMetadata.IsRecord; + IsRepeatRecord = itemMetadata.IsRepeatRecord; + IsCatAction = itemMetadata.IsCatAction; + IsCatComedy = itemMetadata.IsCatComedy; + IsCatDocumentary = itemMetadata.IsCatDocumentary; + IsCatDrama = itemMetadata.IsCatDrama; + IsCatEducational = itemMetadata.IsCatEducational; + IsCatHorror = itemMetadata.IsCatHorror; + IsCatKids = itemMetadata.IsCatKids; + IsCatMovie = itemMetadata.IsCatMovie; + IsCatMusic = itemMetadata.IsCatMusic; + IsCatNews = itemMetadata.IsCatNews; + IsCatReality = itemMetadata.IsCatReality; + IsCatRomance = itemMetadata.IsCatRomance; + IsCatScifi = itemMetadata.IsCatScifi; + IsCatSerial = itemMetadata.IsCatSerial; + IsCatSoap = itemMetadata.IsCatSoap; + IsCatSpecial = itemMetadata.IsCatSpecial; + IsCatSports = itemMetadata.IsCatSports; + IsCatThriller = itemMetadata.IsCatThriller; + IsCatAdult = itemMetadata.IsCatAdult; +} + +ItemMetadata::~ItemMetadata() +{ + +} + +std::string& ItemMetadata::GetTitle() +{ + return m_title; +} + +void ItemMetadata::SetTitle(const std::string& title) +{ + m_title = title; +} + +long ItemMetadata::GetStartTime() +{ + return m_startTime; +} + +void ItemMetadata::SetStartTime(const long startTime) +{ + m_startTime = startTime; +} + +long ItemMetadata::GetDuration() +{ + return m_duration; +} + +void ItemMetadata::SetDuration(const long duration) +{ + m_duration = duration; +} + +void ItemMetadataSerializer::Deserialize(XmlObjectSerializer& objectSerializer, const tinyxml2::XMLElement& element, dvblinkremote::ItemMetadata& itemMetadata) +{ + itemMetadata.SetTitle(Util::GetXmlFirstChildElementText(&element, "name")); + itemMetadata.SetStartTime(Util::GetXmlFirstChildElementTextAsLong(&element, "start_time")); + itemMetadata.SetDuration(Util::GetXmlFirstChildElementTextAsLong(&element, "duration")); + + itemMetadata.ShortDescription = Util::GetXmlFirstChildElementText(&element, "short_desc"); + itemMetadata.SubTitle = Util::GetXmlFirstChildElementText(&element, "subname"); + itemMetadata.Language = Util::GetXmlFirstChildElementText(&element, "language"); + itemMetadata.Actors = Util::GetXmlFirstChildElementText(&element, "actors"); + itemMetadata.Directors = Util::GetXmlFirstChildElementText(&element, "directors"); + itemMetadata.Writers = Util::GetXmlFirstChildElementText(&element, "writers"); + itemMetadata.Producers = Util::GetXmlFirstChildElementText(&element, "producers"); + itemMetadata.Guests = Util::GetXmlFirstChildElementText(&element, "guests"); + itemMetadata.Keywords = Util::GetXmlFirstChildElementText(&element, "categories"); + itemMetadata.Image = Util::GetXmlFirstChildElementText(&element, "image"); + + itemMetadata.Year = Util::GetXmlFirstChildElementTextAsLong(&element, "year"); + itemMetadata.EpisodeNumber = Util::GetXmlFirstChildElementTextAsLong(&element, "episode_num"); + itemMetadata.SeasonNumber = Util::GetXmlFirstChildElementTextAsLong(&element, "season_num"); + itemMetadata.Rating = Util::GetXmlFirstChildElementTextAsLong(&element, "stars_num"); + itemMetadata.MaximumRating = Util::GetXmlFirstChildElementTextAsLong(&element, "starsmax_num"); + + itemMetadata.IsHdtv = objectSerializer.HasChildElement(*&element, "hdtv"); + itemMetadata.IsPremiere = objectSerializer.HasChildElement(*&element, "premiere"); + itemMetadata.IsRepeat = objectSerializer.HasChildElement(*&element, "repeat"); + itemMetadata.IsSeries = objectSerializer.HasChildElement(*&element, "is_series"); + itemMetadata.IsRecord = objectSerializer.HasChildElement(*&element, "is_record"); + itemMetadata.IsRepeatRecord = objectSerializer.HasChildElement(*&element, "is_repeat_record"); + + itemMetadata.IsCatAction = objectSerializer.HasChildElement(*&element, "cat_action"); + itemMetadata.IsCatComedy = objectSerializer.HasChildElement(*&element, "cat_comedy"); + itemMetadata.IsCatDocumentary = objectSerializer.HasChildElement(*&element, "cat_documentary"); + itemMetadata.IsCatDrama = objectSerializer.HasChildElement(*&element, "cat_drama"); + itemMetadata.IsCatEducational = objectSerializer.HasChildElement(*&element, "cat_educational"); + itemMetadata.IsCatHorror = objectSerializer.HasChildElement(*&element, "cat_horror"); + itemMetadata.IsCatKids = objectSerializer.HasChildElement(*&element, "cat_kids"); + itemMetadata.IsCatMovie = objectSerializer.HasChildElement(*&element, "cat_movie"); + itemMetadata.IsCatMusic = objectSerializer.HasChildElement(*&element, "cat_music"); + itemMetadata.IsCatNews = objectSerializer.HasChildElement(*&element, "cat_news"); + itemMetadata.IsCatReality = objectSerializer.HasChildElement(*&element, "cat_reality"); + itemMetadata.IsCatRomance = objectSerializer.HasChildElement(*&element, "cat_romance"); + itemMetadata.IsCatScifi = objectSerializer.HasChildElement(*&element, "cat_scifi"); + itemMetadata.IsCatSerial = objectSerializer.HasChildElement(*&element, "cat_serial"); + itemMetadata.IsCatSoap = objectSerializer.HasChildElement(*&element, "cat_soap"); + itemMetadata.IsCatSpecial = objectSerializer.HasChildElement(*&element, "cat_special"); + itemMetadata.IsCatSports = objectSerializer.HasChildElement(*&element, "cat_sports"); + itemMetadata.IsCatThriller = objectSerializer.HasChildElement(*&element, "cat_thriller"); + itemMetadata.IsCatAdult = objectSerializer.HasChildElement(*&element, "cat_adult"); +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/m3u_playlist.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/m3u_playlist.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/m3u_playlist.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/m3u_playlist.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,54 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "request.h" +#include "xml_object_serializer.h" + +using namespace dvblinkremote; +using namespace dvblinkremoteserialization; + +GetM3uPlaylistRequest::GetM3uPlaylistRequest() +{ } + +GetM3uPlaylistRequest::~GetM3uPlaylistRequest() +{ } + +bool GetM3uPlaylistRequestSerializer::WriteObject(std::string& serializedData, GetM3uPlaylistRequest& objectGraph) +{ + tinyxml2::XMLElement* rootElement = PrepareXmlDocumentForObjectSerialization("playlist_request"); + + tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); + GetXmlDocument().Accept(printer); + serializedData = std::string(printer->CStr()); + + return true; +} + +M3uPlaylist::M3uPlaylist() + : FileContent("") +{ + +} + +M3uPlaylist::~M3uPlaylist() +{ } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/Makefile.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/Makefile.am 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,35 @@ +noinst_LTLIBRARIES = libdvblinkremote.la + +libdvblinkremote_la_SOURCES = channel.cpp \ + dvblinkremote.cpp \ + dvblinkremotecommunication.cpp \ + dvblinkremotehttp.cpp \ + epg.cpp \ + generic_response.cpp \ + item_metadata.cpp \ + m3u_playlist.cpp \ + parental_lock.cpp \ + playback_container.cpp \ + playback_item.cpp \ + playback_object.cpp \ + program.cpp \ + recording.cpp \ + recording_settings.cpp \ + remove_playback_object_request.cpp \ + scheduling.cpp \ + stop_stream_request.cpp \ + stream.cpp \ + stream_request.cpp \ + streaming_capabilities.cpp \ + transcoded_video_stream_request.cpp \ + transcoding_options.cpp \ + util.cpp \ + xml_object_serializer_factory.cpp + +LIBS= @abs_top_srcdir@/lib/tinyxml2/libtinyxml2.la + +INCLUDES=-I.. + +$(LIB): libdvblinkremote.la + cp -f .libs/libdvblinkremote.a . + cp -f .libs/libdvblinkremote.la $(LIB) \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/parental_lock.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/parental_lock.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/parental_lock.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/parental_lock.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,134 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "request.h" +#include "response.h" +#include "xml_object_serializer.h" + +using namespace dvblinkremote; +using namespace dvblinkremoteserialization; + +ParentalStatus::ParentalStatus() +{ + IsEnabled = false; +} + +ParentalStatus::ParentalStatus(ParentalStatus& parentalStatus) +{ + IsEnabled = parentalStatus.IsEnabled; +} + +ParentalStatus::~ParentalStatus() +{ + +} + +GetParentalStatusRequest::GetParentalStatusRequest(const std::string& clientId) + : m_clientId(clientId) +{ + +} + +GetParentalStatusRequest::~GetParentalStatusRequest() +{ + +} + +std::string& GetParentalStatusRequest::GetClientID() +{ + return m_clientId; +} + +SetParentalLockRequest::SetParentalLockRequest(const std::string& clientId) + : m_clientId(clientId), m_enabled(false), m_code("") +{ + +} + +SetParentalLockRequest::SetParentalLockRequest(const std::string& clientId, const std::string& code) + : m_clientId(clientId), m_enabled(true), m_code(code) +{ + +} + +SetParentalLockRequest::~SetParentalLockRequest() +{ + +} + +std::string& SetParentalLockRequest::GetClientID() +{ + return m_clientId; +} + +bool SetParentalLockRequest::IsEnabled() +{ + return m_enabled; +} + +std::string& SetParentalLockRequest::GetCode() +{ + return m_code; +} + +bool ParentalStatusSerializer::ReadObject(ParentalStatus& object, const std::string& xml) +{ + tinyxml2::XMLDocument& doc = GetXmlDocument(); + + if (doc.Parse(xml.c_str()) == tinyxml2::XML_NO_ERROR) { + tinyxml2::XMLElement* elRoot = doc.FirstChildElement("parental_status"); + object.IsEnabled = Util::GetXmlFirstChildElementTextAsBoolean(elRoot, "is_enabled"); + return true; + } + + return false; +} + +bool GetParentalStatusRequestSerializer::WriteObject(std::string& serializedData, GetParentalStatusRequest& objectGraph) +{ + tinyxml2::XMLElement* rootElement = PrepareXmlDocumentForObjectSerialization("parental_lock"); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "client_id", objectGraph.GetClientID())); + + tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); + GetXmlDocument().Accept(printer); + serializedData = std::string(printer->CStr()); + + return true; +} + +bool SetParentalLockRequestSerializer::WriteObject(std::string& serializedData, SetParentalLockRequest& objectGraph) +{ + tinyxml2::XMLElement* rootElement = PrepareXmlDocumentForObjectSerialization("parental_lock"); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "client_id", objectGraph.GetClientID())); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "is_enable", objectGraph.IsEnabled())); + + if (objectGraph.IsEnabled()) { + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "code", objectGraph.GetCode())); + } + + tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); + GetXmlDocument().Accept(printer); + serializedData = std::string(printer->CStr()); + + return true; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/playback_container.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/playback_container.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/playback_container.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/playback_container.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,119 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "response.h" +#include "xml_object_serializer.h" + +using namespace dvblinkremote; +using namespace dvblinkremoteserialization; + +PlaybackContainer::PlaybackContainer(const std::string& objectId, const std::string& parentId, const std::string& name, DVBLinkPlaybackContainerType& containerType, DVBLinkPlaybackContainerContentType& containerContentType) + : PlaybackObject(PlaybackObject::PLAYBACK_OBJECT_TYPE_CONTAINER, objectId, parentId), + m_name(name), + m_containerType((DVBLinkPlaybackContainerType&)containerType), + m_containerContentType((DVBLinkPlaybackContainerContentType&)containerContentType), + Description(""), + Logo(""), + TotalCount(0), + SourceID("") +{ + +} + +PlaybackContainer::~PlaybackContainer() +{ } + +std::string& PlaybackContainer::GetName() +{ + return m_name; +} + +PlaybackContainer::DVBLinkPlaybackContainerType& PlaybackContainer::GetContainerType() +{ + return m_containerType; +} + +PlaybackContainer::DVBLinkPlaybackContainerContentType& PlaybackContainer::GetContainerContentType() +{ + return m_containerContentType; +} + +PlaybackContainerList::~PlaybackContainerList() +{ + for (std::vector::iterator it = begin(); it < end(); it++) + { + delete (*it); + } +} + +GetPlaybackObjectResponseSerializer::PlaybackContainerXmlDataDeserializer::PlaybackContainerXmlDataDeserializer(GetPlaybackObjectResponseSerializer& parent, PlaybackContainerList& playbackContainerList) + : m_parent(parent), + m_playbackContainerList(playbackContainerList) +{ + +} + +GetPlaybackObjectResponseSerializer::PlaybackContainerXmlDataDeserializer::~PlaybackContainerXmlDataDeserializer() +{ + +} + +bool GetPlaybackObjectResponseSerializer::PlaybackContainerXmlDataDeserializer::VisitEnter(const tinyxml2::XMLElement& element, const tinyxml2::XMLAttribute* attribute) +{ + if (strcmp(element.Name(), "container") == 0) + { + std::string objectId = Util::GetXmlFirstChildElementText(&element, "object_id"); + std::string parentId = Util::GetXmlFirstChildElementText(&element, "parent_id"); + std::string name = Util::GetXmlFirstChildElementText(&element, "name"); + PlaybackContainer::DVBLinkPlaybackContainerType containerType = (PlaybackContainer::DVBLinkPlaybackContainerType)Util::GetXmlFirstChildElementTextAsInt(&element, "container_type"); + PlaybackContainer::DVBLinkPlaybackContainerContentType contentType = (PlaybackContainer::DVBLinkPlaybackContainerContentType)Util::GetXmlFirstChildElementTextAsInt(&element, "content_type"); + + PlaybackContainer* playbackContainer = new PlaybackContainer(objectId, parentId, name, containerType, contentType); + + if (m_parent.HasChildElement(element, "description")) + { + playbackContainer->Description = Util::GetXmlFirstChildElementText(&element, "description"); + } + + if (m_parent.HasChildElement(element, "logo")) + { + playbackContainer->Logo = Util::GetXmlFirstChildElementText(&element, "logo"); + } + + if (m_parent.HasChildElement(element, "total_count")) + { + playbackContainer->TotalCount = Util::GetXmlFirstChildElementTextAsInt(&element, "total_count"); + } + + if (m_parent.HasChildElement(element, "source_id")) + { + playbackContainer->SourceID = Util::GetXmlFirstChildElementText(&element, "source_id"); + } + + m_playbackContainerList.push_back(playbackContainer); + + return false; + } + + return true; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/playback_item.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/playback_item.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/playback_item.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/playback_item.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,245 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "response.h" +#include "xml_object_serializer.h" + +using namespace dvblinkremote; +using namespace dvblinkremoteserialization; + +PlaybackItem::PlaybackItem(const DVBLinkPlaybackItemType itemType, const std::string& objectId, const std::string& parentId, const std::string& playbackUrl, const std::string& thumbnailUrl, const ItemMetadata* metadata) + : PlaybackObject(PlaybackObject::PLAYBACK_OBJECT_TYPE_ITEM, objectId, parentId), + m_itemType(itemType), + m_playbackUrl(playbackUrl), + m_thumbnailUrl(thumbnailUrl), + m_metadata((ItemMetadata*)metadata), + CanBeDeleted(false), + Size(0), + CreationTime(0) +{ + +} + +PlaybackItem::~PlaybackItem() +{ + if (m_metadata) { + delete m_metadata; + } +} + +PlaybackItem::DVBLinkPlaybackItemType& PlaybackItem::GetItemType() +{ + return m_itemType; +} + +std::string& PlaybackItem::GetPlaybackUrl() +{ + return m_playbackUrl; +} + +std::string& PlaybackItem::GetThumbnailUrl() +{ + return m_thumbnailUrl; +} + +ItemMetadata& PlaybackItem::GetMetadata() +{ + return *m_metadata; +} + +RecordedTvItemMetadata::RecordedTvItemMetadata() + : ItemMetadata() +{ + +} + +RecordedTvItemMetadata::RecordedTvItemMetadata(const std::string& title, const long startTime, const long duration) + : ItemMetadata(title, startTime, duration) +{ + +} + +RecordedTvItemMetadata::RecordedTvItemMetadata(RecordedTvItemMetadata& recordedTvItemMetadata) + : ItemMetadata((ItemMetadata&)recordedTvItemMetadata) +{ + +} + +RecordedTvItemMetadata::~RecordedTvItemMetadata() +{ + +} + +RecordedTvItem::RecordedTvItem(const std::string& objectId, const std::string& parentId, const std::string& playbackUrl, const std::string& thumbnailUrl, const RecordedTvItemMetadata* metadata) + : PlaybackItem(PlaybackItem::PLAYBACK_ITEM_TYPE_RECORDED_TV, objectId, parentId, playbackUrl, thumbnailUrl, (ItemMetadata*)metadata), + ChannelName(""), + ChannelNumber(0), + ChannelSubNumber(0), + State(RecordedTvItem::RECORDED_TV_ITEM_STATE_IN_PROGRESS) +{ + +} + +RecordedTvItem::~RecordedTvItem() +{ + +} + +VideoItemMetadata::VideoItemMetadata() + : ItemMetadata() +{ + +} + +VideoItemMetadata::VideoItemMetadata(const std::string& title, const long startTime, const long duration) + : ItemMetadata(title, startTime, duration) +{ + +} + +VideoItemMetadata::VideoItemMetadata(VideoItemMetadata& videoItemMetadata) + : ItemMetadata((ItemMetadata&)videoItemMetadata) +{ + +} + +VideoItemMetadata::~VideoItemMetadata() +{ + +} + +VideoItem::VideoItem(const std::string& objectId, const std::string& parentId, const std::string& playbackUrl, const std::string& thumbnailUrl, const VideoItemMetadata* metadata) + : PlaybackItem(PlaybackItem::PLAYBACK_ITEM_TYPE_VIDEO, objectId, parentId, playbackUrl, thumbnailUrl, (ItemMetadata*)metadata) +{ + +} + +VideoItem::~VideoItem() +{ + +} + +PlaybackItemList::~PlaybackItemList() +{ + for (std::vector::iterator it = begin(); it < end(); it++) + { + delete (*it); + } +} + +GetPlaybackObjectResponseSerializer::PlaybackItemXmlDataDeserializer::PlaybackItemXmlDataDeserializer(GetPlaybackObjectResponseSerializer& parent, PlaybackItemList& playbackItemList) + : m_parent(parent), + m_playbackItemList(playbackItemList) +{ + +} + +GetPlaybackObjectResponseSerializer::PlaybackItemXmlDataDeserializer::~PlaybackItemXmlDataDeserializer() +{ + +} + +bool GetPlaybackObjectResponseSerializer::PlaybackItemXmlDataDeserializer::VisitEnter(const tinyxml2::XMLElement& element, const tinyxml2::XMLAttribute* attribute) +{ + if (strcmp(element.Name(), "recorded_tv") == 0 || + strcmp(element.Name(), "video") == 0) + { + PlaybackItem* item; + std::string objectId = Util::GetXmlFirstChildElementText(&element, "object_id"); + std::string parentId = Util::GetXmlFirstChildElementText(&element, "parent_id"); + std::string playbackUrl = Util::GetXmlFirstChildElementText(&element, "url"); + std::string thumbnailUrl = Util::GetXmlFirstChildElementText(&element, "thumbnail"); + + if (strcmp(element.Name(), "recorded_tv") == 0) + { + tinyxml2::XMLElement* vElement = (tinyxml2::XMLElement*)element.FirstChildElement("video_info"); + RecordedTvItemMetadata* metadata = new RecordedTvItemMetadata(); + ItemMetadataSerializer::Deserialize((XmlObjectSerializer&)m_parent, *vElement, *metadata); + RecordedTvItem* recordedTvitem = new RecordedTvItem(objectId, parentId, playbackUrl, thumbnailUrl, metadata); + + if (m_parent.HasChildElement(element, "channel_name")) + { + recordedTvitem->ChannelName = Util::GetXmlFirstChildElementText(&element, "channel_name"); + } + + if (m_parent.HasChildElement(element, "channel_number")) + { + recordedTvitem->ChannelNumber = Util::GetXmlFirstChildElementTextAsInt(&element, "channel_number"); + } + + if (m_parent.HasChildElement(element, "channel_subnumber")) + { + recordedTvitem->ChannelSubNumber = Util::GetXmlFirstChildElementTextAsInt(&element, "channel_subnumber"); + } + + if (m_parent.HasChildElement(element, "state")) + { + recordedTvitem->State = (RecordedTvItem::DVBLinkRecordedTvItemState)Util::GetXmlFirstChildElementTextAsInt(&element, "state"); + } + + item = (PlaybackItem*)recordedTvitem; + } + else if (strcmp(element.Name(), "video") == 0) + { + tinyxml2::XMLElement* vElement = (tinyxml2::XMLElement*)element.FirstChildElement("video_info"); + VideoItemMetadata* metadata = new VideoItemMetadata(); + ItemMetadataSerializer::Deserialize((XmlObjectSerializer&)m_parent, *vElement, *metadata); + VideoItem* videoItem = new VideoItem(objectId, parentId, playbackUrl, thumbnailUrl, metadata); + item = (PlaybackItem*)videoItem; + } + + if (item) + { + if (m_parent.HasChildElement(element, "can_be_deleted")) + { + item->CanBeDeleted = Util::GetXmlFirstChildElementTextAsBoolean(&element, "can_be_deleted"); + } + + if (m_parent.HasChildElement(element, "size")) + { + item->Size = Util::GetXmlFirstChildElementTextAsLong(&element, "size"); + } + + if (m_parent.HasChildElement(element, "creation_time")) + { + item->CreationTime = Util::GetXmlFirstChildElementTextAsLong(&element, "creation_time"); + } + + m_playbackItemList.push_back(item); + } + + return false; + } + + return true; +} + +void ItemMetadataSerializer::Deserialize(XmlObjectSerializer& objectSerializer, const tinyxml2::XMLElement& element, RecordedTvItemMetadata& metadata) +{ + Deserialize(objectSerializer, element, (ItemMetadata&)metadata); +} + +void ItemMetadataSerializer::Deserialize(XmlObjectSerializer& objectSerializer, const tinyxml2::XMLElement& element, VideoItemMetadata& metadata) +{ + Deserialize(objectSerializer, element, (ItemMetadata&)metadata); +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/playback_object.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/playback_object.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/playback_object.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/playback_object.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,200 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "request.h" +#include "response.h" +#include "xml_object_serializer.h" + +using namespace dvblinkremote; +using namespace dvblinkremoteserialization; + +GetPlaybackObjectRequest::GetPlaybackObjectRequest(const std::string& serverAddress) + : m_serverAddress(serverAddress), + m_objectId(""), + RequestedObjectType(GetPlaybackObjectRequest::REQUESTED_OBJECT_TYPE_ALL), + RequestedItemType(GetPlaybackObjectRequest::REQUESTED_ITEM_TYPE_ALL), + StartPosition(0), + RequestCount(-1), + IncludeChildrenObjectsForRequestedObject(false) +{ + +} + +GetPlaybackObjectRequest::GetPlaybackObjectRequest(const std::string& serverAddress, const std::string& objectId) + : m_serverAddress(serverAddress), + m_objectId(objectId), + RequestedObjectType(GetPlaybackObjectRequest::REQUESTED_OBJECT_TYPE_ALL), + RequestedItemType(GetPlaybackObjectRequest::REQUESTED_ITEM_TYPE_ALL), + StartPosition(0), + RequestCount(-1), + IncludeChildrenObjectsForRequestedObject(false) +{ + +} + +GetPlaybackObjectRequest::~GetPlaybackObjectRequest() +{ } + +std::string& GetPlaybackObjectRequest::GetServerAddress() +{ + return m_serverAddress; +} + +std::string& GetPlaybackObjectRequest::GetObjectID() +{ + return m_objectId; +} + +bool GetPlaybackObjectRequestSerializer::WriteObject(std::string& serializedData, GetPlaybackObjectRequest& objectGraph) +{ + tinyxml2::XMLElement* rootElement = PrepareXmlDocumentForObjectSerialization("object_requester"); + + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "object_id", objectGraph.GetObjectID())); + + if (objectGraph.RequestedObjectType != GetPlaybackObjectRequest::REQUESTED_OBJECT_TYPE_ALL) + { + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "object_type", (int)objectGraph.RequestedObjectType)); + } + + if (objectGraph.RequestedItemType != GetPlaybackObjectRequest::REQUESTED_ITEM_TYPE_ALL) + { + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "item_type", (int)objectGraph.RequestedItemType)); + } + + if (objectGraph.StartPosition != 0) + { + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "start_position", objectGraph.StartPosition)); + } + + if (objectGraph.RequestCount != -1) + { + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "requested_count", objectGraph.RequestCount)); + } + + if (objectGraph.IncludeChildrenObjectsForRequestedObject) + { + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "children_request", true)); + } + + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "server_address", objectGraph.GetServerAddress())); + + tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); + GetXmlDocument().Accept(printer); + serializedData = std::string(printer->CStr()); + + return true; +} + +GetPlaybackObjectResponse::GetPlaybackObjectResponse() +{ + m_playbackContainerList = new PlaybackContainerList(); + m_playbackItemList = new PlaybackItemList(); +} + +GetPlaybackObjectResponse::~GetPlaybackObjectResponse() +{ + if (m_playbackContainerList) { + delete m_playbackContainerList; + } + + if (m_playbackItemList) { + delete m_playbackItemList; + } +} + +PlaybackContainerList& GetPlaybackObjectResponse::GetPlaybackContainers() +{ + return *m_playbackContainerList; +} + +PlaybackItemList& GetPlaybackObjectResponse::GetPlaybackItems() +{ + return *m_playbackItemList; +} + +bool GetPlaybackObjectResponseSerializer::ReadObject(GetPlaybackObjectResponse& object, const std::string& xml) +{ + tinyxml2::XMLDocument& doc = GetXmlDocument(); + + if (doc.Parse(xml.c_str()) == tinyxml2::XML_NO_ERROR) { + tinyxml2::XMLElement* elRoot = doc.FirstChildElement("object"); + + if (HasChildElement(*elRoot, "containers")) + { + tinyxml2::XMLElement* containers = elRoot->FirstChildElement("containers"); + + PlaybackContainerXmlDataDeserializer* playbackContainerXmlDataDeserializer = new PlaybackContainerXmlDataDeserializer(*this, object.GetPlaybackContainers()); + containers->Accept(playbackContainerXmlDataDeserializer); + delete playbackContainerXmlDataDeserializer; + } + + if (HasChildElement(*elRoot, "items")) + { + tinyxml2::XMLElement* items = elRoot->FirstChildElement("items"); + + PlaybackItemXmlDataDeserializer* playbackItemXmlDataDeserializer = new PlaybackItemXmlDataDeserializer(*this, object.GetPlaybackItems()); + items->Accept(playbackItemXmlDataDeserializer); + delete playbackItemXmlDataDeserializer; + } + + if (HasChildElement(*elRoot, "actual_count")) + { + object.ActualCount = Util::GetXmlFirstChildElementTextAsInt(elRoot, "actual_count"); + } + + if (HasChildElement(*elRoot, "total_count")) + { + object.TotalCount = Util::GetXmlFirstChildElementTextAsInt(elRoot, "total_count"); + } + + return true; + } + + return false; +} + +PlaybackObject::PlaybackObject(const DVBLinkPlaybackObjectType objectType, const std::string& objectId, const std::string& parentId) + : m_objectType(objectType), + m_objectId(objectId), + m_parentId(parentId) +{ + +} + +PlaybackObject::~PlaybackObject() +{ } + +PlaybackObject::DVBLinkPlaybackObjectType& PlaybackObject::GetObjectType() +{ + return m_objectType; +} + +std::string& PlaybackObject::GetObjectID() +{ + return m_objectId; +} + +std::string& PlaybackObject::GetParentID() +{ + return m_parentId; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/program.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/program.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/program.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/program.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,70 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "response.h" +#include "xml_object_serializer.h" + +using namespace dvblinkremote; +using namespace dvblinkremoteserialization; + +Program::Program() + : ItemMetadata(), + m_id("") +{ + +} + +Program::Program(const std::string& id, const std::string& title, const long startTime, const long duration) + : ItemMetadata(title, startTime, duration), + m_id(id) +{ + +} + +Program::Program(Program& program) + : ItemMetadata((ItemMetadata&)program), + m_id(program.GetID()) +{ + +} + +Program::~Program() +{ + +} + +std::string& Program::GetID() +{ + return m_id; +} + +void Program::SetID(const std::string& id) +{ + m_id = id; +} + +void ProgramSerializer::Deserialize(XmlObjectSerializer& objectSerializer, const tinyxml2::XMLElement& element, dvblinkremote::Program& program) +{ + ItemMetadataSerializer::Deserialize(objectSerializer, element, (ItemMetadata&)program); + program.SetID(Util::GetXmlFirstChildElementText(&element, "program_id")); +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/project/VS2010Express/libdvblinkremote.sln xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/project/VS2010Express/libdvblinkremote.sln --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/project/VS2010Express/libdvblinkremote.sln 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/project/VS2010Express/libdvblinkremote.sln 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libdvblinkremote", "libdvblinkremote.vcxproj", "{DB826A81-E848-4E39-BE17-E779A49E2960}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DB826A81-E848-4E39-BE17-E779A49E2960}.Debug|Win32.ActiveCfg = Debug|Win32 + {DB826A81-E848-4E39-BE17-E779A49E2960}.Debug|Win32.Build.0 = Debug|Win32 + {DB826A81-E848-4E39-BE17-E779A49E2960}.Release|Win32.ActiveCfg = Release|Win32 + {DB826A81-E848-4E39-BE17-E779A49E2960}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/project/VS2010Express/libdvblinkremote.vcxproj xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/project/VS2010Express/libdvblinkremote.vcxproj --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/project/VS2010Express/libdvblinkremote.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/project/VS2010Express/libdvblinkremote.vcxproj 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,154 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {d1c528b6-aa02-4d29-9d61-dc08e317a70d} + true + true + false + true + false + + + + {DB826A81-E848-4E39-BE17-E779A49E2960} + dvblinkremote + libdvblinkremote + + + + StaticLibrary + true + MultiByte + + + StaticLibrary + false + false + MultiByte + + + + + + + + + + + + + $(SolutionDir)..\..\include\;$(IncludePath) + $(SolutionDir)..\..\lib\;$(LibraryPath) + $(ProjectName) + + + $(SolutionDir)..\..\include\;$(IncludePath) + $(SolutionDir)..\..\lib\;$(LibraryPath) + $(ProjectName) + + + + + + Level3 + Disabled + $(ProjectDir)..\..\..\;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDebug + + + true + + + ws2_32.lib;%(AdditionalDependencies) + + + + + Level3 + MaxSpeed + true + true + $(ProjectDir)..\..\..\;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + + + ws2_32.lib;%(AdditionalDependencies) + true + + + true + + + + + + + + + + + + + + \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/project/VS2010Express/libdvblinkremote.vcxproj.filters xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/project/VS2010Express/libdvblinkremote.vcxproj.filters --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/project/VS2010Express/libdvblinkremote.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/project/VS2010Express/libdvblinkremote.vcxproj.filters 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,132 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + + \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/recording.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/recording.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/recording.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/recording.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,208 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "response.h" +#include "xml_object_serializer.h" + +using namespace dvblinkremote; +using namespace dvblinkremoteserialization; + +Recording::Recording(const std::string& id, const std::string& scheduleId, const std::string& channelId, const Program* program) + : m_id(id), + m_scheduleId(scheduleId), + m_channelId(channelId), + m_program((Program*)program) +{ + IsActive = false; +} + +Recording::Recording(Recording& recording) +{ + m_id = recording.GetID(); + m_scheduleId = recording.GetScheduleID(); + m_channelId = recording.GetChannelID(); + m_program = new Program(recording.GetProgram()); + IsActive = false; +} + +Recording::~Recording() +{ + if (m_program) { + delete m_program; + } +} + +std::string& Recording::GetID() +{ + return m_id; +} + +std::string& Recording::GetScheduleID() +{ + return m_scheduleId; +} + +std::string& Recording::GetChannelID() +{ + return m_channelId; +} + +Program& Recording::GetProgram() +{ + return *m_program; +} + +RecordingList::~RecordingList() +{ + for (std::vector::const_iterator it = begin(); it < end(); it++) + { + delete (*it); + } +} + +GetRecordingsRequest::GetRecordingsRequest() +{ + +} + +GetRecordingsRequest::~GetRecordingsRequest() +{ + +} + +bool GetRecordingsRequestSerializer::WriteObject(std::string& serializedData, GetRecordingsRequest& objectGraph) +{ + PrepareXmlDocumentForObjectSerialization("recordings"); + tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); + GetXmlDocument().Accept(printer); + serializedData = std::string(printer->CStr()); + + return true; +} + +bool GetRecordingsResponseSerializer::ReadObject(RecordingList& object, const std::string& xml) +{ + tinyxml2::XMLDocument& doc = GetXmlDocument(); + + if (doc.Parse(xml.c_str()) == tinyxml2::XML_NO_ERROR) { + tinyxml2::XMLElement* elRoot = doc.FirstChildElement("recordings"); + GetRecordingsResponseXmlDataDeserializer* xmlDataDeserializer = new GetRecordingsResponseXmlDataDeserializer(*this, object); + elRoot->Accept(xmlDataDeserializer); + delete xmlDataDeserializer; + + return true; + } + + return false; +} + +GetRecordingsResponseSerializer::GetRecordingsResponseXmlDataDeserializer::GetRecordingsResponseXmlDataDeserializer(GetRecordingsResponseSerializer& parent, RecordingList& recordingList) + : m_parent(parent), + m_recordingList(recordingList) +{ } + +GetRecordingsResponseSerializer::GetRecordingsResponseXmlDataDeserializer::~GetRecordingsResponseXmlDataDeserializer() +{ } + +bool GetRecordingsResponseSerializer::GetRecordingsResponseXmlDataDeserializer::VisitEnter(const tinyxml2::XMLElement& element, const tinyxml2::XMLAttribute* attribute) +{ + if (strcmp(element.Name(), "recording") == 0) + { + std::string recordingId = Util::GetXmlFirstChildElementText(&element, "recording_id"); + std::string scheduleId = Util::GetXmlFirstChildElementText(&element, "schedule_id"); + std::string channelId = Util::GetXmlFirstChildElementText(&element, "channel_id"); + + tinyxml2::XMLElement* pEl = (tinyxml2::XMLElement*)(&element)->FirstChildElement("program"); + + Program* p = new Program(); + ProgramSerializer::Deserialize((XmlObjectSerializer&)m_parent, *pEl, *p); + + Recording* r = new Recording(recordingId, scheduleId, channelId, p); + + if (m_parent.HasChildElement(element, "is_active")) { + r->IsActive = Util::GetXmlFirstChildElementTextAsBoolean(&element, "is_active"); + } + + m_recordingList.push_back(r); + + return false; + } + + return true; +} + +RemoveRecordingRequest::RemoveRecordingRequest(const std::string& recordingId) + : m_recordingId(recordingId) +{ + +} + +RemoveRecordingRequest::~RemoveRecordingRequest() +{ + +} + +std::string& RemoveRecordingRequest::GetRecordingID() +{ + return m_recordingId; +} + +bool RemoveRecordingRequestSerializer::WriteObject(std::string& serializedData, RemoveRecordingRequest& objectGraph) +{ + tinyxml2::XMLElement* rootElement = PrepareXmlDocumentForObjectSerialization("remove_recording"); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "recording_id", objectGraph.GetRecordingID())); + + tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); + GetXmlDocument().Accept(printer); + serializedData = std::string(printer->CStr()); + + return true; +} + +StopRecordingRequest::StopRecordingRequest(const std::string& objectId) + : m_objectId(objectId) +{ + +} + +StopRecordingRequest::~StopRecordingRequest() +{ + +} + +std::string& StopRecordingRequest::GetObjectID() +{ + return m_objectId; +} + +bool StopRecordingRequestSerializer::WriteObject(std::string& serializedData, StopRecordingRequest& objectGraph) +{ + tinyxml2::XMLElement* rootElement = PrepareXmlDocumentForObjectSerialization("stop_recording"); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "object_id", objectGraph.GetObjectID())); + + tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); + GetXmlDocument().Accept(printer); + serializedData = std::string(printer->CStr()); + + return true; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/recording_settings.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/recording_settings.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/recording_settings.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/recording_settings.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,109 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "request.h" +#include "response.h" +#include "xml_object_serializer.h" + +using namespace dvblinkremote; +using namespace dvblinkremoteserialization; + +RecordingSettings::RecordingSettings() +{ } + +RecordingSettings::~RecordingSettings() +{ } + +GetRecordingSettingsRequest::GetRecordingSettingsRequest() +{ } + +GetRecordingSettingsRequest::~GetRecordingSettingsRequest() +{ } + +SetRecordingSettingsRequest::SetRecordingSettingsRequest(const int timeMarginBeforeScheduledRecordings, const int timeMarginAfterScheduledRecordings, const std::string& recordingPath) + : m_timeMarginBeforeScheduledRecordings(timeMarginBeforeScheduledRecordings), + m_timeMarginAfterScheduledRecordings(timeMarginAfterScheduledRecordings), + m_recordingPath(recordingPath) +{ + +} + +SetRecordingSettingsRequest::~SetRecordingSettingsRequest() +{ } + +int SetRecordingSettingsRequest::GetTimeMarginBeforeScheduledRecordings() +{ + return m_timeMarginBeforeScheduledRecordings; +} + +int SetRecordingSettingsRequest::GetTimeMarginAfterScheduledRecordings() +{ + return m_timeMarginAfterScheduledRecordings; +} + +std::string& SetRecordingSettingsRequest::GetRecordingPath() +{ + return m_recordingPath; +} + +bool GetRecordingSettingsRequestSerializer::WriteObject(std::string& serializedData, GetRecordingSettingsRequest& objectGraph) +{ + tinyxml2::XMLElement* rootElement = PrepareXmlDocumentForObjectSerialization("recording_settings"); + + tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); + GetXmlDocument().Accept(printer); + serializedData = std::string(printer->CStr()); + + return true; +} + +bool RecordingSettingsSerializer::ReadObject(RecordingSettings& object, const std::string& xml) +{ + tinyxml2::XMLDocument& doc = GetXmlDocument(); + + if (doc.Parse(xml.c_str()) == tinyxml2::XML_NO_ERROR) { + tinyxml2::XMLElement* elRoot = doc.FirstChildElement("recording_settings"); + object.TimeMarginBeforeScheduledRecordings = Util::GetXmlFirstChildElementTextAsInt(elRoot, "before_margin"); + object.TimeMarginAfterScheduledRecordings = Util::GetXmlFirstChildElementTextAsInt(elRoot, "after_margin"); + object.RecordingPath = Util::GetXmlFirstChildElementText(elRoot, "recording_path"); + object.TotalSpace = Util::GetXmlFirstChildElementTextAsLong(elRoot, "total_space"); + object.AvailableSpace = Util::GetXmlFirstChildElementTextAsLong(elRoot, "avail_space"); + return true; + } + + return false; +} + +bool SetRecordingSettingsRequestSerializer::WriteObject(std::string& serializedData, SetRecordingSettingsRequest& objectGraph) +{ + tinyxml2::XMLElement* rootElement = PrepareXmlDocumentForObjectSerialization("recording_settings"); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "before_margin", objectGraph.GetTimeMarginBeforeScheduledRecordings())); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "after_margin", objectGraph.GetTimeMarginAfterScheduledRecordings())); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "recording_path", objectGraph.GetRecordingPath())); + + tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); + GetXmlDocument().Accept(printer); + serializedData = std::string(printer->CStr()); + + return true; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/remove_playback_object_request.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/remove_playback_object_request.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/remove_playback_object_request.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/remove_playback_object_request.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,57 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "request.h" +#include "xml_object_serializer.h" + +using namespace dvblinkremote; +using namespace dvblinkremoteserialization; + +RemovePlaybackObjectRequest::RemovePlaybackObjectRequest(const std::string& objectId) + : m_objectID(objectId) +{ + +} + +RemovePlaybackObjectRequest::~RemovePlaybackObjectRequest() +{ + +} + +std::string& RemovePlaybackObjectRequest::GetObjectID() +{ + return m_objectID; +} + +bool RemovePlaybackObjectRequestSerializer::WriteObject(std::string& serializedData, RemovePlaybackObjectRequest& objectGraph) +{ + tinyxml2::XMLElement* rootElement = PrepareXmlDocumentForObjectSerialization("object_remover"); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "object_id", objectGraph.GetObjectID())); + + tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); + GetXmlDocument().Accept(printer); + serializedData = std::string(printer->CStr()); + + return true; +} + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/request.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/request.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/request.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/request.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,1213 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#pragma once + +#include +#include +#include "scheduling.h" + +namespace dvblinkremote { + /** + * Base class for DVBLink Client requests. + */ + class Request { }; + + /** + * Class for defining a get channels request. + * This is used as input parameter for the IDVBLinkRemoteConnection::GetChannels method. + * @see Channel::Channel() + * @see IDVBLinkRemoteConnection::GetChannels() + */ + class GetChannelsRequest : public Request + { + public: + /** + * Initializes a new instance of the dvblinkremote::GetChannelsRequest class. + */ + GetChannelsRequest(); + + /** + * Destructor for cleaning up allocated memory. + */ + ~GetChannelsRequest(); + }; + + /** + * Represent a strongly typed list of channel identifiers. + * @see Channel::GetID() + */ + class ChannelIdentifierList : public std::vector + { + public: + /** + * Initializes a new instance of the dvblinkremote::ChannelIdentifierList class. + */ + ChannelIdentifierList(); + + /** + * Destructor for cleaning up allocated memory. + */ + ~ChannelIdentifierList(); + }; + + /** + * Class for defining an electronic program guide (EPG) search request. + * This is used as input parameter for the IDVBLinkRemoteConnection::SearchEpg method. + * @see IDVBLinkRemoteConnection::SearchEpg() + */ + class EpgSearchRequest : public Request + { + public: + /** + * Constant long value which specifies that a time value not is bound. + * Used for the start time and end time. + * @see EpgSearchRequest::EpgSearchRequest + * @see EpgSearchRequest::GetStartTime() + * @see EpgSearchRequest::SetStartTime + * @see EpgSearchRequest::GetEndTime() + * @see EpgSearchRequest::SetEndTime + */ + static const long EPG_SEARCH_TIME_NOT_BOUND; + + /** + * Initializes a new instance of the dvblinkremote::EpgSearchRequest class. + * @param channelId a constant string reference representing the channel identifier for searching the epg. + * @param startTime an optional constant long representing the start time of programs for searching the epg. + * @param endTime an optional constant long representing the end time of programs for searching the epg. + * @param shortEpg an optional constant boolean representing a flag for the level of returned EPG information + * from the epg search. + * \remark By setting a \p startTime or \p endTime the search will only return programs that fully or partially fall + * into a specified time span. One of the parameters \p startTime or \p endTime may be -1 + * (EpgSearchRequest::EPG_SEARCH_TIME_NOT_BOUND), meaning that the search is not bound on the start time or end time side. + * \remark \p startTime and \p endTime is the number of seconds, counted from UNIX epoc: 00:00:00 UTC on 1 January 1970. + * \remark \p shortEpg specifies the level of returned EPG information and allows for faster EPG overview build up. + * Short EPG information includes only program id, name, start time, duration and genre info. Default value is false. + */ + EpgSearchRequest(const std::string& channelId, const long startTime = EPG_SEARCH_TIME_NOT_BOUND, const long endTime = EPG_SEARCH_TIME_NOT_BOUND, const bool shortEpg = false); + + /** + * Initializes a new instance of the dvblinkremote::EpgSearchRequest class. + * @param channelIdentifierList a constant dvblinkremote::ChannelIdentifierList instance reference representing a + * list of channel identifiers for searching the epg. + * @param startTime an optional constant long representing the start time of programs for searching the epg. + * @param endTime an optional constant long representing the end time of programs for searching the epg. + * @param shortEpg an optional constant boolean representing a flag for the level of returned EPG information + * from the epg search. + * \remark By setting a \p startTime or \p endTime the search will only return programs that fully or partially fall + * into a specified time span. One of the parameters \p startTime or \p endTime may be -1 + * (EpgSearchRequest::EPG_SEARCH_TIME_NOT_BOUND), meaning that the search is not bound on the start time or end time side. + * \remark \p startTime and \p endTime is the number of seconds, counted from UNIX epoc: 00:00:00 UTC on 1 January 1970. + * \remark \p shortEpg specifies the level of returned EPG information and allows for faster EPG overview build up. + * Short EPG information includes only program id, name, start time, duration and genre info. Default value is false. + */ + EpgSearchRequest(const ChannelIdentifierList& channelIdentifierList, const long startTime = EPG_SEARCH_TIME_NOT_BOUND, const long endTime = EPG_SEARCH_TIME_NOT_BOUND, const bool shortEpg = false); + + /** + * Destructor for cleaning up allocated memory. + */ + ~EpgSearchRequest(); + + /** + * Gets a list of the channel identifiers of the epg search request. + * @return Epg search request channel identifiers + */ + ChannelIdentifierList& GetChannelIdentifiers(); + + /** + * Adds a channel identifier to be searched for. + * @param channelId a constant strint reference representing the channel identifier to search for. + */ + void AddChannelID(const std::string& channelId); + + /** + * String representing the program identifier to search for. + */ + std::string ProgramID; + + /** + * String representing the keywords to search for. + */ + std::string Keywords; + + /** + * Gets the start time of the epg search request. + * @return Epg search request start time + * \remark Number of seconds, counted from UNIX epoc: 00:00:00 UTC on 1 January 1970. + */ + long GetStartTime(); + + /** + * Sets the start time to be searched for. + * @param startTime a constant long representing the start time to search for. + */ + void SetStartTime(const long startTime); + + /** + * Gets the end time of the epg search request. + * @return Epg search request end time + * \remark Number of seconds, counted from UNIX epoc: 00:00:00 UTC on 1 January 1970. + */ + long GetEndTime(); + + /** + * Sets the end time to be searched for. + * @param endTime a constant long representing the end time to search for. + */ + void SetEndTime(const long endTime); + + /** + * Gets if short epg flag is set for the epg search request. + * @return if short epg flag is set or not + */ + bool IsShortEpg(); + + /** + * Sets the short epg flag of the search request. + * @param shortEpg a const boolean representing if short epg flag is set or not. + */ + void SetShortEpg(const bool shortEpg); + + private: + ChannelIdentifierList* m_channelIdList; + long m_startTime; + long m_endTime; + bool m_shortEpg; + }; + + /** + * Abstract base class for stream requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::PlayChannel method. + * @see IDVBLinkRemoteConnection::PlayChannel() + */ + class StreamRequest : public Request + { + public: + /** + * Initializes a new instance of the dvblinkremote::StreamRequest class. + * @param serverAddress a constant string reference representing the DVBLink server address. + * @param dvbLinkChannelId a constant long representing the DVBLink channel identifier. + * @param clientId a constant string reference representing the unique identification string of the client. + * @param streamType a constant string reference representing the stream type for the stream request. + * \remark \p serverAddress is the IP address/server network name of the DVBLink server. + * \remark \p clientId should be the same across all DVBLink Client API calls from a given client. + * It can be a uuid for example or id/mac of the client device. + */ + StreamRequest(const std::string& serverAddress, const long dvbLinkChannelId, const std::string& clientId, const std::string& streamType); + + /** + * Pure virtual destructor for cleaning up allocated memory. + */ + virtual ~StreamRequest() = 0; + + /** + * Gets the server address for the stream request. + * @return Stream request server address + * \remark Ip address/server network name of the DVBLink server. + */ + std::string& GetServerAddress(); + + /** + * Gets the DVBLink channel identifier for the stream request. + * @return Stream request channel identifier + */ + long GetDVBLinkChannelID(); + + /** + * Gets the unique identification string of the client for the stream request. + * @return Stream request client identifier + */ + std::string& GetClientID(); + + /** + * Gets the stream type for the stream request. + * @return Stream request stream type + */ + std::string& GetStreamType(); + + /** + * The timeout until channel playback is stopped by a server (indefinite if not specified). + */ + long Duration; + + private: + /** + * Ip address/server network name of the DVBLink server. + */ + std::string m_serverAddress; + + /** + * DVBLink channel identifier. + */ + long m_dvbLinkChannelId; + + /** + * The unique identification string of the client. + * This should be the same across all DVBLink Client API calls from a given client. + * Can be a uuid for example or id/mac of the client device. + */ + std::string m_clientId; + + /** + * The type of requested stream. + * @see StreamRequest::ANDROID_STREAM_TYPE + * @see StreamRequest::IPHONE_STREAM_TYPE + * @see StreamRequest::WINPHONE_STREAM_TYPE + * @see StreamRequest::RAW_HTTP_STREAM_TYPE + * @see StreamRequest::RAW_UDP_STREAM_TYPE + */ + std::string m_streamType; + }; + + /** + * Class for transcoded video stream options. + */ + class TranscodingOptions + { + public: + /** + * Initializes a new instance of the dvblinkremote::Transcoding class. + * @param width a constant unsigned integer representing the width in pixels to use for a transcoded video stream. + * @param height a constant unsigned integer representing the height in pixels to use for a transcoded video stream. + */ + TranscodingOptions(const unsigned int width, const unsigned int height); + + /** + * Destructor for cleaning up allocated memory. + */ + ~TranscodingOptions(); + + /** + * Gets the width to be used for transcoding a video stream. + * @return Width in pixels + */ + unsigned int GetWidth(); + + /** + * Sets the width to be used for transcoding a video stream. + * @param width a constant unsigned integer representing width in pixels to be used for transcoding a video stream. + */ + void SetWidth(const unsigned int width); + + /** + * Gets the height to be used for transcoding a video stream. + * @return Height in pixels + */ + unsigned int GetHeight(); + + /** + * Sets the height to be used for transcoding a video stream. + * @param height a constant unsigned integer representing height in pixels to be used for transcoding a video stream. + */ + void SetHeight(const unsigned int height); + + /** + * Gets the bitrate to be used for transcoding a video stream. + * @return Bitrate in kilobits/sec + */ + unsigned int GetBitrate(); + + /** + * Sets the bitrate to be used for transcoding a video stream. + * @param bitrate a constant unsigned integer representing height in pixels to be used for transcoding a video stream. + */ + void SetBitrate(const unsigned int bitrate); + + /** + * Gets the audio track to be used for transcoding a video stream. + * @return Audio track in ISO-639 language code format. + */ + std::string& GetAudioTrack(); + + /** + * Sets the audio track to be used for transcoding a video stream. + * @param audioTrack a constant string reference representing an audio track in ISO-639 language code format to be used for transcoding a video stream. + */ + void SetAudioTrack(const std::string& audioTrack); + + private: + /** + * The width in pixels to use for a transcoded video stream. + */ + unsigned int m_width; + + /** + * The height in pixels to use for a transcoded video stream. + */ + unsigned int m_height; + + /** + * The bitrate in kilobits/sec to use for a transcoded video stream. + */ + unsigned int m_bitrate; + + /** + * The ISO-639 language code to use particular audio track for transcoding. + */ + std::string m_audioTrack; + }; + + /** + * Abstract base class for transcoded video stream requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::PlayChannel method. + * @see IDVBLinkRemoteConnection::PlayChannel() + */ + class TranscodedVideoStreamRequest : public StreamRequest + { + public: + /** + * Initializes a new instance of the dvblinkremote::TranscodedVideoStreamRequest class. + * @param serverAddress a constant string reference representing the DVBLink server address. + * @param dvbLinkChannelId a constant long representing the DVBLink channel identifier. + * @param clientId a constant string reference representing the unique identification string of the client. + * @param transcodingOptions a dvblinkremote::TranscodingOptions instance reference representing the transcoding options + * of the stream request. + * @param streamType a constant string reference representing the stream type for the stream request. + * \remark \p serverAddress is the IP address/server network name of the DVBLink server. + * \remark \p clientId should be the same across all DVBLink Client API calls from a given client. + * It can be a uuid for example or id/mac of the client device. + */ + TranscodedVideoStreamRequest(const std::string& serverAddress, const long dvbLinkChannelId, const std::string& clientId, TranscodingOptions& transcodingOptions, const std::string& streamType); + + /** + * Destructor for cleaning up allocated memory. + */ + virtual ~TranscodedVideoStreamRequest() = 0; + + /** + * Gets the transcoding options of the stream request. + * @return dvblinkremote::TranscodingOptions instance reference. + */ + TranscodingOptions& GetTranscodingOptions(); + + private: + /** + * The transcoding options for the stream request. + */ + TranscodingOptions& m_transcodingOptions; + }; + + /** + * Class for Real-time Transport Protocol (RTP) stream requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::PlayChannel method. + * @see IDVBLinkRemoteConnection::PlayChannel() + */ + class RealTimeTransportProtocolStreamRequest : public TranscodedVideoStreamRequest + { + public: + /** + * Initializes a new instance of the dvblinkremote::RealTimeTransportProtocolStreamRequest class. + * @param serverAddress a constant string reference representing the DVBLink server address. + * @param dvbLinkChannelId a constant long representing the DVBLink channel identifier. + * @param clientId a constant string reference representing the unique identification string of the client. + * @param transcodingOptions a dvblinkremote::TranscodingOptions instance reference representing the transcoding options + * of the stream request. + * \remark \p serverAddress is the IP address/server network name of the DVBLink server. + * \remark \p clientId should be the same across all DVBLink Client API calls from a given client. + * It can be a uuid for example or id/mac of the client device. + */ + RealTimeTransportProtocolStreamRequest(const std::string& serverAddress, const long dvbLinkChannelId, const std::string& clientId, TranscodingOptions& transcodingOptions); + + /** + * Destructor for cleaning up allocated memory. + */ + ~RealTimeTransportProtocolStreamRequest(); + }; + + /** + * Class for HTTP Live %Stream (HLS) stream requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::PlayChannel method. + * @see IDVBLinkRemoteConnection::PlayChannel() + */ + class HttpLiveStreamRequest : public TranscodedVideoStreamRequest + { + public: + /** + * Initializes a new instance of the dvblinkremote::HttpLiveStreamRequest class. + * @param serverAddress a constant string reference representing the DVBLink server address. + * @param dvbLinkChannelId a constant long representing the DVBLink channel identifier. + * @param clientId a constant string reference representing the unique identification string of the client. + * @param transcodingOptions a dvblinkremote::TranscodingOptions instance reference representing the transcoding options + * of the stream request. + * \remark \p serverAddress is the IP address/server network name of the DVBLink server. + * \remark \p clientId should be the same across all DVBLink Client API calls from a given client. + * It can be a uuid for example or id/mac of the client device. + */ + HttpLiveStreamRequest(const std::string& serverAddress, const long dvbLinkChannelId, const std::string& clientId, TranscodingOptions& transcodingOptions); + + /** + * Destructor for cleaning up allocated memory. + */ + ~HttpLiveStreamRequest(); + }; + + /** + * Class for Windows Media %Stream (ASF) stream requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::PlayChannel method. + * @see IDVBLinkRemoteConnection::PlayChannel() + */ + class WindowsMediaStreamRequest : public TranscodedVideoStreamRequest + { + public: + /** + * Initializes a new instance of the dvblinkremote::WindowsMediaStreamRequest class. + * @param serverAddress a constant string reference representing the DVBLink server address. + * @param dvbLinkChannelId a constant long representing the DVBLink channel identifier. + * @param clientId a constant string reference representing the unique identification string of the client. + * @param transcodingOptions a dvblinkremote::TranscodingOptions instance reference representing the transcoding options + * of the stream request. + * \remark \p serverAddress is the IP address/server network name of the DVBLink server. + * \remark \p clientId should be the same across all DVBLink Client API calls from a given client. + * It can be a uuid for example or id/mac of the client device. + */ + WindowsMediaStreamRequest(const std::string& serverAddress, const long dvbLinkChannelId, const std::string& clientId, TranscodingOptions& transcodingOptions); + + /** + * Destructor for cleaning up allocated memory. + */ + ~WindowsMediaStreamRequest(); + }; + + /** + * Class for Raw HTTP stream requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::PlayChannel method. + * @see IDVBLinkRemoteConnection::PlayChannel() + */ + class RawHttpStreamRequest : public StreamRequest + { + public: + /** + * Initializes a new instance of the dvblinkremote::RawHttpStreamRequest class. + * @param serverAddress a constant string reference representing the DVBLink server address. + * @param dvbLinkChannelId a constant long representing the DVBLink channel identifier. + * @param clientId a constant string reference representing the unique identification string of the client. + * \remark \p serverAddress is the IP address/server network name of the DVBLink server. + * \remark \p clientId should be the same across all DVBLink Client API calls from a given client. + * It can be a uuid for example or id/mac of the client device. + */ + RawHttpStreamRequest(const std::string& serverAddress, const long dvbLinkChannelId, const std::string& clientId); + + /** + * Destructor for cleaning up allocated memory. + */ + ~RawHttpStreamRequest(); + }; + + /** + * Class for Raw UDP stream requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::PlayChannel method. + * @see IDVBLinkRemoteConnection::PlayChannel() + */ + class RawUdpStreamRequest : public StreamRequest + { + public: + /** + * Initializes a new instance of the dvblinkremote::RawUdpStreamRequest class. + * @param serverAddress a constant string reference representing the DVBLink server address. + * @param dvbLinkChannelId a constant long representing the DVBLink channel identifier. + * @param clientId a constant string reference representing the unique identification string of the client. + * @param clientAddress a constant string reference representing the client address. + * @param streamingPort a constant unsigned short representing the streaming port. + * \remark \p serverAddress is the IP address/server network name of the DVBLink server. + * \remark \p clientId should be the same across all DVBLink Client API calls from a given client. + * It can be a uuid for example or id/mac of the client device. + */ + RawUdpStreamRequest(const std::string& serverAddress, const long dvbLinkChannelId, const std::string& clientId, const std::string& clientAddress, const unsigned short int streamingPort); + + /** + * Destructor for cleaning up allocated memory. + */ + ~RawUdpStreamRequest(); + + /** + * Gets the client address of the stream request. + * @return The client address for the stream request. + */ + std::string& GetClientAddress(); + + /** + * Gets the streaming port of the stream request. + * @return The streaming port for the stream request. + */ + long GetStreamingPort(); + + private: + /** + * The client address for the stream request. + */ + std::string m_clientAddress; + + /** + * The streaming port for the stream request. + */ + unsigned short int m_streamingPort; + }; + + /** + * Class for stop stream requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::StopChannel method. + * @see IDVBLinkRemoteConnection::StopChannel() + */ + class StopStreamRequest : public Request + { + public: + /** + * Initializes a new instance of the dvblinkremote::StopStreamRequest class. + * @param channelHandle a constant long representing the channel handle of an + * existing playing stream to stop. + * @see dvblinkremote::StreamRequest() for information about the channel handle. + */ + StopStreamRequest(long channelHandle); + + /** + * Initializes a new instance of the dvblinkremote::StopStreamRequest class. + * @param clientId a constant string reference representing the unique + * identification string of the client for stopping all playing streams + * from that specific client. + */ + StopStreamRequest(const std::string& clientId); + + /** + * Destructor for cleaning up allocated memory. + */ + ~StopStreamRequest(); + + /** + * Gets the channel handle for the stop stream request. + * @return Channel handle + */ + long GetChannelHandle(); + + /** + * Gets the client identifier for the stop stream request. + * @return Client identifier + */ + std::string& GetClientID(); + + private: + /** + * The channel handle for the stop stream request. + */ + long m_channelHandle; + + /** + * The unique identification string of the client. + */ + std::string m_clientId; + }; + + class AddScheduleRequest : public Request, public virtual Schedule + { + public: + //AddScheduleRequest(const DVBLinkScheduleType scheduleType, const std::string& channelId); + AddScheduleRequest(); + virtual ~AddScheduleRequest() = 0; + }; + + /** + * Class for add manual schedule requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::AddSchedule method. + * @see IDVBLinkRemoteConnection::AddSchedule() + */ + class AddManualScheduleRequest : public ManualSchedule, public AddScheduleRequest + { + public: + /** + * Initializes a new instance of the dvblinkremote::AddManualScheduleRequest class. + * @param channelId a constant string reference representing the channel identifier. + * @param startTime a constant long representing the start time of the schedule. + * @param duration a constant long representing the duration of the schedule. + * @param dayMask a constant long representing the day bitflag of the schedule. + * \remark Construct the \p dayMask parameter by using bitwize operations on the DVBLinkManualScheduleDayMask. + * @see DVBLinkManualScheduleDayMask + * @param title of schedule + */ + AddManualScheduleRequest(const std::string& channelId, const long startTime, const long duration, const long dayMask, const std::string& title = ""); + + /** + * Destructor for cleaning up allocated memory. + */ + ~AddManualScheduleRequest(); + }; + + /** + * Class for add schedule by electronic program guide (EPG) requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::AddSchedule method. + * @see IDVBLinkRemoteConnection::AddSchedule m() + */ + class AddScheduleByEpgRequest : public EpgSchedule, public AddScheduleRequest + { + public: + /** + * Initializes a new instance of the dvblinkremote::AddScheduleByEpgRequest class. + * @param channelId a constant string reference representing the channel identifier. + * @param programId a constant string reference representing the program identifier. + * @param repeat an optional constant boolean representing if the schedule should be + * repeated or not. Default value is false. + * @param newOnly an optional constant boolean representing if only new programs + * have to be recorded. Default value is false. + * @param recordSeriesAnytime an optional constant boolean representing whether to + * record only series starting around original program start time or any of them. + * Default value is false. + */ + AddScheduleByEpgRequest(const std::string& channelId, const std::string& programId, const bool repeat = false, const bool newOnly = false, const bool recordSeriesAnytime = false); + + /** + * Destructor for cleaning up allocated memory. + */ + ~AddScheduleByEpgRequest(); + }; + + /** + * Class for get schedules requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::GetSchedules method. + * @see IDVBLinkRemoteConnection::GetSchedules() + */ + class GetSchedulesRequest : public Request + { + public: + /** + * Initializes a new instance of the dvblinkremote::GetSchedulesRequest class. + */ + GetSchedulesRequest(); + + /** + * Destructor for cleaning up allocated memory. + */ + ~GetSchedulesRequest(); + }; + + /** + * Class for update schedule requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::UpdateSchedule method. + * @see IDVBLinkRemoteConnection::UpdateSchedule() + */ + class UpdateScheduleRequest : public Request + { + public: + /** + * Initializes a new instance of the dvblinkremote::UpdateScheduleRequest class. + * @param scheduleId a constant string reference representing the schedule identifier. + * @param newOnly a constant boolean representing if only new programs + * have to be recorded. Default value is false. + * @param recordSeriesAnytime a constant boolean representing whether to + * record only series starting around original program start time or any of them. + * Default value is false. + * @param recordingsToKeep a constant integer representing how many recordings to + * keep for a repeated recording. Default value is 0, i.e. keep all recordings. + * \remark \p recordingsToKeep accepted values (1, 2, 3, 4, 5, 6, 7, 10; 0 - keep all) + */ + UpdateScheduleRequest(const std::string& scheduleId, const bool newOnly, const bool recordSeriesAnytime, const int recordingsToKeep); + + /** + * Destructor for cleaning up allocated memory. + */ + ~UpdateScheduleRequest(); + + /** + * Gets the identifier for the schedule to be updated. + * @return Schedule identifier + */ + std::string& GetScheduleID(); + + /** + * Gets if only new programs are going to be recorded for the schedule to be updated or not. + * @return boolean value + */ + bool IsNewOnly(); + + /** + * Gets whether to record only series starting around original program start time or any of + * them for the schedule to be updated. + * @return boolean value + */ + bool WillRecordSeriesAnytime(); + + /** + * Gets how many recordings to keep for a repeated recording. + * @return integer value + */ + int GetRecordingsToKeep(); + + private: + std::string m_scheduleId; + bool m_newOnly; + bool m_recordSeriesAnytime; + int m_recordingsToKeep; + }; + + /** + * Class for remove schedule requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::RemoveSchedule method. + * @see IDVBLinkRemoteConnection::RemoveSchedule() + */ + class RemoveScheduleRequest : public Request + { + public: + /** + * Initializes a new instance of the dvblinkremote::GetRecordingsRequest class. + * @param scheduleId a constant string reference representing the identifier of the + * schedule to be removed. + */ + RemoveScheduleRequest(const std::string& scheduleId); + + /** + * Destructor for cleaning up allocated memory. + */ + ~RemoveScheduleRequest(); + + /** + * Gets the identifier for the schedule to be removed. + * @return Schedule identifier + */ + std::string& GetScheduleID(); + + private: + /** + * The identifier of the schedule to be removed. + */ + std::string m_scheduleId; + }; + + /** + * Class for get recordings requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::GetRecordings method. + * @see IDVBLinkRemoteConnection::GetRecordings() + */ + class GetRecordingsRequest : public Request + { + public: + /** + * Initializes a new instance of the dvblinkremote::GetRecordingsRequest class. + */ + GetRecordingsRequest(); + + /** + * Destructor for cleaning up allocated memory. + */ + ~GetRecordingsRequest(); + }; + + /** + * Class for remove recording requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::RemoveRecording method. + * @see IDVBLinkRemoteConnection::RemoveRecording() + */ + class RemoveRecordingRequest : public Request + { + public: + /** + * Initializes a new instance of the dvblinkremote::GetRecordingsRequest class. + * @param recordingId a constant string reference representing the identifier of the + * recording to be removed. + */ + RemoveRecordingRequest(const std::string& recordingId); + + /** + * Destructor for cleaning up allocated memory. + */ + ~RemoveRecordingRequest(); + + /** + * Gets the identifier for the recording to be removed. + * @return Recording identifier + */ + std::string& GetRecordingID(); + + private: + /** + * The identifier of the recording to be removed. + */ + std::string m_recordingId; + }; + + /** + * Class for get parental status requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::GetParentalStatus method. + * @see IDVBLinkRemoteConnection::GetParentalStatus() + */ + class GetParentalStatusRequest : public Request + { + public: + /** + * Initializes a new instance of the dvblinkremote::GetParentalStatusRequest class. + * @param clientId a constant string reference representing the unique identification string of the client. + * \remark \p clientId should be the same across all DVBLink Client API calls from a given client. + * It can be a uuid for example or id/mac of the client device. + */ + GetParentalStatusRequest(const std::string& clientId); + + /** + * Destructor for cleaning up allocated memory. + */ + ~GetParentalStatusRequest(); + + /** + * Gets the unique identification string of the client. + * @return Client identifier + */ + std::string& GetClientID(); + + private: + /** + * The unique identification string of the client. + * This should be the same across all DVBLink Client API calls from a given client. + * Can be a uuid for example or id/mac of the client device. + */ + std::string m_clientId; + }; + + /** + * Class for set parental lock requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::SetParentalLock method. + * @see IDVBLinkRemoteConnection::SetParentalLock() + */ + class SetParentalLockRequest : public Request + { + public: + /** + * Initializes a new instance of the dvblinkremote::SetParentalLockRequest class for disabling a parental lock. + * @param clientId a constant string reference representing the unique identification string of the client. + * \remark \p clientId should be the same across all DVBLink Client API calls from a given client. + * It can be a uuid for example or id/mac of the client device. + */ + SetParentalLockRequest(const std::string& clientId); + + /** + * Initializes a new instance of the dvblinkremote::SetParentalLockRequest class for enabling a parental lock. + * @param clientId a constant string reference representing the unique identification string of the client. + * @param code a constant string reference representing the parental lock code. + * \remark \p clientId should be the same across all DVBLink Client API calls from a given client. + * It can be a uuid for example or id/mac of the client device. + */ + SetParentalLockRequest(const std::string& clientId, const std::string& code); + + /** + * Destructor for cleaning up allocated memory. + */ + ~SetParentalLockRequest(); + + /** + * Gets the unique identification string of the client. + * @return Client identifier + */ + std::string& GetClientID(); + + /** + * Gets if the parental lock should be enabled or not for the set parental lock request. + * @return Enabled flag + */ + bool IsEnabled(); + + /** + * Gets the parental lock code for the set parental lock request. + * @return Parental lock code + */ + std::string& GetCode(); + + private: + /** + * The unique identification string of the client. + * This should be the same across all DVBLink Client API calls from a given client. + * Can be a uuid for example or id/mac of the client device. + */ + std::string m_clientId; + + /** + * The flag which tells if parental lock should be enabled or disabled. + */ + bool m_enabled; + + /** + * The parental lock code if \p m_enabled is \p true. + */ + std::string m_code; + }; + + /** + * Class for get M3U playlist requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::GetM3uPlaylist method. + * @see IDVBLinkRemoteConnection::GetM3uPlaylist() + */ + class GetM3uPlaylistRequest : public Request + { + public: + /** + * Initializes a new instance of the dvblinkremote::GetM3uPlaylistRequest class. + */ + GetM3uPlaylistRequest(); + + /** + * Destructor for cleaning up allocated memory. + */ + ~GetM3uPlaylistRequest(); + }; + + /** + * Class for get playback object requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::GetPlaybackObject method. + * @see IDVBLinkRemoteConnection::GetPlaybackObject() + */ + class GetPlaybackObjectRequest : public Request + { + public: + /** + * An enum for requesting certain object types to be returned. + */ + enum DVBLinkRequestedObjectType { + REQUESTED_OBJECT_TYPE_ALL = -1, /**< All requested object types will be returned */ + REQUESTED_OBJECT_TYPE_CONTAINER = 0, /**< Container objects will be returned */ + REQUESTED_OBJECT_TYPE_ITEM = 1 /**< Item objects will be returned */ + }; + + /** + * An enum for requesting certain item types to be returned. + */ + enum DVBLinkRequestedItemType { + REQUESTED_ITEM_TYPE_ALL = -1, /**< All requested item types will be returned */ + REQUESTED_ITEM_TYPE_RECORDED_TV = 0, /**< Recorded TV items will be returned */ + REQUESTED_ITEM_TYPE_VIDEO = 1, /**< Video items will be returned */ + REQUESTED_ITEM_TYPE_AUDIO = 2, /**< Audio items will be returned */ + REQUESTED_ITEM_TYPE_IMAGE = 3 /**< Image items will be returned */ + }; + + /** + * Initializes a new instance of the dvblinkremote::GetPlaybackObjectRequest class to recieve + * the DVBLink server container, i.e. the top level parent of all objects. + * @param serverAddress a constant string reference representing the DVBLink server address. + * \remark \p serverAddress is the IP address/server network name of the DVBLink server. + */ + GetPlaybackObjectRequest(const std::string& serverAddress); + + /** + * Initializes a new instance of the dvblinkremote::GetPlaybackObjectRequest class. + * @param serverAddress a constant string reference representing the DVBLink server address. + * @param objectId a constant string reference representing the identifier of the playback + * object to recieve. + * \remark \p serverAddress is the IP address/server network name of the DVBLink server. + */ + GetPlaybackObjectRequest(const std::string& serverAddress, const std::string& objectId); + + /** + * Destructor for cleaning up allocated memory. + */ + ~GetPlaybackObjectRequest(); + + /** + * Gets the server address for the playback object request. + * @return Playback object request server address + * \remark Ip address/server network name of the DVBLink server. + */ + std::string& GetServerAddress(); + + /** + * Gets the identifier for the playback object to recieve. + * @return Playback object identifier + * \remark Default value is empty string which refers to + * DVBLink server container, i.e. the top level parent of all objects. + */ + std::string& GetObjectID(); + + /** + * Indicates which type of objects to be requested. + * \remark Default value is REQUESTED_OBJECT_TYPE_ALL. + */ + DVBLinkRequestedObjectType RequestedObjectType; + + /** + * Indicates which type of items to be requested. + * \remark Default value is REQUESTED_ITEM_TYPE_ALL. + */ + DVBLinkRequestedItemType RequestedItemType; + + /** + * The start position of objects to be requested. + * \remark Default value is 0. + */ + int StartPosition; + + /** + * The number of objects to be requested. + * \remark Default value is -1, e.g. all. + */ + int RequestCount; + + /** + * Indicates if child objects of requested object identifier + * shall be included in result or not. + * \remark Default value is false. + * \remark If false returns information about object itself + * as specified by its object identifier. + * \remark If true returns objects children objects containers and items. + */ + bool IncludeChildrenObjectsForRequestedObject; + + private: + /** + * Ip address/server network name of the DVBLink server. + */ + std::string m_serverAddress; + + /** + * Identifier for the playback object to recieve. + */ + std::string m_objectId; + }; + + /** + * Class for remove playback object requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::RemovePlaybackObject method. + * @see IDVBLinkRemoteConnection::RemovePlaybackObject() + */ + class RemovePlaybackObjectRequest : public Request + { + public: + RemovePlaybackObjectRequest(const std::string& objectId); + ~RemovePlaybackObjectRequest(); + + /** + * Gets the identifier for the playback object to be removed. + * @return Playback object identifier + */ + std::string& GetObjectID(); + + private: + /** + * The identifier of the playback object to be removed. + */ + std::string m_objectID; + }; + + /** + * Class for stop recording requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::StopRecording method. + * @see IDVBLinkRemoteConnection::StopRecording() + */ + class StopRecordingRequest : public Request + { + public: + /** + * Initializes a new instance of the dvblinkremote::GetRecordingsRequest class. + * @param objectId a constant string reference representing the object identifier + * of the recording to be stopped. + */ + StopRecordingRequest(const std::string& objectId); + + /** + * Destructor for cleaning up allocated memory. + */ + ~StopRecordingRequest(); + + /** + * Gets the object identifier for the recording to be stopped. + * @return Recording object identifier + */ + std::string& GetObjectID(); + + private: + /** + * The identifier of the recording to be stopped. + */ + std::string m_objectId; + }; + + /** + * Class for get streaming capabilities requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::GetStreamingCapabilities method. + * @see IDVBLinkRemoteConnection::GetStreamingCapabilities() + */ + class GetStreamingCapabilitiesRequest : public Request + { + public: + /** + * Initializes a new instance of the dvblinkremote::GetStreamingCapabilitiesRequest class. + */ + GetStreamingCapabilitiesRequest(); + + /** + * Destructor for cleaning up allocated memory. + */ + ~GetStreamingCapabilitiesRequest(); + }; + + /** + * Class for get recording settings requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::GetRecordingSettings method. + * @see IDVBLinkRemoteConnection::GetRecordingSettings() + */ + class GetRecordingSettingsRequest : public Request + { + public: + /** + * Initializes a new instance of the dvblinkremote::GetRecordingSettingsRequest class. + */ + GetRecordingSettingsRequest(); + + /** + * Destructor for cleaning up allocated memory. + */ + ~GetRecordingSettingsRequest(); + }; + + /** + * Class for set recording settings requests. + * This is used as input parameter for the IDVBLinkRemoteConnection::SetRecordingSettings method. + * @see IDVBLinkRemoteConnection::SetRecordingSettings() + */ + class SetRecordingSettingsRequest : public Request + { + public: + /** + * Initializes a new instance of the dvblinkremote::SetRecordingSettingsRequest class. + */ + SetRecordingSettingsRequest(const int timeMarginBeforeScheduledRecordings, const int timeMarginAfterScheduledRecordings, const std::string& recordingPath); + + /** + * Destructor for cleaning up allocated memory. + */ + ~SetRecordingSettingsRequest(); + + /** + * Gets the configured time margin before a schedule recording is started. + * @return Number of seconds before a schedule recording is started + */ + int GetTimeMarginBeforeScheduledRecordings(); + + /** + * Gets the configured time margin after a schedule recording is stopped. + * @return Number of seconds after a schedule recording is stopped + */ + int GetTimeMarginAfterScheduledRecordings(); + + /** + * Gets the configured file system path where recordings will be stored. + * @return Configured file system path + */ + std::string& GetRecordingPath(); + + private: + int m_timeMarginBeforeScheduledRecordings; + int m_timeMarginAfterScheduledRecordings; + std::string m_recordingPath; + }; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/response.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/response.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/response.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/response.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,1288 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#pragma once + +#include +#include +#include "request.h" + +namespace dvblinkremote { + /** + * Base class for DVBLink Client responses. + */ + class Response { }; + + /** + * Represent a DVBLink channel. + */ + class Channel + { + public: + /** + * An enum for channel types. + */ + enum DVBLinkChannelType { + CHANNEL_TYPE_TV = 0, + CHANNEL_TYPE_RADIO = 1, + CHANNEL_TYPE_OTHER = 2 + }; + + /** + * Initializes a new instance of the dvblinkremote::Channel class. + * @param id a constant string reference representing the generic identifier of the channel. + * @param dvbLinkId a constant long representing the DVBLink identifier of the channel. + * @param name a constant string reference representing the name of the channel. + * @param type a constant DVBLinkChannelType instance representing the type of the channel. + * @param number an optional constant integer representing the number of the channel. + * @param subNumber an optional constant integer representing the sub-number of the channel. + */ + Channel(const std::string& id, const long dvbLinkId, const std::string& name, const DVBLinkChannelType type, const int number = -1, const int subNumber = -1); + + /** + * Initializes a new instance of the dvblinkremote::Channel class by coping another + * dvblinkremote::Channel instance. + * @param channel a dvblinkremote::Channel reference. + */ + Channel(Channel& channel); + + /** + * Destructor for cleaning up allocated memory. + */ + ~Channel(); + + /** + * Gets the identifier of the channel. + * @return Channel identifier + */ + std::string& GetID(); + + /** + * Gets the DVBLink identifier of the channel. + * @return DVBLink channel identifier + */ + long GetDvbLinkID(); + + /** + * Gets the name of the channel. + * @return Channel name + */ + std::string& GetName(); + + /** + * Gets the type of the channel. + * @return ChannelType instance reference + */ + DVBLinkChannelType& GetChannelType(); + + /** + * Represents the number of the channel. + */ + int Number; + + /** + * Represents the sub-number of the channel. + */ + int SubNumber; + + /** + * Represents if a child lock is active or not for the channel. + */ + bool ChildLock; + + private: + std::string m_id; + long m_dvbLinkId; + std::string m_name; + DVBLinkChannelType m_type; + }; + + /** + * Represent a strongly typed list of DVBLink channels which is used as output + * parameter for the IDVBLinkRemoteConnection::GetChannels method. + * @see Channel::Channel() + * @see IDVBLinkRemoteConnection::GetChannels() + */ + class ChannelList : public Response, public std::vector { + public: + /** + * Initializes a new instance of the dvblinkremote::ChannelList class. + */ + ChannelList(); + + /** + * Destructor for cleaning up allocated memory. + */ + ~ChannelList(); + }; + + /** + * Represent metadata for an item. + */ + class ItemMetadata + { + public: + /** + * Initializes a new instance of the dvblinkremote::ItemMetadata class. + */ + ItemMetadata(); + + /** + * Initializes a new instance of the dvblinkremote::MetaData class. + * @param title a constant string reference representing the title of the item. + * @param startTime a constant long representing the start time of the item. + * @param duration a constant long representing the duration of the item. + * \remark startTime and duration is the number of seconds, counted from + * UNIX epoc: 00:00:00 UTC on 1 January 1970. + */ + ItemMetadata(const std::string& title, const long startTime, const long duration); + + /** + * Initializes a new instance of the dvblinkremote::ItemMetadata class by coping another + * dvblinkremote::ItemMetadata instance. + * @param itemMetadata a dvblinkremote::ItemMetadata reference. + */ + ItemMetadata(ItemMetadata& itemMetadata); + + /** + * Pure virtual destructor for cleaning up allocated memory. + */ + virtual ~ItemMetadata() = 0; + + /** + * Gets the title of the item. + * @return Item title + */ + std::string& GetTitle(); + + /** + * Sets the title of the item. + * @param title a constant string reference representing the title of the item. + */ + void SetTitle(const std::string& title); + + /** + * Gets the start time of the item. + * @return Item start time + * \remark Number of seconds, counted from UNIX epoc: 00:00:00 UTC on 1 January 1970. + */ + long GetStartTime(); + + /** + * Sets the start time of the item. + * @param startTime a constant long representing the start time of the item. + */ + void SetStartTime(const long startTime); + + /** + * Gets the duration of the item. + * @return item duration + * \remark Number of seconds, counted from UNIX epoc: 00:00:00 UTC on 1 January 1970. + */ + long GetDuration(); + + /** + * Sets the duration of the item. + * @param duration a constant long representing the duration of the item. + */ + void SetDuration(const long duration); + + std::string ShortDescription; + std::string SubTitle; + std::string Language; + std::string Actors; + std::string Directors; + std::string Writers; + std::string Producers; + std::string Guests; + std::string Keywords; + std::string Image; + long Year; + long EpisodeNumber; + long SeasonNumber; + long Rating; + long MaximumRating; + bool IsHdtv; + bool IsPremiere; + bool IsRepeat; + bool IsSeries; + bool IsRecord; + bool IsRepeatRecord; + bool IsCatAction; + bool IsCatComedy; + bool IsCatDocumentary; + bool IsCatDrama; + bool IsCatEducational; + bool IsCatHorror; + bool IsCatKids; + bool IsCatMovie; + bool IsCatMusic; + bool IsCatNews; + bool IsCatReality; + bool IsCatRomance; + bool IsCatScifi; + bool IsCatSerial; + bool IsCatSoap; + bool IsCatSpecial; + bool IsCatSports; + bool IsCatThriller; + bool IsCatAdult; + + private: + std::string m_title; + long m_startTime; + long m_duration; + }; + + /** + * Represent a program in an electronic program guide (EPG). + * @see ItemMetadata::ItemMetadata() + */ + class Program : public ItemMetadata + { + public: + /** + * Initializes a new instance of the dvblinkremote::Program class. + */ + Program(); + + /** + * Initializes a new instance of the dvblinkremote::Program class. + * @param id a constant string reference representing the identifier of the program. + * @param title a constant string reference representing the title of the program. + * @param startTime a constant long representing the start time of the program. + * @param duration a constant long representing the duration of the program. + * \remark startTime and duration is the number of seconds, counted from + * UNIX epoc: 00:00:00 UTC on 1 January 1970. + */ + Program(const std::string& id, const std::string& title, const long startTime, const long duration); + + /** + * Initializes a new instance of the dvblinkremote::Program class by coping another + * dvblinkremote::Program instance. + * @param program a dvblinkremote::Program reference. + */ + Program(Program& program); + + /** + * Destructor for cleaning up allocated memory. + */ + ~Program(); + + /** + * Gets the identifier of the program. + * @return Program identifier + */ + std::string& GetID(); + + /** + * Sets the identifier of the program. + * @param id a constant string reference representing the identifier of the program. + */ + void SetID(const std::string& id); + + private: + std::string m_id; + }; + + /** + * Represent a strongly typed list of programs in an electronic + * program guide (EPG). + * @see Program::Program() + */ + class EpgData : public std::vector { + public: + /** + * Initializes a new instance of the dvblinkremote::EpgData class. + */ + EpgData(); + + /** + * Initializes a new instance of the dvblinkremote::EpgData class by coping another + * dvblinkremote::EpgData instance. + * @param epgData a dvblinkremote::EpgData reference. + */ + EpgData(EpgData& epgData); + + /** + * Destructor for cleaning up allocated memory. + */ + ~EpgData(); + }; + + /** + * Represent electronic program guide (EPG) data for a channel. + */ + class ChannelEpgData + { + public: + /** + * Initializes a new instance of the dvblinkremote::ChannelEpgData class. + * @param channelId a constant string reference representing the channel identifier for the corresponding electronic program guide (EPG) data. + */ + ChannelEpgData(const std::string& channelId); + + /** + * Initializes a new instance of the dvblinkremote::ChannelEpgData class by coping another + * dvblinkremote::ChannelEpgData instance. + * @param channelEpgData a dvblinkremote::ChannelEpgData reference. + */ + ChannelEpgData(ChannelEpgData& channelEpgData); + + /** + * Destructor for cleaning up allocated memory. + */ + ~ChannelEpgData(); + + /** + * Get the channel identifier of the electronic program guide (EPG) data. + * @return Channel identifier. + */ + std::string& GetChannelID(); + + /** + * Get the electronic program guide (EPG) data. + * @return Electronic program guide (EPG) data. + */ + EpgData& GetEpgData(); + + /** + * Adds a program to the electronic program guide (EPG). + * @param program A constant dvblinkremote::Program pointer. + */ + void AddProgram(const Program* program); + + private: + std::string m_channelId; + EpgData* m_epgData; + }; + + /** + * Represent a strongly typed list of electronic program guide (EPG) data + * for channels which is used as output parameter for the + * IDVBLinkRemoteConnection::SearchEpg method. + * @see ChannelEpgData::ChannelEpgData() + * @see IDVBLinkRemoteConnection::SearchEpg() + */ + class EpgSearchResult : public Response, public std::vector { + public: + /** + * Initializes a new instance of the dvblinkremote::EpgSearchResult class. + */ + EpgSearchResult(); + + /** + * Destructor for cleaning up allocated memory. + */ + ~EpgSearchResult(); + }; + + /** + * Represent a DVBLink playing channel which is used as output parameter + * for the IDVBLinkRemoteConnection::PlayChannel method. + * @see IDVBLinkRemoteConnection::PlayChannel() + */ + class Stream : public Response + { + public: + /** + * Initializes a new instance of the dvblinkremote::Stream class. + */ + Stream(); + + /** + * Initializes a new instance of the dvblinkremote::Stream class. + * @param channelHandle a constant long representing the channel handle of the stream. + * @param url a constant string reference representing the url of the stream. + */ + Stream(const long channelHandle, const std::string& url); + + /** + * Initializes a new instance of the dvblinkremote::Stream class by coping another + * dvblinkremote::Stream instance. + * @param stream a dvblinkremote::Stream reference. + */ + Stream(Stream& stream); + + /** + * Destructor for cleaning up allocated memory. + */ + ~Stream(); + + /** + * Gets the channel handle of the stream. + * @return Stream channel handle + */ + long GetChannelHandle(); + + /** + * Sets the channel handle of the stream. + * @param channelHandle a constant long representing the channel handle of the stram. + */ + void SetChannelHandle(const long channelHandle); + + /** + * Gets the url of the stream. + * @return Stream url + */ + std::string& GetUrl(); + + /** + * Sets the url of the stream. + * @param url a constant string reference representing the url of the stram. + */ + void SetUrl(const std::string& url); + + private: + long m_channelHandle; + std::string m_url; + }; + + /** + * Represent a recording. + */ + class Recording + { + public: + /** + * Initializes a new instance of the dvblinkremote::Recording class. + * @param id a constant string reference representing the identifier of the recording. + * @param scheduleId a constant string reference representing the schedule identifier of the recording. + * @param channelId a constant string reference representing the channel identifier of the recording. + * @param program a constant dvblinkremote::Program instance pointer representing the program of the recording. + */ + Recording(const std::string& id, const std::string& scheduleId, const std::string& channelId, const Program* program); + + /** + * Initializes a new instance of the dvblinkremote::Recording class by coping another + * dvblinkremote::Recording instance. + * @param recording a dvblinkremote::Recording reference. + */ + Recording(Recording& recording); + + /** + * Destructor for cleaning up allocated memory. + */ + ~Recording(); + + /** + * Gets the identifier of the recording. + * @return Recording identifier + */ + std::string& GetID(); + + /** + * Gets the schedule identifier of the recording. + * @return Recording schedule identifier + */ + std::string& GetScheduleID(); + + /** + * Gets the channel identifier of the recording. + * @return Recording channel identifier + */ + std::string& GetChannelID(); + + /** + * Represents if the recording is in active state or not. + */ + bool IsActive; + + /** + * Gets the program of the recording. + * @return Recording program + */ + Program& GetProgram(); + + private: + std::string m_id; + std::string m_scheduleId; + std::string m_channelId; + Program* m_program; + }; + + /** + * Represent a strongly typed list of recordings which is used as output + * parameter for the IDVBLinkRemoteConnection::GetRecordings method. + * @see Recording::Recording() + * @see IDVBLinkRemoteConnection::GetRecordings() + */ + class RecordingList : public Response, public std::vector + { + public: + /** + * Destructor for cleaning up allocated memory. + */ + ~RecordingList(); + }; + + /** + * Class for stored manual schedules. + */ + class StoredManualSchedule : public ManualSchedule + { + public: + /** + * Initializes a new instance of the dvblinkremote::StoredManualSchedule class. + * @param id a constant string reference representing the schedule identifier. + * @param channelId a constant string reference representing the channel identifier. + * @param startTime a constant long representing the start time of the schedule. + * @param duration a constant long representing the duration of the schedule. + * @param dayMask a constant long representing the day bitflag of the schedule. + * \remark Construct the \p dayMask parameter by using bitwize operations on the DVBLinkManualScheduleDayMask. + * @see DVBLinkManualScheduleDayMask + * @param title of schedule + */ + StoredManualSchedule(const std::string& id, const std::string& channelId, const long startTime, const long duration, const long dayMask, const std::string& title = ""); + + /** + * Destructor for cleaning up allocated memory. + */ + ~StoredManualSchedule(); + }; + + /** + * Represent a strongly typed list of stored manual schedules. + * @see StoredManualSchedule::StoredManualSchedule() + */ + class StoredManualScheduleList : public std::vector + { + public: + /** + * Destructor for cleaning up allocated memory. + */ + ~StoredManualScheduleList(); + }; + + /** + * Class for stored EPG schedules. + */ + class StoredEpgSchedule : public EpgSchedule + { + public: + /** + * Initializes a new instance of the dvblinkremote::StoredEpgSchedule class. + * @param id a constant string reference representing the schedule identifier. + * @param channelId a constant string reference representing the channel identifier. + * @param programId a constant string reference representing the program identifier. + * @param repeat an optional constant boolean representing if the schedule should be + * repeated or not. Default value is false. + * @param newOnly an optional constant boolean representing if only new programs + * have to be recorded. Default value is false. + * @param recordSeriesAnytime an optional constant boolean representing whether to + * record only series starting around original program start time or any of them. + * Default value is false. + */ + StoredEpgSchedule(const std::string& id, const std::string& channelId, const std::string& programId, const bool repeat = false, const bool newOnly = false, const bool recordSeriesAnytime = false); + + /** + * Destructor for cleaning up allocated memory. + */ + ~StoredEpgSchedule(); + }; + + /** + * Represent a strongly typed list of stored EPG schedules. + * @see StoredEpgSchedule::StoredEpgSchedule() + */ + class StoredEpgScheduleList : public std::vector + { + public: + /** + * Destructor for cleaning up allocated memory. + */ + ~StoredEpgScheduleList(); + }; + + /** + * Represent stored schedules which is used as output paramater for + * the IDVBLinkRemoteConnection::GetSchedules method. + * @see IDVBLinkRemoteConnection::GetSchedules() + */ + class StoredSchedules : public Response + { + public: + StoredSchedules(); + + /** + * Destructor for cleaning up allocated memory. + */ + ~StoredSchedules(); + + /** + * Gets a list of stored manual schedules. + * @return A list of stored manual schedules + */ + StoredManualScheduleList& GetManualSchedules(); + + /** + * Gets a list of stored EPG schedules. + * @return A list of stored EPG schedules + */ + StoredEpgScheduleList& GetEpgSchedules(); + + private: + StoredManualScheduleList* m_manualScheduleList; + StoredEpgScheduleList* m_epgScheduleList; + }; + + /** + * Represent parental status which is used as output parameter for the + * IDVBLinkRemoteConnection::SetParentalLock and IDVBLinkRemoteConnection::GetParentalStatus + * methods. + * @see IDVBLinkRemoteConnection::SetParentalLock() + * @see IDVBLinkRemoteConnection::GetParentalStatus() + */ + class ParentalStatus : public Response + { + public: + /** + * Initializes a new instance of the dvblinkremote::ParentalStatus class. + */ + ParentalStatus(); + + /** + * Initializes a new instance of the dvblinkremote::ParentalStatus class by coping another + * dvblinkremote::ParentalStatus instance. + * @param parentalStatus a dvblinkremote::ParentalStatus reference. + */ + ParentalStatus(ParentalStatus& parentalStatus); + + /** + * Destructor for cleaning up allocated memory. + */ + ~ParentalStatus(); + + /** + * Represents if the parental lock is enabled or not. + */ + bool IsEnabled; + }; + + /** + * Represent M3U playlist which is used as output parameter for the + * IDVBLinkRemoteConnection::GetM3uPlaylist method. + * @see IDVBLinkRemoteConnection::GetM3uPlaylist() + */ + class M3uPlaylist : public Response + { + public: + /** + * Initializes a new instance of the dvblinkremote::M3uPlaylist class. + */ + M3uPlaylist(); + + /** + * Destructor for cleaning up allocated memory. + */ + ~M3uPlaylist(); + + /** + * Represents the M3U playlist file content. + */ + std::string FileContent; + }; + + /** + * Abstract base class for playback objects. + */ + class PlaybackObject + { + public: + /** + * An enum for playback object types. + */ + enum DVBLinkPlaybackObjectType { + PLAYBACK_OBJECT_TYPE_CONTAINER = 0, /**< Container object type */ + PLAYBACK_OBJECT_TYPE_ITEM = 1 /**< Item object type */ + }; + + /** + * Initializes a new instance of the dvblinkremote::PlaybackObject class. + * @param itemType a constant DVBLinkPlaybackObjectType instance representing the type of + * the playback item. + * @param objectId a constant string reference representing the identifier of the playback object. + * @param parentId a constant string reference representing the identifier of the parent object + * for this playback object. + */ + PlaybackObject(const DVBLinkPlaybackObjectType objectType, const std::string& objectId, const std::string& parentId); + + /** + * Pure virtual destructor for cleaning up allocated memory. + */ + virtual ~PlaybackObject() = 0; + + /** + * Gets the type of the playback object . + * @return DVBLinkPlaybackObjectType instance reference + */ + DVBLinkPlaybackObjectType& GetObjectType(); + + /** + * Gets the identifier of the playback object. + * @return Playback object identifier + */ + std::string& GetObjectID(); + + /** + * Gets the identifier of the parent object for this playback object. + * @return Parent identifier for this playback object + */ + std::string& GetParentID(); + + private: + /** + * The type of object. + */ + DVBLinkPlaybackObjectType m_objectType; + + /** + * The identifier for the playback object. + */ + std::string m_objectId; + + /** + * The identifier of the parent object to this playback object. + */ + std::string m_parentId; + }; + + /** + * Class for playback container. + */ + class PlaybackContainer : public PlaybackObject + { + public : + /** + * An enum for playback container types. + */ + enum DVBLinkPlaybackContainerType { + PLAYBACK_CONTAINER_TYPE_UNKNOWN = -1, /**< Unknown container type */ + PLAYBACK_CONTAINER_TYPE_SOURCE = 0, /**< Source container */ + PLAYBACK_CONTAINER_TYPE_TYPE = 1, /**< Type container */ + PLAYBACK_CONTAINER_TYPE_CATEGORY = 2, /**< Category container */ + PLAYBACK_CONTAINER_TYPE_GROUP = 3 /**< Group container */ + }; + + /** + * An enum for playback container content types. + */ + enum DVBLinkPlaybackContainerContentType { + PLAYBACK_CONTAINER_CONTENT_TYPE_UNKNOWN = -1, /**< Unknown content type */ + PLAYBACK_CONTAINER_CONTENT_TYPE_RECORDED_TV = 0, /**< Recorded TV content */ + PLAYBACK_CONTAINER_CONTENT_TYPE_VIDEO = 1, /**< Video content */ + PLAYBACK_CONTAINER_CONTENT_TYPE_AUDIO = 2, /**< Audio content */ + PLAYBACK_CONTAINER_CONTENT_TYPE_IMAGE = 3 /**< Image content */ + }; + + /** + * Initializes a new instance of the dvblinkremote::PlaybackContainer class. + * @param objectId a constant string reference representing the identifier of the playback object. + * @param parentId a constant string reference representing the identifier of the parent object + * for this playback object. + * @param name a constant string reference representing the name of the playback container. + * @param containerType a constant DVBLinkPlaybackContainerType instance representing the type of + * the playback container. + * @param containerContentType a constant DVBLinkPlaybackContainerContentType instance representing the content + * type of the playback items in this playback container. + */ + PlaybackContainer(const std::string& objectId, const std::string& parentId, const std::string& name, DVBLinkPlaybackContainerType& containerType, DVBLinkPlaybackContainerContentType& containerContentType); + + /** + * Destructor for cleaning up allocated memory. + */ + ~PlaybackContainer(); + + /** + * Gets the name of the playback container. + * @return Playback container name + */ + std::string& GetName(); + + /** + * Gets the type of the playback container . + * @return DVBLinkPlaybackContainerType instance reference + */ + DVBLinkPlaybackContainerType& GetContainerType(); + + /** + * Gets the content type of the playback items in this playback container . + * @return DVBLinkPlaybackContainerContentType instance reference + */ + DVBLinkPlaybackContainerContentType& GetContainerContentType(); + + /** + * The description of the playback container. + */ + std::string Description; + + /** + * The logo of the playback container. + */ + std::string Logo; + + /** + * The total amount of items in the playback container. + */ + int TotalCount; + + /** + * Identifies a physical source of this container. + * \remark 8F94B459-EFC0-4D91-9B29-EC3D72E92677 is the + * built-in dvblink recorder, e.g. Recorded TV items. + */ + std::string SourceID; + + private: + std::string m_name; + DVBLinkPlaybackContainerType& m_containerType; + DVBLinkPlaybackContainerContentType& m_containerContentType; + }; + + /** + * Represent a strongly typed list of playback containers. + * @see PlaybackContainer::PlaybackContainer() + */ + class PlaybackContainerList : public std::vector + { + public: + /** + * Destructor for cleaning up allocated memory. + */ + ~PlaybackContainerList(); + }; + + /** + * Abstract base class for playback items. + */ + class PlaybackItem : public PlaybackObject + { + public: + /** + * An enum for playback item types. + */ + enum DVBLinkPlaybackItemType { + PLAYBACK_ITEM_TYPE_RECORDED_TV = 0, /**< Recorded TV item */ + PLAYBACK_ITEM_TYPE_VIDEO = 1, /**< Video item */ + PLAYBACK_ITEM_TYPE_AUDIO = 2, /**< Audio item */ + PLAYBACK_ITEM_TYPE_IMAGE = 3 /**< Image item */ + }; + + /** + * Initializes a new instance of the dvblinkremote::PlaybackItem class. + * @param itemType a constant DVBLinkPlaybackItemType instance representing the type of + * the playback item. + * @param objectId a constant string reference representing the identifier of the playback object. + * @param parentId a constant string reference representing the identifier of the parent object + * for this playback object. + * @param playbackUrl a constant string reference representing the URL for stream playback of the playback item. + * @param thumbnailUrl a constant string reference representing the URL to the playback item thumbnail. + * @param metadata a constant ItemMetadata reference representing the metadata for the playback item. + */ + PlaybackItem(const DVBLinkPlaybackItemType itemType, const std::string& objectId, const std::string& parentId, const std::string& playbackUrl, const std::string& thumbnailUrl, const ItemMetadata* metadata); + + /** + * Pure virtual destructor for cleaning up allocated memory. + */ + virtual ~PlaybackItem() = 0; + + /** + * Gets the type of the playback item . + * @return DVBLinkPlaybackItemType instance reference + */ + DVBLinkPlaybackItemType& GetItemType(); + + /** + * Gets the URL for stream playback of the playback item. + * @return Playback URL + */ + std::string& GetPlaybackUrl(); + + /** + * Gets the URL to the playback item thumbnail. + * @return Thumbnail URL + */ + std::string& GetThumbnailUrl(); + + /** + * Gets the metadata for the playback item. + * @return ItemMetadata instance reference + */ + ItemMetadata& GetMetadata(); + + /** + * Identifies whether this item can be deleted. + */ + bool CanBeDeleted; + + /** + * Item file size in bytes. + */ + long Size; + + /** + * Time when item was created. + * \remark Number of seconds, counted from UNIX epoc: 00:00:00 UTC on 1 January 1970. + */ + long CreationTime; + + private: + /** + * The type of item. + */ + DVBLinkPlaybackItemType m_itemType; + + /** + * The URL for stream playback of the playback item. + */ + std::string m_playbackUrl; + + /** + * The URL to the playback item thumbnail. + */ + std::string m_thumbnailUrl; + + /** + * The metadata of the playback item. + */ + ItemMetadata* m_metadata; + }; + + /** + * Represent metadata for a recorded TV item. + * @see ItemMetadata::ItemMetadata() + */ + class RecordedTvItemMetadata : public ItemMetadata + { + public: + /** + * Initializes a new instance of the dvblinkremote::RecordedTvItemMetadata class. + */ + RecordedTvItemMetadata(); + + /** + * Initializes a new instance of the dvblinkremote::RecordedTvItemMetadata class. + * @param title a constant string reference representing the title of a recorded TV item. + * @param startTime a constant long representing the start time of a recorded TV item. + * @param duration a constant long representing the duration of a recorded TV item. + * \remark startTime and duration is the number of seconds, counted from + * UNIX epoc: 00:00:00 UTC on 1 January 1970. + */ + RecordedTvItemMetadata(const std::string& title, const long startTime, const long duration); + + /** + * Initializes a new instance of the dvblinkremote::RecordedTvItemMetadata class by coping another + * dvblinkremote::RecordedTvItemMetadata instance. + * @param recordedTvItemMetadata a dvblinkremote::RecordedTvItemMetadata reference. + */ + RecordedTvItemMetadata(RecordedTvItemMetadata& recordedTvItemMetadata); + + /** + * Destructor for cleaning up allocated memory. + */ + ~RecordedTvItemMetadata(); + }; + + /** + * Class for recorded TV items. + */ + class RecordedTvItem : public PlaybackItem + { + public: + /** + * An enum representing the state of the recorded TV item. + */ + enum DVBLinkRecordedTvItemState { + RECORDED_TV_ITEM_STATE_IN_PROGRESS = 0, /**< Recording is in progress */ + RECORDED_TV_ITEM_STATE_ERROR = 1, /**< Recording not started because of error */ + RECORDED_TV_ITEM_STATE_FORCED_TO_COMPLETION = 2, /**< Recording was forced to completion, but may miss certain part at the end because it was cancelled by user */ + RECORDED_TV_ITEM_STATE_COMPLETED = 3 /**< Recording completed successfully */ + }; + + /** + * Initializes a new instance of the dvblinkremote::RecordedTvPlaybackItem class. + * @param objectId a constant string reference representing the identifier of the playback object. + * @param parentId a constant string reference representing the identifier of the parent object + * for this playback object. + * @param playbackUrl a constant string reference representing the URL for stream playback of the recorded tv item. + * @param thumbnailUrl a constant string reference representing the URL to the recorded tv item thumbnail. + * @param metadata a constant RecordedTvItemMetadata reference representing the metadata for the recorded tv item. + */ + RecordedTvItem(const std::string& objectId, const std::string& parentId, const std::string& playbackUrl, const std::string& thumbnailUrl, const RecordedTvItemMetadata* metadata); + + /** + * Destructor for cleaning up allocated memory. + */ + ~RecordedTvItem(); + + /** + * The channel name of the recorded TV item. + */ + std::string ChannelName; + + /** + * The channel number of the recorded TV item. + */ + int ChannelNumber; + + /** + * The channel sub number of the recorded TV item. + */ + int ChannelSubNumber; + + /** + * The state of the recored TV item. + */ + DVBLinkRecordedTvItemState State; + }; + + /** + * Represent metadata for a video. + * @see ItemMetadata::ItemMetadata() + */ + class VideoItemMetadata : public ItemMetadata + { + public: + /** + * Initializes a new instance of the dvblinkremote::VideoItemMetadata class. + */ + VideoItemMetadata(); + + /** + * Initializes a new instance of the dvblinkremote::VideoItemMetadata class. + * @param title a constant string reference representing the title of a video item. + * @param startTime a constant long representing the start time of a video item. + * @param duration a constant long representing the duration of a video item. + * \remark startTime and duration is the number of seconds, counted from + * UNIX epoc: 00:00:00 UTC on 1 January 1970. + */ + VideoItemMetadata(const std::string& title, const long startTime, const long duration); + + /** + * Initializes a new instance of the dvblinkremote::VideoItemMetadata class by coping another + * dvblinkremote::VideoItemMetadata instance. + * @param videoItemMetadata a dvblinkremote::VideoItemMetadata reference. + */ + VideoItemMetadata(VideoItemMetadata& videoItemMetadata); + + /** + * Destructor for cleaning up allocated memory. + */ + ~VideoItemMetadata(); + }; + + /** + * Class for video items. + */ + class VideoItem : public PlaybackItem + { + public: + /** + * Initializes a new instance of the dvblinkremote::VideoItem class. + * @param objectId a constant string reference representing the identifier of the playback object. + * @param parentId a constant string reference representing the identifier of the parent object + * for this playback object. + * @param playbackUrl a constant string reference representing the URL for stream playback of the video item. + * @param thumbnailUrl a constant string reference representing the URL to the video item thumbnail. + * @param metadata a constant VideoItemMetadata reference representing the metadata for the video item. + */ + VideoItem(const std::string& objectId, const std::string& parentId, const std::string& playbackUrl, const std::string& thumbnailUrl, const VideoItemMetadata* metadata); + + /** + * Destructor for cleaning up allocated memory. + */ + ~VideoItem(); + }; + + /** + * Represent a strongly typed list of playback items. + * @see PlaybackItem::PlaybackItem() + */ + class PlaybackItemList : public std::vector + { + public: + /** + * Destructor for cleaning up allocated memory. + */ + ~PlaybackItemList(); + }; + + /** + * Represent playback object response which is used as output parameter + * for the IDVBLinkRemoteConnection::GetPlaybackObject method. + * @see IDVBLinkRemoteConnection::GetPlaybackObject() + */ + class GetPlaybackObjectResponse : public Response + { + public: + /** + * Initializes a new instance of the dvblinkremote::GetPlaybackObjectResponse class. + */ + GetPlaybackObjectResponse(); + + /** + * Destructor for cleaning up allocated memory. + */ + ~GetPlaybackObjectResponse(); + + /** + * Gets a list of playback containers. + * @return A list of playback containers + */ + PlaybackContainerList& GetPlaybackContainers(); + + /** + * Gets a list of playback items. + * @return A list of playback items + */ + PlaybackItemList& GetPlaybackItems(); + + /** + * The number of items and containers in the response. + */ + int ActualCount; + + /** + * The total number of items and containers in the container. + */ + int TotalCount; + + private: + PlaybackContainerList* m_playbackContainerList; + PlaybackItemList* m_playbackItemList; + }; + + /** + * Represent streaming capabilities which is used as output parameter for the + * IDVBLinkRemoteConnection::GetStreamingCapabilities method. + * @see IDVBLinkRemoteConnection::GetStreamingCapabilities() + */ + class StreamingCapabilities : public Response + { + public: + /** + * An enum for supported streaming protocols. + */ + enum DVBLinkSupportedProtocol { + SUPPORTED_PROTOCOL_NONE = 0, /**< No streaming protocol supported */ + SUPPORTED_PROTOCOL_HTTP = 1, /**< HTTP protocol supported */ + SUPPORTED_PROTOCOL_UDP = 2, /**< UDP protocol supported */ + SUPPORTED_PROTOCOL_RTSP = 4, /**< Real Time Streaming Protocol (RTSP) supported */ + SUPPORTED_PROTOCOL_ASF = 8, /**< Windows Media Stream (ASF) protocol supported */ + SUPPORTED_PROTOCOL_HLS = 16, /**< HTTP Live Streaming (HLS) protocol supported */ + SUPPORTED_PROTOCOL_WEBM = 32, /**< Open Web Media (WebM) protocol supported */ + SUPPORTED_PROTOCOL_ALL = 65535 /**< All streaming protocols supported */ + }; + + /** + * An enum for supported streaming transcoders. + */ + enum DVBLinkSupportedTranscoder { + STREAMING_TRANSCODER_NONE = 0, /**< No streaming transcoder supported */ + STREAMING_TRANSCODER_WMV = 1, /**< Windows Media Video (WMV) transcoder supported */ + STREAMING_TRANSCODER_WMA = 2, /**< Windows Media Audio (WMA) transcoder supported */ + STREAMING_TRANSCODER_H264 = 4, /**< Advanced Video Coding (H.264) transcoder supported */ + STREAMING_TRANSCODER_AAC = 8, /**< Advanced Audio Coding (AAC) transcoder supported */ + STREAMING_TRANSCODER_RAW = 16, /**< Raw transcoder supported */ + STREAMING_TRANSCODER_ALL = 65535 /**< All streaming transcoders supported */ + }; + + /** + * Initializes a new instance of the dvblinkremote::StreamingCapabilities class. + */ + StreamingCapabilities(); + + /** + * Initializes a new instance of the dvblinkremote::StreamingCapabilities class by coping another + * dvblinkremote::StreamingCapabilities instance. + * @param streamingCapabilities a dvblinkremote::StreamingCapabilities reference. + */ + StreamingCapabilities(StreamingCapabilities& streamingCapabilities); + + /** + * Destructor for cleaning up allocated memory. + */ + ~StreamingCapabilities(); + + int SupportedProtocols; + + bool IsProtocolSupported(const DVBLinkSupportedProtocol protocol); + bool IsProtocolSupported(const int protocolsToCheck); + + int SupportedTranscoders; + + bool IsTranscoderSupported(const DVBLinkSupportedTranscoder transcoder); + bool IsTranscoderSupported(const int transcodersToCheck); + }; + + /** + * Represent recording settings which is used as output parameter for the + * IDVBLinkRemoteConnection::GetRecordingSettings method. + * @see IDVBLinkRemoteConnection::GetRecordingSettings() + */ + class RecordingSettings : public Response + { + public: + /** + * Initializes a new instance of the dvblinkremote::RecordingSettings class. + */ + RecordingSettings(); + + /** + * Initializes a new instance of the dvblinkremote::RecordingSettings class by coping another + * dvblinkremote::RecordingSettings instance. + * @param recordingSettings a dvblinkremote::RecordingSettings reference. + */ + RecordingSettings(RecordingSettings& recordingSettings); + + /** + * Destructor for cleaning up allocated memory. + */ + ~RecordingSettings(); + + /** + * The configured time margin before a schedule recording is started. + */ + int TimeMarginBeforeScheduledRecordings; + + /** + * The configured time margin after a schedule recording is stopped. + */ + int TimeMarginAfterScheduledRecordings; + + /** + * The file system path where recordings will be stored. + */ + std::string RecordingPath; + + /** + * The total space in KB. + */ + long TotalSpace; + + /** + * The available space in KB. + */ + long AvailableSpace; + }; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/scheduling.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/scheduling.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/scheduling.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/scheduling.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,479 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "scheduling.h" +#include "xml_object_serializer.h" + +using namespace dvblinkremote; +using namespace dvblinkremoteserialization; + +Schedule::Schedule() +{ + +} + +Schedule::Schedule(const DVBLinkScheduleType scheduleType, const std::string& channelId, const int recordingsToKeep) + : m_scheduleType(scheduleType), + m_channelId(channelId), + RecordingsToKeep(recordingsToKeep) +{ + m_id = ""; + UserParameter = ""; + ForceAdd = false; +} + +Schedule::Schedule(const DVBLinkScheduleType scheduleType, const std::string& id, const std::string& channelId, const int recordingsToKeep) + : m_scheduleType(scheduleType), + m_id(id), + m_channelId(channelId), + RecordingsToKeep(recordingsToKeep) +{ + UserParameter = ""; + ForceAdd = false; +} + +Schedule::~Schedule() +{ + +} + +std::string& Schedule::GetID() +{ + return m_id; +} + +std::string& Schedule::GetChannelID() +{ + return m_channelId; +} + +Schedule::DVBLinkScheduleType& Schedule::GetScheduleType() +{ + return m_scheduleType; +} + +ManualSchedule::ManualSchedule(const std::string& channelId, const long startTime, const long duration, const long dayMask, const std::string& title) + : Schedule(SCHEDULE_TYPE_MANUAL, channelId), + m_startTime(startTime), + m_duration(duration), + m_dayMask(dayMask), + Title(title) +{ + +} + +ManualSchedule::ManualSchedule(const std::string& id, const std::string& channelId, const long startTime, const long duration, const long dayMask, const std::string& title) + : Schedule(SCHEDULE_TYPE_MANUAL, id, channelId), + m_startTime(startTime), + m_duration(duration), + m_dayMask(dayMask), + Title(title) +{ + +} + +ManualSchedule::~ManualSchedule() +{ + +} + +long ManualSchedule::GetStartTime() +{ + return m_startTime; +} + +long ManualSchedule::GetDuration() +{ + return m_duration; +} + +long ManualSchedule::GetDayMask() +{ + return m_dayMask; +} + +EpgSchedule::EpgSchedule(const std::string& channelId, const std::string& programId, const bool repeat, const bool newOnly, const bool recordSeriesAnytime) + : Schedule(SCHEDULE_TYPE_BY_EPG, channelId), + m_programId(programId), + Repeat(repeat), + NewOnly(newOnly), + RecordSeriesAnytime(recordSeriesAnytime) +{ + +} + +EpgSchedule::EpgSchedule(const std::string& id, const std::string& channelId, const std::string& programId, const bool repeat, const bool newOnly, const bool recordSeriesAnytime) + : Schedule(SCHEDULE_TYPE_BY_EPG, id, channelId), + m_programId(programId), + Repeat(repeat), + NewOnly(newOnly), + RecordSeriesAnytime(recordSeriesAnytime) +{ + +} + +EpgSchedule::~EpgSchedule() +{ + +} + +std::string& EpgSchedule::GetProgramID() +{ + return m_programId; +} + +AddScheduleRequest::AddScheduleRequest() +{ + +} + +AddScheduleRequest::~AddScheduleRequest() +{ + +} + + +AddManualScheduleRequest::AddManualScheduleRequest(const std::string& channelId, const long startTime, const long duration, const long dayMask, const std::string& title) + : ManualSchedule(channelId, startTime, duration, dayMask, title), AddScheduleRequest(), Schedule(Schedule::SCHEDULE_TYPE_MANUAL, channelId) +{ + +} + +AddManualScheduleRequest::~AddManualScheduleRequest() +{ + +} + +AddScheduleByEpgRequest::AddScheduleByEpgRequest(const std::string& channelId, const std::string& programId, const bool repeat, const bool newOnly, const bool recordSeriesAnytime) + : EpgSchedule(channelId, programId, repeat, newOnly, recordSeriesAnytime), AddScheduleRequest(), Schedule(Schedule::SCHEDULE_TYPE_BY_EPG, channelId) +{ + +} + +AddScheduleByEpgRequest::~AddScheduleByEpgRequest() +{ + +} + +bool AddScheduleRequestSerializer::WriteObject(std::string& serializedData, AddScheduleRequest& objectGraph) +{ + tinyxml2::XMLElement* rootElement = PrepareXmlDocumentForObjectSerialization("schedule"); + + if (!objectGraph.UserParameter.empty()) { + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "user_param", objectGraph.UserParameter)); + } + + if (objectGraph.ForceAdd) { + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "force_add", objectGraph.ForceAdd)); + } + + if (objectGraph.GetScheduleType() == objectGraph.SCHEDULE_TYPE_MANUAL) { + AddManualScheduleRequest& addManualScheduleRequest = (AddManualScheduleRequest&)objectGraph; + + tinyxml2::XMLElement* manualElement = GetXmlDocument().NewElement("manual"); + rootElement->InsertEndChild(manualElement); + + manualElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "channel_id", addManualScheduleRequest.GetChannelID())); + + if (!addManualScheduleRequest.Title.empty()) { + manualElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "title", addManualScheduleRequest.Title)); + } + + manualElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "start_time", addManualScheduleRequest.GetStartTime())); + manualElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "duration", addManualScheduleRequest.GetDuration())); + manualElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "day_mask", addManualScheduleRequest.GetDayMask())); + manualElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "recordings_to_keep", addManualScheduleRequest.RecordingsToKeep)); + } + + if (objectGraph.GetScheduleType() == objectGraph.SCHEDULE_TYPE_BY_EPG) { + AddScheduleByEpgRequest& addScheduleByEpgRequest = (AddScheduleByEpgRequest&)objectGraph; + + tinyxml2::XMLElement* byEpgElement = GetXmlDocument().NewElement("by_epg"); + rootElement->InsertEndChild(byEpgElement); + byEpgElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "channel_id", addScheduleByEpgRequest.GetChannelID())); + byEpgElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "program_id", addScheduleByEpgRequest.GetProgramID())); + + if (addScheduleByEpgRequest.Repeat) { + byEpgElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "repeat", addScheduleByEpgRequest.Repeat)); + } + + if (addScheduleByEpgRequest.NewOnly) { + byEpgElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "new_only", addScheduleByEpgRequest.NewOnly)); + } + + if (addScheduleByEpgRequest.RecordSeriesAnytime) { + byEpgElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "record_series_anytime", addScheduleByEpgRequest.RecordSeriesAnytime)); + } + + byEpgElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "recordings_to_keep", addScheduleByEpgRequest.RecordingsToKeep)); + } + + tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); + GetXmlDocument().Accept(printer); + serializedData = std::string(printer->CStr()); + + return true; +} + +GetSchedulesRequest::GetSchedulesRequest() +{ + +} + +GetSchedulesRequest::~GetSchedulesRequest() +{ + +} + +bool GetSchedulesRequestSerializer::WriteObject(std::string& serializedData, GetSchedulesRequest& objectGraph) +{ + PrepareXmlDocumentForObjectSerialization("schedules"); + tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); + GetXmlDocument().Accept(printer); + serializedData = std::string(printer->CStr()); + + return true; +} + +StoredManualSchedule::StoredManualSchedule(const std::string& id, const std::string& channelId, const long startTime, const long duration, const long dayMask, const std::string& title) + : ManualSchedule(id, channelId, startTime, duration, dayMask, title), Schedule(Schedule::SCHEDULE_TYPE_MANUAL,id, channelId) +{ + +} + +StoredManualSchedule::~StoredManualSchedule() +{ } + +StoredManualScheduleList::~StoredManualScheduleList() +{ + for (std::vector::const_iterator it = begin(); it < end(); it++) + { + delete (*it); + } +} + +StoredEpgSchedule::StoredEpgSchedule(const std::string& id, const std::string& channelId, const std::string& programId, const bool repeat, const bool newOnly, const bool recordSeriesAnytime) + : EpgSchedule(id, channelId, programId, repeat, newOnly, recordSeriesAnytime), Schedule(Schedule::SCHEDULE_TYPE_BY_EPG,id, channelId) +{ + +} + +StoredEpgSchedule::~StoredEpgSchedule() +{ } + +StoredEpgScheduleList::~StoredEpgScheduleList() +{ + for (std::vector::const_iterator it = begin(); it < end(); it++) + { + delete (*it); + } +} + +StoredSchedules::StoredSchedules() +{ + m_manualScheduleList = new StoredManualScheduleList(); + m_epgScheduleList = new StoredEpgScheduleList(); +} + +StoredSchedules::~StoredSchedules() +{ + if (m_manualScheduleList) { + delete m_manualScheduleList; + } + + if (m_epgScheduleList) { + delete m_epgScheduleList; + } +} + +StoredManualScheduleList& StoredSchedules::GetManualSchedules() +{ + return *m_manualScheduleList; +} + +StoredEpgScheduleList& StoredSchedules::GetEpgSchedules() +{ + return *m_epgScheduleList; +} + +bool GetSchedulesResponseSerializer::ReadObject(StoredSchedules& object, const std::string& xml) +{ + tinyxml2::XMLDocument& doc = GetXmlDocument(); + + if (doc.Parse(xml.c_str()) == tinyxml2::XML_NO_ERROR) { + tinyxml2::XMLElement* elRoot = doc.FirstChildElement("schedules"); + GetSchedulesResponseXmlDataDeserializer* xmlDataDeserializer = new GetSchedulesResponseXmlDataDeserializer(*this, object); + elRoot->Accept(xmlDataDeserializer); + delete xmlDataDeserializer; + + return true; + } + + return false; +} + +GetSchedulesResponseSerializer::GetSchedulesResponseXmlDataDeserializer::GetSchedulesResponseXmlDataDeserializer(GetSchedulesResponseSerializer& parent, StoredSchedules& storedSchedules) + : m_parent(parent), + m_storedSchedules(storedSchedules) +{ } + +GetSchedulesResponseSerializer::GetSchedulesResponseXmlDataDeserializer::~GetSchedulesResponseXmlDataDeserializer() +{ } + +bool GetSchedulesResponseSerializer::GetSchedulesResponseXmlDataDeserializer::VisitEnter(const tinyxml2::XMLElement& element, const tinyxml2::XMLAttribute* attribute) +{ + if (strcmp(element.Name(), "schedule") == 0) + { + std::string scheduleId = Util::GetXmlFirstChildElementText(&element, "schedule_id"); + std::string userParam = Util::GetXmlFirstChildElementText(&element, "user_param"); + bool forceadd = Util::GetXmlFirstChildElementTextAsBoolean(&element, "force_add"); + + if (m_parent.HasChildElement(element, "by_epg")) { + tinyxml2::XMLElement* epg = (tinyxml2::XMLElement*)(&element)->FirstChildElement("by_epg"); + + std::string channelid = Util::GetXmlFirstChildElementText(epg, "channel_id"); + std::string programid = Util::GetXmlFirstChildElementText(epg, "program_id"); + + StoredEpgSchedule* s = new StoredEpgSchedule(scheduleId, channelid, programid); + s->ForceAdd = forceadd; + s->UserParameter = userParam; + + if (m_parent.HasChildElement(*epg, "repeat")) { + s->Repeat = Util::GetXmlFirstChildElementTextAsBoolean(epg, "repeat"); + } + + if (m_parent.HasChildElement(*epg, "new_only")) { + s->NewOnly = Util::GetXmlFirstChildElementTextAsBoolean(epg, "new_only"); + } + + if (m_parent.HasChildElement(*epg, "record_series_anytime")) { + s->RecordSeriesAnytime = Util::GetXmlFirstChildElementTextAsBoolean(epg, "record_series_anytime"); + } + + s->RecordingsToKeep = Util::GetXmlFirstChildElementTextAsInt(epg, "recordings_to_keep"); + + m_storedSchedules.GetEpgSchedules().push_back(s); + } + else if (m_parent.HasChildElement(element, "manual")) { + tinyxml2::XMLElement* manual = (tinyxml2::XMLElement*)(&element)->FirstChildElement("manual"); + + std::string channelId = Util::GetXmlFirstChildElementText(manual, "channel_id"); + std::string title = Util::GetXmlFirstChildElementText(manual, "title"); + long startTime = Util::GetXmlFirstChildElementTextAsLong(manual, "start_time"); + int duration = Util::GetXmlFirstChildElementTextAsLong(manual, "duration"); + long dayMask = Util::GetXmlFirstChildElementTextAsLong(manual, "day_mask"); + + StoredManualSchedule* s = new StoredManualSchedule(scheduleId, channelId, startTime, duration, dayMask, title); + s->ForceAdd = forceadd; + s->UserParameter = userParam; + + s->RecordingsToKeep = Util::GetXmlFirstChildElementTextAsInt(manual, "recordings_to_keep"); + + m_storedSchedules.GetManualSchedules().push_back(s); + } + else { + return false; + } + + return false; + } + + return true; +} + +UpdateScheduleRequest::UpdateScheduleRequest(const std::string& scheduleId, const bool newOnly, const bool recordSeriesAnytime, const int recordingsToKeep) + : m_scheduleId(scheduleId), + m_newOnly(newOnly), + m_recordSeriesAnytime(recordSeriesAnytime), + m_recordingsToKeep(recordingsToKeep) +{ + +} + +UpdateScheduleRequest::~UpdateScheduleRequest() +{ + +} + +std::string& UpdateScheduleRequest::GetScheduleID() +{ + return m_scheduleId; +} + +bool UpdateScheduleRequest::IsNewOnly() +{ + return m_newOnly; +} + +bool UpdateScheduleRequest::WillRecordSeriesAnytime() +{ + return m_recordSeriesAnytime; +} + +int UpdateScheduleRequest::GetRecordingsToKeep() +{ + return m_recordingsToKeep; +} + +bool UpdateScheduleRequestSerializer::WriteObject(std::string& serializedData, UpdateScheduleRequest& objectGraph) +{ + tinyxml2::XMLElement* rootElement = PrepareXmlDocumentForObjectSerialization("update_schedule"); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "schedule_id", objectGraph.GetScheduleID())); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "new_only", objectGraph.IsNewOnly())); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "record_series_anytime", objectGraph.WillRecordSeriesAnytime())); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "recordings_to_keep", objectGraph.GetRecordingsToKeep())); + + tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); + GetXmlDocument().Accept(printer); + serializedData = std::string(printer->CStr()); + + return true; +} + +RemoveScheduleRequest::RemoveScheduleRequest(const std::string& scheduleId) + : m_scheduleId(scheduleId) +{ + +} + +RemoveScheduleRequest::~RemoveScheduleRequest() +{ + +} + +std::string& RemoveScheduleRequest::GetScheduleID() +{ + return m_scheduleId; +} + +bool RemoveScheduleRequestSerializer::WriteObject(std::string& serializedData, RemoveScheduleRequest& objectGraph) +{ + tinyxml2::XMLElement* rootElement = PrepareXmlDocumentForObjectSerialization("remove_schedule"); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "schedule_id", objectGraph.GetScheduleID())); + + tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); + GetXmlDocument().Accept(printer); + serializedData = std::string(printer->CStr()); + + return true; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/scheduling.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/scheduling.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/scheduling.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/scheduling.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,290 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#pragma once + +#include +#include + +namespace dvblinkremote { + /** + * Abstract base class for schedules. + */ + class Schedule + { + public: + /** + * An enum for schedule types. + */ + enum DVBLinkScheduleType + { + SCHEDULE_TYPE_MANUAL = 0, /**< Used for manual schedules. */ + SCHEDULE_TYPE_BY_EPG = 1 /**< Used for electronic program guide (EPG) schedules. */ + }; + + /** + * Initializes a new instance of the dvblinkremote::Schedule class. + * @param scheduleType a constant DVBLinkScheduleType instance representing the type of + * schedule. + * @param channelId a constant string reference representing the channel identifier. + * @param recordingsToKeep an optional constant integer representing how many recordings to + * keep for a repeated recording. Default value is 0, i.e. keep all recordings. + */ + Schedule(const DVBLinkScheduleType scheduleType, const std::string& channelId, const int recordingsToKeep = 0); + + /** + * Initializes a new instance of the dvblinkremote::Schedule class. + * @param scheduleType a constant DVBLinkScheduleType instance representing the type of + * schedule. + * @param id a constant string reference representing the schedule identifier. + * @param channelId a constant string reference representing the channel identifier. + * @param recordingsToKeep an optional constant integer representing how many recordings to + * keep for a repeated recording. Default value is 0, i.e. keep all recordings. + */ + Schedule(const DVBLinkScheduleType scheduleType, const std::string& id, const std::string& channelId, const int recordingsToKeep = 0); + + /** + * Pure virtual destructor for cleaning up allocated memory. + */ + virtual ~Schedule() = 0; + + /** + * Gets the identifier of the schedule. + * @return Schedule identifier + */ + std::string& GetID(); + + /** + * Gets the channel identifier for the schedule. + * @return Channel identifier + */ + std::string& GetChannelID(); + + /** + * The user parameter of the schedule request. + */ + std::string UserParameter; + + /** + * A flag indicating that new schedule should be added even if there are other + * conflicting schedules present. + */ + bool ForceAdd; + + /** + * Indicates how many recordings to keep for a repeated recording. + * \remark Possible values (1, 2, 3, 4, 5, 6, 7, 10; 0 - keep all) + */ + int RecordingsToKeep; + + /** + * Gets the type for the schedule . + * @return DVBLinkScheduleType instance reference + */ + DVBLinkScheduleType& GetScheduleType(); + + protected: + + /** + * Protected constructor used to solve diamond problem in adding schedules + */ + Schedule(); + + private: + + /** + * The identifier for the schedule. + */ + std::string m_id; + + /** + * The channel identifier of the schedule. + */ + std::string m_channelId; + + /** + * The type of the schedule. + */ + DVBLinkScheduleType m_scheduleType; + }; + + /** + * Abstract base class for manual schedules. + */ + class ManualSchedule : public virtual Schedule + { + public: + /** + * An enum to be used for constructing a bitflag to be used for defining repeated recordings for manual schedules. + */ + enum DVBLinkManualScheduleDayMask + { + MANUAL_SCHEDULE_DAY_MASK_SUNDAY = 1, /**< Sunday schedule. */ + MANUAL_SCHEDULE_DAY_MASK_MONDAY = 2, /**< Monday schedule. */ + MANUAL_SCHEDULE_DAY_MASK_TUESDAY = 4, /**< Tuesday schedule. */ + MANUAL_SCHEDULE_DAY_MASK_WEDNESDAY = 8, /**< Wednesday schedule. */ + MANUAL_SCHEDULE_DAY_MASK_THURSDAY = 16, /**< Thursday schedule. */ + MANUAL_SCHEDULE_DAY_MASK_FRIDAY = 32, /**< Friday schedule. */ + MANUAL_SCHEDULE_DAY_MASK_SATURDAY = 64, /**< Saturday schedule. */ + MANUAL_SCHEDULE_DAY_MASK_DAILY = 255 /**< Daily schedule. */ + }; + + /** + * Initializes a new instance of the dvblinkremote::ManualSchedule class. + * @param channelId a constant string reference representing the channel identifier. + * @param startTime a constant long representing the start time of the schedule. + * @param duration a constant long representing the duration of the schedule. + * @param dayMask a constant long representing the day bitflag of the schedule. + * \remark Construct the \p dayMask parameter by using bitwize operations on the DVBLinkManualScheduleDayMask. + * @see DVBLinkManualScheduleDayMask + * @param title of schedule + */ + ManualSchedule(const std::string& channelId, const long startTime, const long duration, const long dayMask, const std::string& title = ""); + + /** + * Initializes a new instance of the dvblinkremote::ManualSchedule class. + * @param id a constant string reference representing the schedule identifier. + * @param channelId a constant string reference representing the channel identifier. + * @param startTime a constant long representing the start time of the schedule. + * @param duration a constant long representing the duration of the schedule. + * @param dayMask a constant long representing the day bitflag of the schedule. + * \remark Construct the \p dayMask parameter by using bitwize operations on the DVBLinkManualScheduleDayMask. + * @see DVBLinkManualScheduleDayMask + * @param title of schedule + */ + ManualSchedule(const std::string& id, const std::string& channelId, const long startTime, const long duration, const long dayMask, const std::string& title = ""); + + /** + * Pure virtual destructor for cleaning up allocated memory. + */ + virtual ~ManualSchedule() = 0; + + /** + * The title of the manual schedule request. + */ + std::string Title; + + /** + * Gets the start time for the manual schedule request. + * @return Start time + */ + long GetStartTime(); + + /** + * Gets the duration for the manual schedule request. + * @return Duration + */ + long GetDuration(); + + /** + * Gets the day bitmask for the manual schedule request. + * @return Day bitmask + */ + long GetDayMask(); + + private: + /** + * The start time of the manual schedule request. + */ + long m_startTime; + + /** + * The duration of the manual schedule request. + */ + long m_duration; + + /** + * The day bitmask of the manual schedule request. + */ + long m_dayMask; + }; + + /** + * Abstract base class for electronic program guide (EPG) schedules. + */ + class EpgSchedule : public virtual Schedule + { + public: + /** + * Initializes a new instance of the dvblinkremote::EpgSchedule class. + * @param channelId a constant string reference representing the channel identifier. + * @param programId a constant string reference representing the program identifier. + * @param repeat an optional constant boolean representing if the schedule should be + * repeated or not. Default value is false. + * @param newOnly an optional constant boolean representing if only new programs + * have to be recorded. Default value is false. + * @param recordSeriesAnytime an optional constant boolean representing whether to + * record only series starting around original program start time or any of them. + * Default value is false. + */ + EpgSchedule(const std::string& channelId, const std::string& programId, const bool repeat = false, const bool newOnly = false, const bool recordSeriesAnytime = false); + + /** + * Initializes a new instance of the dvblinkremote::EpgSchedule class. + * @param id a constant string reference representing the schedule identifier. + * @param channelId a constant string reference representing the channel identifier. + * @param programId a constant string reference representing the program identifier. + * @param repeat an optional constant boolean representing if the schedule should be + * repeated or not. Default value is false. + * @param newOnly an optional constant boolean representing if only new programs + * have to be recorded. Default value is false. + * @param recordSeriesAnytime an optional constant boolean representing whether to + * record only series starting around original program start time or any of them. + * Default value is false. + */ + EpgSchedule(const std::string& id, const std::string& channelId, const std::string& programId, const bool repeat = false, const bool newOnly = false, const bool recordSeriesAnytime = false); + + /** + * Pure virtual destructor for cleaning up allocated memory. + */ + virtual ~EpgSchedule() = 0; + + /** + * Gets the program identifier for the schedule. + * @return Program identifier + */ + std::string& GetProgramID(); + + /** + * The repeat flag for the schedule. + */ + bool Repeat; + + /** + * Flag representing if only new programs have to be recorded. + */ + bool NewOnly; + + /** + * Flag representing whether to record only series starting around + * original program start time or any of them. + */ + bool RecordSeriesAnytime; + + private: + /** + * The program identifier for the schedule. + */ + std::string m_programId; + }; +}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/stop_stream_request.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/stop_stream_request.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/stop_stream_request.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/stop_stream_request.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,74 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "request.h" +#include "xml_object_serializer.h" + +using namespace dvblinkremote; +using namespace dvblinkremoteserialization; + +StopStreamRequest::StopStreamRequest(long channelHandle) + : m_channelHandle(channelHandle), m_clientId("") +{ + +} + +StopStreamRequest::StopStreamRequest(const std::string& clientId) + : m_clientId(clientId), m_channelHandle(-1) +{ + +} + +StopStreamRequest::~StopStreamRequest() +{ + +} + +long StopStreamRequest::GetChannelHandle() +{ + return m_channelHandle; +} + +std::string& StopStreamRequest::GetClientID() +{ + return m_clientId; +} + +bool StopStreamRequestSerializer::WriteObject(std::string& serializedData, StopStreamRequest& objectGraph) +{ + tinyxml2::XMLElement* rootElement = PrepareXmlDocumentForObjectSerialization("stop_stream"); + + if (objectGraph.GetChannelHandle() > 0) { + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "channel_handle", objectGraph.GetChannelHandle())); + } + + if (!objectGraph.GetClientID().empty()) { + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "client_id", objectGraph.GetClientID())); + } + + tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); + GetXmlDocument().Accept(printer); + serializedData = std::string(printer->CStr()); + + return true; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/stream.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/stream.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/stream.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/stream.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,88 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "response.h" +#include "xml_object_serializer.h" + +using namespace dvblinkremote; +using namespace dvblinkremoteserialization; + +Stream::Stream() + : m_channelHandle(-1), m_url("") +{ + +} + +Stream::Stream(const long channelHandle, const std::string& url) + : m_channelHandle(channelHandle), m_url(url) +{ + +} + +Stream::Stream(Stream& stream) + : m_channelHandle(stream.GetChannelHandle()), m_url(stream.GetUrl()) +{ + +} + +Stream::~Stream() +{ + +} + +long Stream::GetChannelHandle() +{ + return m_channelHandle; +} + +void Stream::SetChannelHandle(const long channelHandle) +{ + m_channelHandle = channelHandle; +} + +std::string& Stream::GetUrl() +{ + return m_url; +} + +void Stream::SetUrl(const std::string& url) +{ + m_url = url; +} + +bool StreamResponseSerializer::ReadObject(Stream& object, const std::string& xml) +{ + tinyxml2::XMLDocument& doc = GetXmlDocument(); + + if (doc.Parse(xml.c_str()) == tinyxml2::XML_NO_ERROR) { + tinyxml2::XMLElement* elRoot = doc.FirstChildElement("stream"); + long channelHandle = Util::GetXmlFirstChildElementTextAsLong(elRoot, "channel_handle"); + std::string url = Util::GetXmlFirstChildElementText(elRoot, "url"); + object.SetChannelHandle(channelHandle); + object.SetUrl(url); + + return true; + } + + return false; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/streaming_capabilities.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/streaming_capabilities.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/streaming_capabilities.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/streaming_capabilities.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,94 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "request.h" +#include "response.h" +#include "xml_object_serializer.h" + +using namespace dvblinkremote; +using namespace dvblinkremoteserialization; + +GetStreamingCapabilitiesRequest::GetStreamingCapabilitiesRequest() +{ } + +GetStreamingCapabilitiesRequest::~GetStreamingCapabilitiesRequest() +{ } + +StreamingCapabilities::StreamingCapabilities() + : SupportedProtocols(0), + SupportedTranscoders(0) +{ } + +StreamingCapabilities::StreamingCapabilities(StreamingCapabilities& streamingCapabilities) +{ + SupportedProtocols = streamingCapabilities.SupportedProtocols; + SupportedTranscoders = streamingCapabilities.SupportedTranscoders; +} + +StreamingCapabilities::~StreamingCapabilities() +{ } + +bool StreamingCapabilities::IsProtocolSupported(const StreamingCapabilities::DVBLinkSupportedProtocol protocol) +{ + return ((SupportedProtocols & protocol) == protocol); +} + +bool StreamingCapabilities::IsProtocolSupported(const int protocolsToCheck) +{ + return ((SupportedProtocols & protocolsToCheck) == protocolsToCheck); +} + +bool StreamingCapabilities::IsTranscoderSupported(const StreamingCapabilities::DVBLinkSupportedTranscoder transcoder) +{ + return ((SupportedTranscoders & transcoder) == transcoder); +} + +bool StreamingCapabilities::IsTranscoderSupported(const int transcodersToCheck) +{ + return ((SupportedTranscoders & transcodersToCheck) == transcodersToCheck); +} + +bool GetStreamingCapabilitiesRequestSerializer::WriteObject(std::string& serializedData, GetStreamingCapabilitiesRequest& objectGraph) +{ + tinyxml2::XMLElement* rootElement = PrepareXmlDocumentForObjectSerialization("streaming_caps"); + + tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); + GetXmlDocument().Accept(printer); + serializedData = std::string(printer->CStr()); + + return true; +} + +bool StreamingCapabilitiesSerializer::ReadObject(StreamingCapabilities& object, const std::string& xml) +{ + tinyxml2::XMLDocument& doc = GetXmlDocument(); + + if (doc.Parse(xml.c_str()) == tinyxml2::XML_NO_ERROR) { + tinyxml2::XMLElement* elRoot = doc.FirstChildElement("streaming_caps"); + object.SupportedProtocols = Util::GetXmlFirstChildElementTextAsInt(elRoot, "protocols"); + object.SupportedTranscoders = Util::GetXmlFirstChildElementTextAsInt(elRoot, "transcoders"); + return true; + } + + return false; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/stream_request.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/stream_request.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/stream_request.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/stream_request.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,172 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "dvblinkremote.h" +#include "request.h" +#include "xml_object_serializer.h" + +using namespace dvblinkremote; +using namespace dvblinkremoteserialization; + +StreamRequest::StreamRequest(const std::string& serverAddress, const long dvbLinkChannelId, const std::string& clientId, const std::string& streamType) + : m_serverAddress(serverAddress), + m_dvbLinkChannelId(dvbLinkChannelId), + m_clientId(clientId), + m_streamType(streamType) +{ + Duration = -1; +} + +StreamRequest::~StreamRequest() +{ + +} + +std::string& StreamRequest::GetServerAddress() +{ + return m_serverAddress; +} + +long StreamRequest::GetDVBLinkChannelID() +{ + return m_dvbLinkChannelId; +} + +std::string& StreamRequest::GetClientID() +{ + return m_clientId; +} + +std::string& StreamRequest::GetStreamType() +{ + return m_streamType; +} + +RawHttpStreamRequest::RawHttpStreamRequest(const std::string& serverAddress, const long channelDvbLinkId, const std::string& clientId) + : StreamRequest(serverAddress, channelDvbLinkId, clientId, DVBLINK_REMOTE_STREAM_TYPE_RAW_HTTP) +{ + +} + +RawHttpStreamRequest::~RawHttpStreamRequest() +{ + +} + +RawUdpStreamRequest::RawUdpStreamRequest(const std::string& serverAddress, const long channelDvbLinkId, const std::string& clientId, const std::string& clientAddress, const unsigned short int streamingPort) + : m_clientAddress(clientAddress), m_streamingPort(streamingPort), StreamRequest(serverAddress, channelDvbLinkId, clientId, DVBLINK_REMOTE_STREAM_TYPE_RAW_UDP) +{ } + +RawUdpStreamRequest::~RawUdpStreamRequest() +{ + +} + +std::string& RawUdpStreamRequest::GetClientAddress() +{ + return m_clientAddress; +} + +long RawUdpStreamRequest::GetStreamingPort() +{ + return m_streamingPort; +} + +HttpLiveStreamRequest::HttpLiveStreamRequest(const std::string& serverAddress, const long channelDvbLinkId, const std::string& clientId, TranscodingOptions& transcodingOptions) + : TranscodedVideoStreamRequest(serverAddress, channelDvbLinkId, clientId, transcodingOptions, DVBLINK_REMOTE_STREAM_TYPE_IPHONE) +{ + +} + +HttpLiveStreamRequest::~HttpLiveStreamRequest() +{ + +} + +RealTimeTransportProtocolStreamRequest::RealTimeTransportProtocolStreamRequest(const std::string& serverAddress, const long channelDvbLinkId, const std::string& clientId, TranscodingOptions& transcodingOptions) + : TranscodedVideoStreamRequest(serverAddress, channelDvbLinkId, clientId, transcodingOptions, DVBLINK_REMOTE_STREAM_TYPE_ANDROID) +{ + +} + +RealTimeTransportProtocolStreamRequest::~RealTimeTransportProtocolStreamRequest() +{ + +} + +WindowsMediaStreamRequest::WindowsMediaStreamRequest(const std::string& serverAddress, const long channelDvbLinkId, const std::string& clientId, TranscodingOptions& transcodingOptions) + : TranscodedVideoStreamRequest(serverAddress, channelDvbLinkId, clientId, transcodingOptions, DVBLINK_REMOTE_STREAM_TYPE_WINPHONE) +{ + +} + +WindowsMediaStreamRequest::~WindowsMediaStreamRequest() +{ + +} + +bool StreamRequestSerializer::WriteObject(std::string& serializedData, StreamRequest& objectGraph) +{ + tinyxml2::XMLElement* rootElement = PrepareXmlDocumentForObjectSerialization("stream"); + + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "channel_dvblink_id", objectGraph.GetDVBLinkChannelID())); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "client_id", objectGraph.GetClientID())); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "stream_type", objectGraph.GetStreamType())); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "server_address", objectGraph.GetServerAddress())); + + if (objectGraph.GetStreamType() == DVBLINK_REMOTE_STREAM_TYPE_RAW_UDP) { + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "client_address", ((RawUdpStreamRequest&)objectGraph).GetClientAddress())); + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "streaming_port", ((RawUdpStreamRequest&)objectGraph).GetStreamingPort())); + } + + if (objectGraph.GetStreamType() == DVBLINK_REMOTE_STREAM_TYPE_ANDROID || + objectGraph.GetStreamType() == DVBLINK_REMOTE_STREAM_TYPE_IPHONE || + objectGraph.GetStreamType() == DVBLINK_REMOTE_STREAM_TYPE_WINPHONE) { + tinyxml2::XMLElement* xmlTranscoderElement = GetXmlDocument().NewElement("transcoder"); + + TranscodingOptions to = ((TranscodedVideoStreamRequest&)objectGraph).GetTranscodingOptions(); + + xmlTranscoderElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "height", to.GetHeight())); + xmlTranscoderElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "width", to.GetWidth())); + + if (to.GetBitrate() > 0) { + xmlTranscoderElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "bitrate", to.GetBitrate())); + } + + if (!to.GetAudioTrack().empty()) { + xmlTranscoderElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "audio_track", to.GetAudioTrack())); + } + + rootElement->InsertEndChild(xmlTranscoderElement); + } + + if (objectGraph.Duration > 0) { + rootElement->InsertEndChild(Util::CreateXmlElementWithText(&GetXmlDocument(), "duration", objectGraph.Duration)); + } + + tinyxml2::XMLPrinter* printer = new tinyxml2::XMLPrinter(); + GetXmlDocument().Accept(printer); + serializedData = std::string(printer->CStr()); + + return true; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/transcoded_video_stream_request.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/transcoded_video_stream_request.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/transcoded_video_stream_request.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/transcoded_video_stream_request.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,42 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "request.h" + +using namespace dvblinkremote; + +TranscodedVideoStreamRequest::TranscodedVideoStreamRequest(const std::string& serverAddress, const long channelDvbLinkId, const std::string& clientId, TranscodingOptions& transcodingOptions, const std::string& streamType) + : m_transcodingOptions(transcodingOptions), StreamRequest(serverAddress, channelDvbLinkId, clientId, streamType) +{ + +} + +TranscodedVideoStreamRequest::~TranscodedVideoStreamRequest() +{ + +} + +TranscodingOptions& TranscodedVideoStreamRequest::GetTranscodingOptions() +{ + return m_transcodingOptions; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/transcoding_options.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/transcoding_options.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/transcoding_options.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/transcoding_options.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,78 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "request.h" + +using namespace dvblinkremote; + +TranscodingOptions::TranscodingOptions(const unsigned int width, const unsigned int height) + : m_width(width), m_height(height) +{ + m_bitrate = -1; + m_audioTrack = ""; +} + +TranscodingOptions::~TranscodingOptions() +{ + +} + +unsigned int TranscodingOptions::GetWidth() +{ + return m_width; +} + +void TranscodingOptions::SetWidth(const unsigned int width) +{ + m_width = width; +} + +unsigned int TranscodingOptions::GetHeight() +{ + return m_height; +} + +void TranscodingOptions::SetHeight(const unsigned int height) +{ + m_height = height; +} + +unsigned int TranscodingOptions::GetBitrate() +{ + return m_bitrate; +} + +void TranscodingOptions::SetBitrate(const unsigned int bitrate) +{ + m_bitrate = bitrate; +} + +std::string& TranscodingOptions::GetAudioTrack() +{ + return m_audioTrack; +} + +void TranscodingOptions::SetAudioTrack(const std::string& audioTrack) +{ + m_audioTrack = audioTrack; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/util.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/util.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/util.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/util.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,211 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "util.h" + +using namespace dvblinkremote; + +template +bool Util::from_string(T& t, const std::string& s, std::ios_base& (*f)(std::ios_base&)) +{ + std::istringstream iss(s); + return !(iss >> f >> t).fail(); +} + +template bool Util::from_string(int& t, const std::string& s, std::ios_base& (*f)(std::ios_base&)); +template bool Util::from_string(long& t, const std::string& s, std::ios_base& (*f)(std::ios_base&)); + +template +bool Util::to_string(const T& t, std::string& s) +{ + std::ostringstream result; + result << t; + + if (!result.fail()) { + s.assign(result.str()); + return true; + } + + return false; +} + +bool Util::ConvertToInt(const std::string& s, int& value) +{ + return from_string(value, s, std::dec); +} + +bool Util::ConvertToLong(const std::string& s, long& value) +{ + return from_string(value, s, std::dec); +} + +bool Util::ConvertToString(const int& value, std::string& s) +{ + return to_string(value, s); +} + +bool Util::ConvertToString(const unsigned int& value, std::string& s) +{ + return to_string(value, s); +} + +bool Util::ConvertToString(const long& value, std::string& s) +{ + return to_string(value, s); +} + +bool Util::ConvertToString(const bool& value, std::string& s) +{ + if (value) { + s = "true"; + } + else { + s = "false"; + } + + return true; +} + +tinyxml2::XMLElement* Util::CreateXmlElementWithText(tinyxml2::XMLDocument* xmlDocument, const char* elementName, const char* value) +{ + tinyxml2::XMLElement* el = xmlDocument->NewElement(elementName); + el->InsertFirstChild(xmlDocument->NewText(value)); + return el; +} + +tinyxml2::XMLElement* Util::CreateXmlElementWithText(tinyxml2::XMLDocument* xmlDocument, const char* elementName, const std::string& value) +{ + tinyxml2::XMLElement* el = xmlDocument->NewElement(elementName); + el->InsertFirstChild(xmlDocument->NewText(value.c_str())); + return el; +} + +tinyxml2::XMLElement* Util::CreateXmlElementWithText(tinyxml2::XMLDocument* xmlDocument, const char* elementName, int value) +{ + std::string s; + + if (Util::ConvertToString(value, s)) { + return CreateXmlElementWithText(xmlDocument, elementName, s.c_str()); + } + + return NULL; +} + +tinyxml2::XMLElement* Util::CreateXmlElementWithText(tinyxml2::XMLDocument* xmlDocument, const char* elementName, unsigned int value) +{ + std::string s; + + if (Util::ConvertToString(value, s)) { + return CreateXmlElementWithText(xmlDocument, elementName, s.c_str()); + } + + return NULL; +} + +tinyxml2::XMLElement* Util::CreateXmlElementWithText(tinyxml2::XMLDocument* xmlDocument, const char* elementName, long value) +{ + std::string s; + + if (Util::ConvertToString(value, s)) { + return CreateXmlElementWithText(xmlDocument, elementName, s.c_str()); + } + + return NULL; +} + +tinyxml2::XMLElement* Util::CreateXmlElementWithText(tinyxml2::XMLDocument* xmlDocument, const char* elementName, bool value) +{ + std::string s; + + if (Util::ConvertToString(value, s)) { + return CreateXmlElementWithText(xmlDocument, elementName, s.c_str()); + } + + return NULL; +} + +const char* Util::GetXmlFirstChildElementText(const tinyxml2::XMLElement* parentElement, const char* name) +{ + const tinyxml2::XMLElement* el = parentElement->FirstChildElement(name); + const char* s = ""; + + if (el != NULL && el->GetText()) { + s = el->GetText(); + } + + return s; +} + +int Util::GetXmlFirstChildElementTextAsInt(const tinyxml2::XMLElement* parentElement, const char* name) +{ + const tinyxml2::XMLElement* el = parentElement->FirstChildElement(name); + const char* s = "-1"; + int value; + + if (el != NULL && el->GetText()) { + s = el->GetText(); + } + + if (s && !Util::ConvertToInt(s, value)) + { + value = -1; + } + + return value; +} + +long Util::GetXmlFirstChildElementTextAsLong(const tinyxml2::XMLElement* parentElement, const char* name) +{ + const tinyxml2::XMLElement* el = parentElement->FirstChildElement(name); + const char* s = "-1"; + long value; + + if (el != NULL && el->GetText()) { + s = el->GetText(); + } + + if (s && !Util::ConvertToLong(s, value)) + { + value = -1; + } + + return value; +} + +bool Util::GetXmlFirstChildElementTextAsBoolean(const tinyxml2::XMLElement* parentElement, const char* name) +{ + const tinyxml2::XMLElement* el = parentElement->FirstChildElement(name); + const char* s = "false"; + bool value = false; + + if (el != NULL && el->GetText()) { + s = el->GetText(); + } + + if (s && strcmp(s, "true") != 0) + { + value = true; + } + + return value; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/util.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/util.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/util.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/util.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,56 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#pragma once + +#include +#include +#include +#include +#include "tinyxml2/tinyxml2.h" + +namespace dvblinkremote { + class Util { + public: + static bool ConvertToInt(const std::string& s, int& value); + static bool ConvertToLong(const std::string& s, long& value); + static bool ConvertToString(const int& value, std::string&); + static bool ConvertToString(const unsigned int& value, std::string&); + static bool ConvertToString(const long& value, std::string&); + static bool ConvertToString(const bool& value, std::string&); + static tinyxml2::XMLElement* CreateXmlElementWithText(tinyxml2::XMLDocument* xmlDocument, const char* elementName, const char* value); + static tinyxml2::XMLElement* CreateXmlElementWithText(tinyxml2::XMLDocument* xmlDocument, const char* elementName, const std::string& value); + static tinyxml2::XMLElement* CreateXmlElementWithText(tinyxml2::XMLDocument* xmlDocument, const char* elementName, int value); + static tinyxml2::XMLElement* CreateXmlElementWithText(tinyxml2::XMLDocument* xmlDocument, const char* elementName, unsigned int value); + static tinyxml2::XMLElement* CreateXmlElementWithText(tinyxml2::XMLDocument* xmlDocument, const char* elementName, long value); + static tinyxml2::XMLElement* CreateXmlElementWithText(tinyxml2::XMLDocument* xmlDocument, const char* elementName, bool value); + static const char* GetXmlFirstChildElementText(const tinyxml2::XMLElement* parentElement, const char* name); + static int GetXmlFirstChildElementTextAsInt(const tinyxml2::XMLElement* parentElement, const char* name); + static long GetXmlFirstChildElementTextAsLong(const tinyxml2::XMLElement* parentElement, const char* name); + static bool GetXmlFirstChildElementTextAsBoolean(const tinyxml2::XMLElement* parentElement, const char* name); + + private: + template static bool from_string(T& t, const std::string& s, std::ios_base& (*f)(std::ios_base&)); + template static bool to_string(const T& t, std::string& s); + }; +} \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/version.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/version.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/version.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/version.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,30 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#pragma once + +#define LIBDVBLINKREMOTE_COPYRIGHT "2012 Marcus Efraimsson" +#define LIBDVBLINKREMOTE_VERSION "0.2.0" +#define LIBDVBLINKREMOTE_VERSION_MAJOR 0 +#define LIBDVBLINKREMOTE_VERSION_MINOR 2 +#define LIBDVBLINKREMOTE_VERSION_PATCH 0 diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/xml_object_serializer_factory.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/xml_object_serializer_factory.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/xml_object_serializer_factory.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/xml_object_serializer_factory.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,181 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#include "xml_object_serializer.h" + +using namespace dvblinkremoteserialization; + +bool XmlObjectSerializerFactory::Serialize(const std::string& dvbLinkCommand, const Request& request, std::string& serializedData) +{ + bool result = true; + XmlObjectSerializer* requestSerializer = NULL; + + if (dvbLinkCommand == DVBLINK_REMOTE_GET_CHANNELS_CMD) { + requestSerializer = (XmlObjectSerializer*)new GetChannelsRequestSerializer(); + result = ((GetChannelsRequestSerializer*)requestSerializer)->WriteObject(serializedData, (GetChannelsRequest&)request); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_SEARCH_EPG_CMD) { + requestSerializer = (XmlObjectSerializer*)new EpgSearchRequestSerializer(); + result = ((EpgSearchRequestSerializer*)requestSerializer)->WriteObject(serializedData, (EpgSearchRequest&)request); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_PLAY_CHANNEL_CMD) { + requestSerializer = (XmlObjectSerializer*)new StreamRequestSerializer(); + result = ((StreamRequestSerializer*)requestSerializer)->WriteObject(serializedData, (StreamRequest&)request); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_STOP_CHANNEL_CMD) { + requestSerializer = (XmlObjectSerializer*)new StopStreamRequestSerializer(); + result = ((StopStreamRequestSerializer*)requestSerializer)->WriteObject(serializedData, (StopStreamRequest&)request); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_GET_RECORDINGS_CMD) { + requestSerializer = (XmlObjectSerializer*)new GetRecordingsRequestSerializer(); + result = ((GetRecordingsRequestSerializer*)requestSerializer)->WriteObject(serializedData, (GetRecordingsRequest&)request); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_REMOVE_RECORDING_CMD) { + requestSerializer = (XmlObjectSerializer*)new RemoveRecordingRequestSerializer(); + result = ((RemoveRecordingRequestSerializer*)requestSerializer)->WriteObject(serializedData, (RemoveRecordingRequest&)request); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_ADD_SCHEDULE_CMD) { + requestSerializer = (XmlObjectSerializer*)new AddScheduleRequestSerializer(); + result = ((AddScheduleRequestSerializer*)requestSerializer)->WriteObject(serializedData, (AddScheduleRequest&)request); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_GET_SCHEDULES_CMD) { + requestSerializer = (XmlObjectSerializer*)new GetSchedulesRequestSerializer(); + result = ((GetSchedulesRequestSerializer*)requestSerializer)->WriteObject(serializedData, (GetSchedulesRequest&)request); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_UPDATE_SCHEDULE_CMD) { + requestSerializer = (XmlObjectSerializer*)new UpdateScheduleRequestSerializer(); + result = ((UpdateScheduleRequestSerializer*)requestSerializer)->WriteObject(serializedData, (UpdateScheduleRequest&)request); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_REMOVE_SCHEDULE_CMD) { + requestSerializer = (XmlObjectSerializer*)new RemoveScheduleRequestSerializer(); + result = ((RemoveScheduleRequestSerializer*)requestSerializer)->WriteObject(serializedData, (RemoveScheduleRequest&)request); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_GET_PARENTAL_STATUS_CMD) { + requestSerializer = (XmlObjectSerializer*)new GetParentalStatusRequestSerializer(); + result = ((GetParentalStatusRequestSerializer*)requestSerializer)->WriteObject(serializedData, (GetParentalStatusRequest&)request); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_SET_PARENTAL_LOCK_CMD) { + requestSerializer = (XmlObjectSerializer*)new SetParentalLockRequestSerializer(); + result = ((SetParentalLockRequestSerializer*)requestSerializer)->WriteObject(serializedData, (SetParentalLockRequest&)request); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_GET_PLAYLIST_M3U_CMD) { + requestSerializer = (XmlObjectSerializer*)new GetM3uPlaylistRequestSerializer(); + result = ((GetM3uPlaylistRequestSerializer*)requestSerializer)->WriteObject(serializedData, (GetM3uPlaylistRequest&)request); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_GET_OBJECT_CMD) { + requestSerializer = (XmlObjectSerializer*)new GetPlaybackObjectRequestSerializer(); + result = ((GetPlaybackObjectRequestSerializer*)requestSerializer)->WriteObject(serializedData, (GetPlaybackObjectRequest&)request); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_REMOVE_OBJECT_CMD) { + requestSerializer = (XmlObjectSerializer*)new RemovePlaybackObjectRequestSerializer(); + result = ((RemovePlaybackObjectRequestSerializer*)requestSerializer)->WriteObject(serializedData, (RemovePlaybackObjectRequest&)request); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_STOP_RECORDING_CMD) { + requestSerializer = (XmlObjectSerializer*)new StopRecordingRequestSerializer(); + result = ((StopRecordingRequestSerializer*)requestSerializer)->WriteObject(serializedData, (StopRecordingRequest&)request); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_GET_STREAMING_CAPABILITIES_CMD) { + requestSerializer = (XmlObjectSerializer*)new GetStreamingCapabilitiesRequestSerializer(); + result = ((GetStreamingCapabilitiesRequestSerializer*)requestSerializer)->WriteObject(serializedData, (GetStreamingCapabilitiesRequest&)request); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_GET_RECORDING_SETTINGS_CMD) { + requestSerializer = (XmlObjectSerializer*)new GetRecordingSettingsRequestSerializer(); + result = ((GetRecordingSettingsRequestSerializer*)requestSerializer)->WriteObject(serializedData, (GetRecordingSettingsRequest&)request); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_SET_RECORDING_SETTING_CMD) { + requestSerializer = (XmlObjectSerializer*)new SetRecordingSettingsRequestSerializer(); + result = ((SetRecordingSettingsRequestSerializer*)requestSerializer)->WriteObject(serializedData, (SetRecordingSettingsRequest&)request); + } + else { + result = false; + } + + if (requestSerializer) { + delete requestSerializer; + } + + return result; +} + +bool XmlObjectSerializerFactory::Deserialize(const std::string& dvbLinkCommand, const std::string& serializedData, Response& response) +{ + bool result = true; + XmlObjectSerializer* responseSerializer = NULL; + + if (dvbLinkCommand == DVBLINK_REMOTE_GET_CHANNELS_CMD) { + GetChannelsResponseSerializer* serializer = new GetChannelsResponseSerializer(); + result = serializer->ReadObject((ChannelList&)response, serializedData); + delete serializer; + } + else if (dvbLinkCommand == DVBLINK_REMOTE_SEARCH_EPG_CMD) { + responseSerializer = (XmlObjectSerializer*)new EpgSearchResponseSerializer(); + result = ((EpgSearchResponseSerializer*)responseSerializer)->ReadObject((EpgSearchResult&)response, serializedData); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_PLAY_CHANNEL_CMD) { + responseSerializer = (XmlObjectSerializer*)new StreamResponseSerializer(); + result = ((StreamResponseSerializer*)responseSerializer)->ReadObject((Stream&)response, serializedData); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_GET_RECORDINGS_CMD) { + responseSerializer = (XmlObjectSerializer*)new GetRecordingsResponseSerializer(); + result = ((GetRecordingsResponseSerializer*)responseSerializer)->ReadObject((RecordingList&)response, serializedData); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_GET_SCHEDULES_CMD) { + responseSerializer = (XmlObjectSerializer*)new GetSchedulesResponseSerializer(); + result = ((GetSchedulesResponseSerializer*)responseSerializer)->ReadObject((StoredSchedules&)response, serializedData); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_SET_PARENTAL_LOCK_CMD || dvbLinkCommand == DVBLINK_REMOTE_GET_PARENTAL_STATUS_CMD) { + responseSerializer = (XmlObjectSerializer*)new ParentalStatusSerializer(); + result = ((ParentalStatusSerializer*)responseSerializer)->ReadObject((ParentalStatus&)response, serializedData); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_GET_OBJECT_CMD) { + responseSerializer = (XmlObjectSerializer*)new GetPlaybackObjectResponseSerializer(); + result = ((GetPlaybackObjectResponseSerializer*)responseSerializer)->ReadObject((GetPlaybackObjectResponse&)response, serializedData); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_GET_STREAMING_CAPABILITIES_CMD) { + responseSerializer = (XmlObjectSerializer*)new StreamingCapabilitiesSerializer(); + result = ((StreamingCapabilitiesSerializer*)responseSerializer)->ReadObject((StreamingCapabilities&)response, serializedData); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_GET_RECORDING_SETTINGS_CMD) { + responseSerializer = (XmlObjectSerializer*)new RecordingSettingsSerializer(); + result = ((RecordingSettingsSerializer*)responseSerializer)->ReadObject((RecordingSettings&)response, serializedData); + } + else if (dvbLinkCommand == DVBLINK_REMOTE_ADD_SCHEDULE_CMD || + dvbLinkCommand == DVBLINK_REMOTE_UPDATE_SCHEDULE_CMD || + dvbLinkCommand == DVBLINK_REMOTE_REMOVE_SCHEDULE_CMD || + dvbLinkCommand == DVBLINK_REMOTE_REMOVE_RECORDING_CMD || + dvbLinkCommand == DVBLINK_REMOTE_STOP_CHANNEL_CMD || + dvbLinkCommand == DVBLINK_REMOTE_REMOVE_OBJECT_CMD || + dvbLinkCommand == DVBLINK_REMOTE_STOP_RECORDING_CMD || + dvbLinkCommand == DVBLINK_REMOTE_SET_RECORDING_SETTING_CMD) { + result = true; + } + else { + result = false; + } + + if (responseSerializer) { + delete responseSerializer; + } + + return result; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/xml_object_serializer.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/xml_object_serializer.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/libdvblinkremote/xml_object_serializer.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/xml_object_serializer.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,412 @@ +/*************************************************************************** + * Copyright (C) 2012 Marcus Efraimsson. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + ***************************************************************************/ + +#pragma once + +#include +#include "dvblinkremote.h" +#include "dvblinkremoteserialization.h" +#include "generic_response.h" +#include "request.h" +#include "response.h" +#include "util.h" +#include "tinyxml2/tinyxml2.h" + +using namespace dvblinkremote; + +namespace dvblinkremoteserialization { + template + class XmlObjectSerializer + { + public: + XmlObjectSerializer(); + virtual ~XmlObjectSerializer() = 0; + + bool WriteObject(std::string& serializedData, T& objectGraph); + bool ReadObject(T& object, const std::string& xml); + bool HasChildElement(const tinyxml2::XMLElement& element, const char* childElementName); + + protected: + tinyxml2::XMLDocument& GetXmlDocument() { return *m_xmlDocument; } + tinyxml2::XMLElement* PrepareXmlDocumentForObjectSerialization(const char* rootElementName); + + private: + tinyxml2::XMLDocument* m_xmlDocument; + }; + + class XmlObjectSerializerFactory + { + public: + static bool Serialize(const std::string& dvbLinkCommand, const Request& request, std::string& serializedData); + static bool Deserialize(const std::string& dvbLinkCommand, const std::string& serializedData, Response& response); + }; + + class GenericResponseSerializer : public XmlObjectSerializer + { + public: + GenericResponseSerializer(); + bool ReadObject(GenericResponse& object, const std::string& xml); + }; + + class GetChannelsRequestSerializer : public XmlObjectSerializer + { + public: + GetChannelsRequestSerializer() : XmlObjectSerializer() { } + bool WriteObject(std::string& serializedData, GetChannelsRequest& objectGraph); + }; + + class GetChannelsResponseSerializer : public XmlObjectSerializer + { + public: + GetChannelsResponseSerializer() : XmlObjectSerializer() { } + bool ReadObject(ChannelList& object, const std::string& xml); + + private: + class GetChannelsResponseXmlDataDeserializer : public tinyxml2::XMLVisitor + { + private: + GetChannelsResponseSerializer& m_parent; + ChannelList& m_channelList; + + public: + GetChannelsResponseXmlDataDeserializer(GetChannelsResponseSerializer& parent, ChannelList& channelList); + ~GetChannelsResponseXmlDataDeserializer(); + bool VisitEnter(const tinyxml2::XMLElement& element, const tinyxml2::XMLAttribute* attribute); + }; + }; + + class EpgSearchRequestSerializer : public XmlObjectSerializer + { + public: + EpgSearchRequestSerializer() : XmlObjectSerializer() { } + bool WriteObject(std::string& serializedData, EpgSearchRequest& objectGraph); + }; + + class EpgSearchResponseSerializer : public XmlObjectSerializer + { + public: + EpgSearchResponseSerializer() : XmlObjectSerializer() { } + bool ReadObject(EpgSearchResult& object, const std::string& xml); + + private: + class ChannelEpgXmlDataDeserializer : public tinyxml2::XMLVisitor + { + private: + EpgSearchResponseSerializer& m_parent; + EpgSearchResult& m_epgSearchResult; + + public: + ChannelEpgXmlDataDeserializer(EpgSearchResponseSerializer& parent, EpgSearchResult& epgSearchResult); + ~ChannelEpgXmlDataDeserializer(); + bool VisitEnter(const tinyxml2::XMLElement& element, const tinyxml2::XMLAttribute* attribute); + }; + + class ProgramListXmlDataDeserializer : public tinyxml2::XMLVisitor + { + private: + EpgSearchResponseSerializer& m_parent; + ChannelEpgData& m_channelEpgData; + + public: + ProgramListXmlDataDeserializer(EpgSearchResponseSerializer& parent, ChannelEpgData& channelEpgData); + ~ProgramListXmlDataDeserializer(); + bool VisitEnter(const tinyxml2::XMLElement& element, const tinyxml2::XMLAttribute* attribute); + }; + }; + + class ProgramSerializer + { + public: + static void Deserialize(XmlObjectSerializer& objectSerializer, const tinyxml2::XMLElement& element, dvblinkremote::Program& program); + }; + + class StreamRequestSerializer : public XmlObjectSerializer + { + public: + StreamRequestSerializer() : XmlObjectSerializer() { } + bool WriteObject(std::string& serializedData, StreamRequest& objectGraph); + }; + + class StreamResponseSerializer : public XmlObjectSerializer + { + public: + StreamResponseSerializer() : XmlObjectSerializer() { } + bool ReadObject(Stream& object, const std::string& xml); + }; + + class StopStreamRequestSerializer : public XmlObjectSerializer + { + public: + StopStreamRequestSerializer() : XmlObjectSerializer() { } + bool WriteObject(std::string& serializedData, StopStreamRequest& objectGraph); + }; + + class AddScheduleRequestSerializer : public XmlObjectSerializer + { + public: + AddScheduleRequestSerializer() : XmlObjectSerializer() { } + bool WriteObject(std::string& serializedData, AddScheduleRequest& objectGraph); + }; + + class GetSchedulesRequestSerializer : public XmlObjectSerializer + { + public: + GetSchedulesRequestSerializer() : XmlObjectSerializer() { } + bool WriteObject(std::string& serializedData, GetSchedulesRequest& objectGraph); + }; + + class GetSchedulesResponseSerializer : public XmlObjectSerializer + { + public: + GetSchedulesResponseSerializer() : XmlObjectSerializer() { } + bool ReadObject(StoredSchedules& object, const std::string& xml); + + private: + class GetSchedulesResponseXmlDataDeserializer : public tinyxml2::XMLVisitor + { + private: + GetSchedulesResponseSerializer& m_parent; + StoredSchedules& m_storedSchedules; + + public: + GetSchedulesResponseXmlDataDeserializer(GetSchedulesResponseSerializer& parent, StoredSchedules& storedSchedules); + ~GetSchedulesResponseXmlDataDeserializer(); + bool VisitEnter(const tinyxml2::XMLElement& element, const tinyxml2::XMLAttribute* attribute); + }; + }; + + class UpdateScheduleRequestSerializer : public XmlObjectSerializer + { + public: + UpdateScheduleRequestSerializer() : XmlObjectSerializer() { } + bool WriteObject(std::string& serializedData, UpdateScheduleRequest& objectGraph); + }; + + class GetRecordingsRequestSerializer : public XmlObjectSerializer + { + public: + GetRecordingsRequestSerializer() : XmlObjectSerializer() { } + bool WriteObject(std::string& serializedData, GetRecordingsRequest& objectGraph); + }; + + class GetRecordingsResponseSerializer : public XmlObjectSerializer + { + public: + GetRecordingsResponseSerializer() : XmlObjectSerializer() { } + bool ReadObject(RecordingList& object, const std::string& xml); + + private: + class GetRecordingsResponseXmlDataDeserializer : public tinyxml2::XMLVisitor + { + private: + GetRecordingsResponseSerializer& m_parent; + RecordingList& m_recordingList; + + public: + GetRecordingsResponseXmlDataDeserializer(GetRecordingsResponseSerializer& parent, RecordingList& recordingList); + ~GetRecordingsResponseXmlDataDeserializer(); + bool VisitEnter(const tinyxml2::XMLElement& element, const tinyxml2::XMLAttribute* attribute); + }; + }; + + class RemoveRecordingRequestSerializer : public XmlObjectSerializer + { + public: + RemoveRecordingRequestSerializer() : XmlObjectSerializer() { } + bool WriteObject(std::string& serializedData, RemoveRecordingRequest& objectGraph); + }; + + class RemoveScheduleRequestSerializer : public XmlObjectSerializer + { + public: + RemoveScheduleRequestSerializer() : XmlObjectSerializer() { } + bool WriteObject(std::string& serializedData, RemoveScheduleRequest& objectGraph); + }; + + class ParentalStatusSerializer : public XmlObjectSerializer + { + public: + ParentalStatusSerializer() : XmlObjectSerializer() { } + bool ReadObject(ParentalStatus& object, const std::string& xml); + }; + + class GetParentalStatusRequestSerializer : public XmlObjectSerializer + { + public: + GetParentalStatusRequestSerializer() : XmlObjectSerializer() { } + bool WriteObject(std::string& serializedData, GetParentalStatusRequest& objectGraph); + }; + + class SetParentalLockRequestSerializer : public XmlObjectSerializer + { + public: + SetParentalLockRequestSerializer() : XmlObjectSerializer() { } + bool WriteObject(std::string& serializedData, SetParentalLockRequest& objectGraph); + }; + + class GetM3uPlaylistRequestSerializer : public XmlObjectSerializer + { + public: + GetM3uPlaylistRequestSerializer() : XmlObjectSerializer() { } + bool WriteObject(std::string& serializedData, GetM3uPlaylistRequest& objectGraph); + }; + + class GetPlaybackObjectRequestSerializer : public XmlObjectSerializer + { + public: + GetPlaybackObjectRequestSerializer() : XmlObjectSerializer() { } + bool WriteObject(std::string& serializedData, GetPlaybackObjectRequest& objectGraph); + }; + + class GetPlaybackObjectResponseSerializer : public XmlObjectSerializer + { + public: + GetPlaybackObjectResponseSerializer() : XmlObjectSerializer() { } + bool ReadObject(GetPlaybackObjectResponse& object, const std::string& xml); + + private: + class PlaybackContainerXmlDataDeserializer : public tinyxml2::XMLVisitor + { + private: + GetPlaybackObjectResponseSerializer& m_parent; + PlaybackContainerList& m_playbackContainerList; + + public: + PlaybackContainerXmlDataDeserializer(GetPlaybackObjectResponseSerializer& parent, PlaybackContainerList& playbackContainerlist); + ~PlaybackContainerXmlDataDeserializer(); + bool VisitEnter(const tinyxml2::XMLElement& element, const tinyxml2::XMLAttribute* attribute); + }; + + class PlaybackItemXmlDataDeserializer : public tinyxml2::XMLVisitor + { + private: + GetPlaybackObjectResponseSerializer& m_parent; + PlaybackItemList& m_playbackItemList; + + public: + PlaybackItemXmlDataDeserializer(GetPlaybackObjectResponseSerializer& parent, PlaybackItemList& playbackItemList); + ~PlaybackItemXmlDataDeserializer(); + bool VisitEnter(const tinyxml2::XMLElement& element, const tinyxml2::XMLAttribute* attribute); + }; + }; + + class RemovePlaybackObjectRequestSerializer : public XmlObjectSerializer + { + public: + RemovePlaybackObjectRequestSerializer() : XmlObjectSerializer() { } + bool WriteObject(std::string& serializedData, RemovePlaybackObjectRequest& objectGraph); + }; + + class StopRecordingRequestSerializer : public XmlObjectSerializer + { + public: + StopRecordingRequestSerializer() : XmlObjectSerializer() { } + bool WriteObject(std::string& serializedData, StopRecordingRequest& objectGraph); + }; + + class GetStreamingCapabilitiesRequestSerializer : public XmlObjectSerializer + { + public: + GetStreamingCapabilitiesRequestSerializer() : XmlObjectSerializer() { } + bool WriteObject(std::string& serializedData, GetStreamingCapabilitiesRequest& objectGraph); + }; + + class StreamingCapabilitiesSerializer : public XmlObjectSerializer + { + public: + StreamingCapabilitiesSerializer() : XmlObjectSerializer() { } + bool ReadObject(StreamingCapabilities& object, const std::string& xml); + }; + + class GetRecordingSettingsRequestSerializer : public XmlObjectSerializer + { + public: + GetRecordingSettingsRequestSerializer() : XmlObjectSerializer() { } + bool WriteObject(std::string& serializedData, GetRecordingSettingsRequest& objectGraph); + }; + + class RecordingSettingsSerializer : public XmlObjectSerializer + { + public: + RecordingSettingsSerializer() : XmlObjectSerializer() { } + bool ReadObject(RecordingSettings& object, const std::string& xml); + }; + + class SetRecordingSettingsRequestSerializer : public XmlObjectSerializer + { + public: + SetRecordingSettingsRequestSerializer() : XmlObjectSerializer() { } + bool WriteObject(std::string& serializedData, SetRecordingSettingsRequest& objectGraph); + }; + + class ItemMetadataSerializer + { + public: + static void Deserialize(XmlObjectSerializer& objectSerializer, const tinyxml2::XMLElement& element, ItemMetadata& itemMetadata); + static void Deserialize(XmlObjectSerializer& objectSerializer, const tinyxml2::XMLElement& element, RecordedTvItemMetadata& metadata); + static void Deserialize(XmlObjectSerializer& objectSerializer, const tinyxml2::XMLElement& element, VideoItemMetadata& metadata); + }; + + template + XmlObjectSerializer::XmlObjectSerializer() + { + m_xmlDocument = new tinyxml2::XMLDocument(); + } + + template + XmlObjectSerializer::~XmlObjectSerializer() + { + if (m_xmlDocument) { + delete m_xmlDocument; + } + } + + template + bool XmlObjectSerializer::WriteObject(std::string& serializedData, T& objectGraph) + { + return false; + } + + template + bool XmlObjectSerializer::ReadObject(T& object, const std::string& xml) + { + return false; + } + + template + tinyxml2::XMLElement* XmlObjectSerializer::PrepareXmlDocumentForObjectSerialization(const char* rootElementName) + { + m_xmlDocument->InsertFirstChild(m_xmlDocument->NewDeclaration(DVBLINK_REMOTE_SERIALIZATION_XML_DECLARATION.c_str())); + tinyxml2::XMLElement* xmlRootElement = m_xmlDocument->NewElement(rootElementName); + xmlRootElement->SetAttribute("xmlns:i", DVBLINK_REMOTE_SERIALIZATION_XML_I_NAMESPACE.c_str()); + xmlRootElement->SetAttribute("xmlns", DVBLINK_REMOTE_SERIALIZATION_XML_NAMESPACE.c_str()); + m_xmlDocument->InsertEndChild(xmlRootElement); + return xmlRootElement; + } + + template + bool XmlObjectSerializer::HasChildElement(const tinyxml2::XMLElement& element, const char* childElementName) + { + return element.FirstChildElement(childElementName) != NULL; + } +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/Makefile.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/Makefile.am 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/Makefile.am 2014-01-04 10:28:12.000000000 +0000 @@ -2,7 +2,7 @@ ADDITIONAL_SUBDIRS = cmyth endif -SUBDIRS = libhts tinyxml jsoncpp $(ADDITIONAL_SUBDIRS) +SUBDIRS = libhts tinyxml tinyxml2 jsoncpp libdvblinkremote $(ADDITIONAL_SUBDIRS) zip: diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/platform/posix/os-socket.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/platform/posix/os-socket.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/platform/posix/os-socket.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/platform/posix/os-socket.h 2014-01-04 10:28:12.000000000 +0000 @@ -216,16 +216,16 @@ fds.events = POLLIN; fds.revents = 0; - while (iBytesRead >= 0 && iBytesRead < (ssize_t)len && (iTimeoutMs == 0 || iTarget > iNow)) + while (iBytesRead >= 0 && + iBytesRead < (ssize_t)len && + (iTimeoutMs == 0 || iTarget > iNow) && + *iError == 0) { if (iTimeoutMs > 0) { int iPollResult = poll(&fds, 1, iTarget - iNow); if (iPollResult == 0) - { *iError = ETIMEDOUT; - return -ETIMEDOUT; - } } ssize_t iReadResult = (iTimeoutMs > 0) ? @@ -236,12 +236,11 @@ if (errno == EAGAIN && iTimeoutMs > 0) continue; *iError = errno; - return -errno; + return (iBytesRead > 0) ? iBytesRead : -errno; } else if (iReadResult == 0 || (iReadResult != (ssize_t)len && iTimeoutMs == 0)) { *iError = ECONNRESET; - return -ECONNRESET; } iBytesRead += iReadResult; @@ -250,7 +249,7 @@ iNow = GetTimeMs(); } - if (iBytesRead < (ssize_t)len) + if (iBytesRead < (ssize_t)len && iError == 0) *iError = ETIMEDOUT; return iBytesRead; } diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/platform/windows/os-socket.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/platform/windows/os-socket.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/platform/windows/os-socket.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/platform/windows/os-socket.h 2014-01-04 10:28:12.000000000 +0000 @@ -173,7 +173,7 @@ fd_set fd_read; struct timeval tv; - while (iBytesRead >= 0 && iBytesRead < (ssize_t)len && (iTimeoutMs == 0 || iTarget > iNow)) + while (iBytesRead >= 0 && iBytesRead < (ssize_t)len && (iTimeoutMs == 0 || iTarget > iNow) && *iError == 0) { if (iTimeoutMs > 0) { @@ -186,7 +186,6 @@ if (select((int)socket + 1, &fd_read, NULL, NULL, &tv) == 0) { *iError = ETIMEDOUT; - return ETIMEDOUT; } TcpSocketSetBlocking(socket, false); } @@ -194,7 +193,7 @@ ssize_t iReadResult = (iTimeoutMs > 0) ? recv(socket, (char*)data + iBytesRead, (int)(len - iBytesRead), 0) : recv(socket, (char*)data, (int)len, MSG_WAITALL); - *iError = GetSocketError(); + int iSocketError = GetSocketError(); if (iTimeoutMs > 0) { @@ -204,14 +203,14 @@ if (iReadResult < 0) { - if (*iError == EAGAIN && iTimeoutMs > 0) + if (iSocketError == EAGAIN && iTimeoutMs > 0) continue; - return -1; + *iError = iSocketError; + return (iBytesRead > 0) ? iBytesRead : -iSocketError; } else if (iReadResult == 0 || (iReadResult != (ssize_t)len && iTimeoutMs == 0)) { *iError = ECONNRESET; - return -1; } iBytesRead += iReadResult; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/CMakeLists.txt xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/CMakeLists.txt --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/CMakeLists.txt 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,86 @@ +cmake_minimum_required(VERSION 2.6 FATAL_ERROR) +cmake_policy(VERSION 2.6) + +project(tinyxml2) +include(GNUInstallDirs) +#enable_testing() + +#CMAKE_BUILD_TOOL + +################################ +# set lib version here + +set(GENERIC_LIB_VERSION "1.0.11") +set(GENERIC_LIB_SOVERSION "1") + + +################################ +# Add common source + +include_directories("${CMAKE_CURRENT_SOURCE_DIR}/.") + +################################ +# Add custom target to copy all data + +set(TARGET_DATA_COPY DATA_COPY) +if(${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR}) + add_custom_target( + ${TARGET_DATA_COPY} + COMMAND ${CMAKE_COMMAND} -E echo "In source build") +else(${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR}) + make_directory(${CMAKE_CURRENT_BINARY_DIR}/resources/) + add_custom_target( + ${TARGET_DATA_COPY} + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/resources/dream.xml ${CMAKE_CURRENT_BINARY_DIR}/resources/ + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/resources/utf8test.xml ${CMAKE_CURRENT_BINARY_DIR}/resources/ + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/resources/utf8testverify.xml ${CMAKE_CURRENT_BINARY_DIR}/resources/) +endif(${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR}) + +################################ +# Add definitions + +if(MSVC) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) +endif(MSVC) + +################################ +# Add targets +set(BUILD_STATIC_LIBS ON CACHE BOOL "Set to ON to build static libraries") +if(BUILD_STATIC_LIBS) + add_library(tinyxml2static STATIC tinyxml2.cpp tinyxml2.h) + set_target_properties(tinyxml2static PROPERTIES OUTPUT_NAME tinyxml2) +endif(BUILD_STATIC_LIBS) +add_library(tinyxml2 SHARED tinyxml2.cpp tinyxml2.h) +set_target_properties(tinyxml2 PROPERTIES + VERSION "${GENERIC_LIB_VERSION}" + SOVERSION "${GENERIC_LIB_SOVERSION}") + +add_executable(test xmltest.cpp) +add_dependencies(test tinyxml2) +add_dependencies(test ${TARGET_DATA_COPY}) +target_link_libraries(test tinyxml2) + + +if(BUILD_STATIC_LIBS) + install(TARGETS tinyxml2 tinyxml2static + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) +else(BUILD_STATIC_LIBS) + install(TARGETS tinyxml2 + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) +endif(BUILD_STATIC_LIBS) +install(FILES tinyxml2.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + +foreach(p LIB INCLUDE) + set(var CMAKE_INSTALL_${p}DIR) + if(NOT IS_ABSOLUTE "${${var}}") + set(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}") + endif() +endforeach() + +configure_file(tinyxml2.pc.in tinyxml2.pc @ONLY) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/tinyxml2.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) + +#add_test(test ${SAMPLE_NAME} COMMAND $) diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/dox xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/dox --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/dox 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/dox 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,1866 @@ +# Doxyfile 1.8.3 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" "). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. + +PROJECT_NAME = "TinyXML-2" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 1.0.11 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = . + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. Note that you specify absolute paths here, but also +# relative paths, which will be relative from the directory where doxygen is +# started. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, +# and language is one of the parsers supported by doxygen: IDL, Java, +# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, +# C++. For instance to make doxygen treat .inc files as Fortran files (default +# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note +# that for custom extensions you also need to set FILE_PATTERNS otherwise the +# files are not read by doxygen. + +EXTENSION_MAPPING = + +# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all +# comments according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you +# can mix doxygen, HTML, and XML commands with Markdown formatting. +# Disable only in case of backward compatibilities issues. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented classes, +# or namespaces to their corresponding documentation. Such a link can be +# prevented in individual cases by by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES (the +# default) will make doxygen replace the get and set methods by a property in +# the documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields will be shown inline in the documentation +# of the scope in which they are defined (i.e. file, namespace, or group +# documentation), provided this scope is documented. If set to NO (the default), +# structs, classes, and unions are shown on a separate page (for HTML and Man +# pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penalty. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +SYMBOL_CACHE_SIZE = 0 + +# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be +# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given +# their name and scope. Since this can be an expensive process and often the +# same symbol appear multiple times in the code, doxygen keeps a cache of +# pre-resolved symbols. If the cache is too small doxygen will become slower. +# If the cache is too large, memory is wasted. The cache size is given by this +# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# scope will be included in the documentation. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = YES + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = YES + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = NO + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = NO + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = NO + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if section-label ... \endif +# and \cond section-label ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. Do not use +# file names with spaces, bibtex cannot handle them. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = NO + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = tinyxml2.h \ + xmltest.cpp \ + readme.md + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = . + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page (index.html). +# This can be useful if you have a project on for instance GitHub and want reuse +# the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = readme.md + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C, C++ and Fortran comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = docs + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If left blank doxygen will +# generate a default style sheet. Note that it is recommended to use +# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this +# tag will in the future become obsolete. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional +# user-defined cascading style sheet that is included after the standard +# style sheets created by doxygen. Using this option one can overrule +# certain style aspects. This is preferred over using HTML_STYLESHEET +# since it does not replace the standard style sheet and is therefor more +# robust against future updates. Doxygen will copy the style sheet file to +# the output directory. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of +# entries shown in the various tree structured indices initially; the user +# can expand and collapse entries dynamically later on. Doxygen will expand +# the tree to such a level that at most the specified number of entries are +# visible (unless a fully collapsed tree already exceeds this amount). +# So setting the number of entries 1 will produce a full collapsed tree by +# default. 0 is a special value representing an infinite number of entries +# and will result in a full expanded tree by default. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely +# identify the documentation publisher. This should be a reverse domain-name +# style string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = YES + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you may also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# thA MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and +# SVG. The default value is HTML-CSS, which is slower, but has the best +# compatibility. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to +# the MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. +# However, it is strongly recommended to install a local +# copy of MathJax from http://www.mathjax.org before deployment. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a web server instead of a web client using Javascript. +# There are two flavours of web server based search depending on the +# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for +# searching and an index file used by the script. When EXTERNAL_SEARCH is +# enabled the indexing and searching needs to be provided by external tools. +# See the manual for details. + +SERVER_BASED_SEARCH = NO + +# When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP +# script for searching. Instead the search results are written to an XML file +# which needs to be processed by an external indexer. Doxygen will invoke an +# external search engine pointed to by the SEARCHENGINE_URL option to obtain +# the search results. Doxygen ships with an example indexer (doxyindexer) and +# search engine (doxysearch.cgi) which are based on the open source search engine +# library Xapian. See the manual for configuration details. + +EXTERNAL_SEARCH = NO + +# The SEARCHENGINE_URL should point to a search engine hosted by a web server +# which will returned the search results when EXTERNAL_SEARCH is enabled. +# Doxygen ships with an example search engine (doxysearch) which is based on +# the open source search engine library Xapian. See the manual for configuration +# details. + +SEARCHENGINE_URL = + +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed +# search data is written to a file for indexing by an external tool. With the +# SEARCHDATA_FILE tag the name of this file can be specified. + +SEARCHDATA_FILE = searchdata.xml + +# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through other +# doxygen projects that are not otherwise connected via tags files, but are +# all added to the same search index. Each project needs to have a tag file set +# via GENERATE_TAGFILE. The search mapping then maps the name of the tag file +# to a relative location where the documentation can be found, +# similar to the +# TAGFILES option but without actually processing the tag file. +# The format is: EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... + +EXTRA_SEARCH_MAPPINGS = + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load style sheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. For each +# tag file the location of the external documentation should be added. The +# format of a tag file without this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths +# or URLs. Note that each tag file must have a unique name (where the name does +# NOT include the path). If a tag file is not located in the directory in which +# doxygen is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside +# the class node. If there are many fields or methods and many nodes the +# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS +# threshold limits the number of items for each type to make the size more +# managable. Set this to 0 for no limit. Note that the threshold may be +# exceeded by 50% before the limit is enforced. + +UML_LIMIT_NUM_FIELDS = 10 + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/Makefile.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/Makefile.am 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,7 @@ +noinst_LTLIBRARIES = libtinyxml2.la + +libtinyxml2_la_SOURCES = tinyxml2.cpp \ + xmltest.cpp +$(LIB): libtinyxml2.la + cp -f .libs/libtinyxml2.a . + cp -f .libs/libtinyxml2.la $(LIB) \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/readme.md xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/readme.md --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/readme.md 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/readme.md 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,308 @@ +TinyXML-2 +========= + +TinyXML is a simple, small, efficient, C++ XML parser that can be +easily integrated into other programs. + +The master is hosted on github: +https://github.com/leethomason/tinyxml2 + +The online HTML version of these docs: +http://grinninglizard.com/tinyxml2docs/index.html + +Examples are in the "related pages" tab of the HTML docs. + +What it does. +------------- + +In brief, TinyXML parses an XML document, and builds from that a +Document Object Model (DOM) that can be read, modified, and saved. + +XML stands for "eXtensible Markup Language." It is a general purpose +human and machine readable markup language to describe arbitrary data. +All those random file formats created to store application data can +all be replaced with XML. One parser for everything. + +http://en.wikipedia.org/wiki/XML + +There are different ways to access and interact with XML data. +TinyXML-2 uses a Document Object Model (DOM), meaning the XML data is parsed +into a C++ objects that can be browsed and manipulated, and then +written to disk or another output stream. You can also construct an XML document +from scratch with C++ objects and write this to disk or another output +stream. You can even use TinyXML-2 to stream XML programmatically from +code without creating a document first. + +TinyXML-2 is designed to be easy and fast to learn. It is one header and +one cpp file. Simply add these to your project and off you go. +There is an example file - xmltest.cpp - to get you started. + +TinyXML-2 is released under the ZLib license, +so you can use it in open source or commercial code. The details +of the license are at the top of every source file. + +TinyXML-2 attempts to be a flexible parser, but with truly correct and +compliant XML output. TinyXML-2 should compile on any reasonably C++ +compliant system. It does not rely on exceptions, RTTI, or the STL. + +What it doesn't do. +------------------- + +TinyXML-2 doesn't parse or use DTDs (Document Type Definitions) or XSLs +(eXtensible Stylesheet Language.) There are other parsers out there +that are much more fully +featured. But they are also much bigger, take longer to set up in +your project, have a higher learning curve, and often have a more +restrictive license. If you are working with browsers or have more +complete XML needs, TinyXML-2 is not the parser for you. + +TinyXML-1 vs. TinyXML-2 +----------------------- + +Which should you use? TinyXML-2 uses a similar API to TinyXML-1 and the same +rich test cases. But the implementation of the parser is completely re-written +to make it more appropriate for use in a game. It uses less memory, is faster, +and uses far fewer memory allocations. + +TinyXML-2 has no requirement for STL, but has also dropped all STL support. All +strings are query and set as 'const char*'. This allows the use of internal +allocators, and keeps the code much simpler. + +Both parsers: + +1. Simple to use with similar APIs. +2. DOM based parser. +3. UTF-8 Unicode support. http://en.wikipedia.org/wiki/UTF-8 + +Advantages of TinyXML-2 + +1. The focus of all future dev. +2. Many fewer memory allocation (1/10th to 1/100th), uses less memory + (about 40% of TinyXML-1), and faster. +3. No STL requirement. +4. More modern C++, including a proper namespace. +5. Proper and useful handling of whitespace + +Advantages of TinyXML-1 + +1. Can report the location of parsing errors. +2. Support for some C++ STL conventions: streams and strings +3. Very mature and well debugged code base. + +Features +-------- + +### Memory Model + +An XMLDocument is a C++ object like any other, that can be on the stack, or +new'd and deleted on the heap. + +However, any sub-node of the Document, XMLElement, XMLText, etc, can only +be created by calling the appropriate XMLDocument::NewElement, NewText, etc. +method. Although you have pointers to these objects, they are still owned +by the Document. When the Document is deleted, so are all the nodes it contains. + +### White Space + +#### Whitespace Preservation (default) + +Microsoft has an excellent article on white space: http://msdn.microsoft.com/en-us/library/ms256097.aspx + +By default, TinyXML-2 preserves white space in a (hopefully) sane way that is almost complient with the +spec. (TinyXML-1 used a completely different model, much more similar to 'collapse', below.) + +As a first step, all newlines / carriage-returns / line-feeds are normalized to a +line-feed character, as required by the XML spec. + +White space in text is preserved. For example: + + Hello, World + +The leading space before the "Hello" and the double space after the comma are +preserved. Line-feeds are preserved, as in this example: + + Hello again, + World + +However, white space between elements is **not** preserved. Although not strictly +compliant, tracking and reporting inter-element space is awkward, and not normally +valuable. TinyXML-2 sees these as the same XML: + + + 1 + 2 + 3 + + + 123 + +#### Whitespace Collapse + +For some applications, it is preferable to collapse whitespace. Collapsing +whitespace gives you "HTML-like" behavior, which is sometimes more suitable +for hand typed documents. + +TinyXML-2 supports this with the 'whitespace' parameter to the XMLDocument constructor. +(The default is to preserve whitespace, as described above.) + +However, you may also use COLLAPSE_WHITESPACE, which will: + +* Remove leading and trailing whitespace +* Convert newlines and line-feeds into a space character +* Collapse a run of any number of space characters into a single space character + +Note that (currently) there is a performance impact for using COLLAPSE_WHITESPACE. +It essentially causes the XML to be parsed twice. + +### Entities + +TinyXML-2 recognizes the pre-defined "character entities", meaning special +characters. Namely: + + & & + < < + > > + " " + ' ' + +These are recognized when the XML document is read, and translated to there +UTF-8 equivalents. For instance, text with the XML of: + + Far & Away + +will have the Value() of "Far & Away" when queried from the XMLText object, +and will be written back to the XML stream/file as an ampersand. + +Additionally, any character can be specified by its Unicode code point: +The syntax " " or " " are both to the non-breaking space characher. +This is called a 'numeric character reference'. Any numeric character reference +that isn't one of the special entities above, will be read, but written as a +regular code point. The output is correct, but the entity syntax isn't preserved. + +### Printing + +#### Print to file +You can directly use the convenience function: + + XMLDocument doc; + ... + doc.SaveFile( "foo.xml" ); + +Or the XMLPrinter class: + + XMLPrinter printer( fp ); + doc.Print( &printer ); + +#### Print to memory +Printing to memory is supported by the XMLPrinter. + + XMLPrinter printer; + doc->Print( &printer ); + // printer.CStr() has a const char* to the XML + +#### Print without an XMLDocument + +When loading, an XML parser is very useful. However, sometimes +when saving, it just gets in the way. The code is often set up +for streaming, and constructing the DOM is just overhead. + +The Printer supports the streaming case. The following code +prints out a trivially simple XML file without ever creating +an XML document. + + XMLPrinter printer( fp ); + printer.OpenElement( "foo" ); + printer.PushAttribute( "foo", "bar" ); + printer.CloseElement(); + +Examples +-------- + +#### Load and parse an XML file. + + /* ------ Example 1: Load and parse an XML file. ---- */ + { + XMLDocument doc; + doc.LoadFile( "dream.xml" ); + } + +#### Lookup information. + + /* ------ Example 2: Lookup information. ---- */ + { + XMLDocument doc; + doc.LoadFile( "dream.xml" ); + + // Structure of the XML file: + // - Element "PLAY" the root Element, which is the + // FirstChildElement of the Document + // - - Element "TITLE" child of the root PLAY Element + // - - - Text child of the TITLE Element + + // Navigate to the title, using the convenience function, + // with a dangerous lack of error checking. + const char* title = doc.FirstChildElement( "PLAY" )->FirstChildElement( "TITLE" )->GetText(); + printf( "Name of play (1): %s\n", title ); + + // Text is just another Node to TinyXML-2. The more + // general way to get to the XMLText: + XMLText* textNode = doc.FirstChildElement( "PLAY" )->FirstChildElement( "TITLE" )->FirstChild()->ToText(); + title = textNode->Value(); + printf( "Name of play (2): %s\n", title ); + } + +Using and Installing +-------------------- + +There are 2 files in TinyXML-2: +* tinyxml2.cpp +* tinyxml2.h + +And additionally a test file: +* xmltest.cpp + +Simply compile and run. There is a visual studio 2010 project included, a simple Makefile, +an XCode project, and a cmake CMakeLists.txt included to help you. The top of tinyxml.h +even has a simple g++ command line if you are are *nix and don't want to use a build system. + +Documentation +------------- + +The documentation is build with Doxygen, using the 'dox' +configuration file. + +License +------- + +TinyXML-2 is released under the zlib license: + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source +distribution. + +Contributors +------------ + +Thanks very much to everyone who sends suggestions, bugs, ideas, and +encouragement. It all helps, and makes this project fun. + +The original TinyXML-1 has many contributors, who all deserve thanks +in shaping what is a very successful library. Extra thanks to Yves +Berquin and Andrew Ellerton who were key contributors. + +TinyXML-2 grew from that effort. Lee Thomason is the original author +of TinyXML-2 (and TinyXML-1) but hopefully TinyXML-2 will be improved +by many contributors. \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/resources/dream.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/resources/dream.xml --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/resources/dream.xml 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/resources/dream.xml 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,4546 @@ + + + + +A Midsummer Night's Dream + + +

Text placed in the public domain by Moby Lexical Tools, 1992.

+

SGML markup by Jon Bosak, 1992-1994.

+

XML version by Jon Bosak, 1996-1998.

+

This work may be freely copied and distributed worldwide.

+
+ + + +Dramatis Personae + +THESEUS, Duke of Athens. +EGEUS, father to Hermia. + + +LYSANDER +DEMETRIUS +in love with Hermia. + + +PHILOSTRATE, master of the revels to Theseus. +QUINCE, a carpenter. +SNUG, a joiner. +BOTTOM, a weaver. +FLUTE, a bellows-mender. +SNOUT, a tinker. +STARVELING, a tailor. +HIPPOLYTA, queen of the Amazons, betrothed to Theseus. +HERMIA, daughter to Egeus, in love with Lysander. +HELENA, in love with Demetrius. +OBERON, king of the fairies. +TITANIA, queen of the fairies. +PUCK, or Robin Goodfellow. + + +PEASEBLOSSOM +COBWEB +MOTH +MUSTARDSEED +fairies. + + +Other fairies attending their King and Queen. +Attendants on Theseus and Hippolyta. + + +SCENE Athens, and a wood near it. + +A MIDSUMMER NIGHT'S DREAM + +ACT I + +SCENE I. Athens. The palace of THESEUS. +Enter THESEUS, HIPPOLYTA, PHILOSTRATE, and +Attendants + + +THESEUS +Now, fair Hippolyta, our nuptial hour +Draws on apace; four happy days bring in +Another moon: but, O, methinks, how slow +This old moon wanes! she lingers my desires, +Like to a step-dame or a dowager +Long withering out a young man revenue. + + + +HIPPOLYTA +Four days will quickly steep themselves in night; +Four nights will quickly dream away the time; +And then the moon, like to a silver bow +New-bent in heaven, shall behold the night +Of our solemnities. + + + +THESEUS +Go, Philostrate, +Stir up the Athenian youth to merriments; +Awake the pert and nimble spirit of mirth; +Turn melancholy forth to funerals; +The pale companion is not for our pomp. +Exit PHILOSTRATE +Hippolyta, I woo'd thee with my sword, +And won thy love, doing thee injuries; +But I will wed thee in another key, +With pomp, with triumph and with revelling. + + + +Enter EGEUS, HERMIA, LYSANDER, and DEMETRIUS + + +EGEUS +Happy be Theseus, our renowned duke! + + + +THESEUS +Thanks, good Egeus: what's the news with thee? + + + +EGEUS +Full of vexation come I, with complaint +Against my child, my daughter Hermia. +Stand forth, Demetrius. My noble lord, +This man hath my consent to marry her. +Stand forth, Lysander: and my gracious duke, +This man hath bewitch'd the bosom of my child; +Thou, thou, Lysander, thou hast given her rhymes, +And interchanged love-tokens with my child: +Thou hast by moonlight at her window sung, +With feigning voice verses of feigning love, +And stolen the impression of her fantasy +With bracelets of thy hair, rings, gawds, conceits, +Knacks, trifles, nosegays, sweetmeats, messengers +Of strong prevailment in unharden'd youth: +With cunning hast thou filch'd my daughter's heart, +Turn'd her obedience, which is due to me, +To stubborn harshness: and, my gracious duke, +Be it so she; will not here before your grace +Consent to marry with Demetrius, +I beg the ancient privilege of Athens, +As she is mine, I may dispose of her: +Which shall be either to this gentleman +Or to her death, according to our law +Immediately provided in that case. + + + +THESEUS +What say you, Hermia? be advised fair maid: +To you your father should be as a god; +One that composed your beauties, yea, and one +To whom you are but as a form in wax +By him imprinted and within his power +To leave the figure or disfigure it. +Demetrius is a worthy gentleman. + + + +HERMIA +So is Lysander. + + + +THESEUS +In himself he is; +But in this kind, wanting your father's voice, +The other must be held the worthier. + + + +HERMIA +I would my father look'd but with my eyes. + + + +THESEUS +Rather your eyes must with his judgment look. + + + +HERMIA +I do entreat your grace to pardon me. +I know not by what power I am made bold, +Nor how it may concern my modesty, +In such a presence here to plead my thoughts; +But I beseech your grace that I may know +The worst that may befall me in this case, +If I refuse to wed Demetrius. + + + +THESEUS +Either to die the death or to abjure +For ever the society of men. +Therefore, fair Hermia, question your desires; +Know of your youth, examine well your blood, +Whether, if you yield not to your father's choice, +You can endure the livery of a nun, +For aye to be in shady cloister mew'd, +To live a barren sister all your life, +Chanting faint hymns to the cold fruitless moon. +Thrice-blessed they that master so their blood, +To undergo such maiden pilgrimage; +But earthlier happy is the rose distill'd, +Than that which withering on the virgin thorn +Grows, lives and dies in single blessedness. + + + +HERMIA +So will I grow, so live, so die, my lord, +Ere I will my virgin patent up +Unto his lordship, whose unwished yoke +My soul consents not to give sovereignty. + + + +THESEUS +Take time to pause; and, by the nest new moon-- +The sealing-day betwixt my love and me, +For everlasting bond of fellowship-- +Upon that day either prepare to die +For disobedience to your father's will, +Or else to wed Demetrius, as he would; +Or on Diana's altar to protest +For aye austerity and single life. + + + +DEMETRIUS +Relent, sweet Hermia: and, Lysander, yield +Thy crazed title to my certain right. + + + +LYSANDER +You have her father's love, Demetrius; +Let me have Hermia's: do you marry him. + + + +EGEUS +Scornful Lysander! true, he hath my love, +And what is mine my love shall render him. +And she is mine, and all my right of her +I do estate unto Demetrius. + + + +LYSANDER +I am, my lord, as well derived as he, +As well possess'd; my love is more than his; +My fortunes every way as fairly rank'd, +If not with vantage, as Demetrius'; +And, which is more than all these boasts can be, +I am beloved of beauteous Hermia: +Why should not I then prosecute my right? +Demetrius, I'll avouch it to his head, +Made love to Nedar's daughter, Helena, +And won her soul; and she, sweet lady, dotes, +Devoutly dotes, dotes in idolatry, +Upon this spotted and inconstant man. + + + +THESEUS +I must confess that I have heard so much, +And with Demetrius thought to have spoke thereof; +But, being over-full of self-affairs, +My mind did lose it. But, Demetrius, come; +And come, Egeus; you shall go with me, +I have some private schooling for you both. +For you, fair Hermia, look you arm yourself +To fit your fancies to your father's will; +Or else the law of Athens yields you up-- +Which by no means we may extenuate-- +To death, or to a vow of single life. +Come, my Hippolyta: what cheer, my love? +Demetrius and Egeus, go along: +I must employ you in some business +Against our nuptial and confer with you +Of something nearly that concerns yourselves. + + + +EGEUS +With duty and desire we follow you. + + + +Exeunt all but LYSANDER and HERMIA + + +LYSANDER +How now, my love! why is your cheek so pale? +How chance the roses there do fade so fast? + + + +HERMIA +Belike for want of rain, which I could well +Beteem them from the tempest of my eyes. + + + +LYSANDER +Ay me! for aught that I could ever read, +Could ever hear by tale or history, +The course of true love never did run smooth; +But, either it was different in blood,-- + + + +HERMIA +O cross! too high to be enthrall'd to low. + + + +LYSANDER +Or else misgraffed in respect of years,-- + + + +HERMIA +O spite! too old to be engaged to young. + + + +LYSANDER +Or else it stood upon the choice of friends,-- + + + +HERMIA +O hell! to choose love by another's eyes. + + + +LYSANDER +Or, if there were a sympathy in choice, +War, death, or sickness did lay siege to it, +Making it momentany as a sound, +Swift as a shadow, short as any dream; +Brief as the lightning in the collied night, +That, in a spleen, unfolds both heaven and earth, +And ere a man hath power to say 'Behold!' +The jaws of darkness do devour it up: +So quick bright things come to confusion. + + + +HERMIA +If then true lovers have been ever cross'd, +It stands as an edict in destiny: +Then let us teach our trial patience, +Because it is a customary cross, +As due to love as thoughts and dreams and sighs, +Wishes and tears, poor fancy's followers. + + + +LYSANDER +A good persuasion: therefore, hear me, Hermia. +I have a widow aunt, a dowager +Of great revenue, and she hath no child: +From Athens is her house remote seven leagues; +And she respects me as her only son. +There, gentle Hermia, may I marry thee; +And to that place the sharp Athenian law +Cannot pursue us. If thou lovest me then, +Steal forth thy father's house to-morrow night; +And in the wood, a league without the town, +Where I did meet thee once with Helena, +To do observance to a morn of May, +There will I stay for thee. + + + +HERMIA +My good Lysander! +I swear to thee, by Cupid's strongest bow, +By his best arrow with the golden head, +By the simplicity of Venus' doves, +By that which knitteth souls and prospers loves, +And by that fire which burn'd the Carthage queen, +When the false Troyan under sail was seen, +By all the vows that ever men have broke, +In number more than ever women spoke, +In that same place thou hast appointed me, +To-morrow truly will I meet with thee. + + + +LYSANDER +Keep promise, love. Look, here comes Helena. + + + +Enter HELENA + + +HERMIA +God speed fair Helena! whither away? + + + +HELENA +Call you me fair? that fair again unsay. +Demetrius loves your fair: O happy fair! +Your eyes are lode-stars; and your tongue's sweet air +More tuneable than lark to shepherd's ear, +When wheat is green, when hawthorn buds appear. +Sickness is catching: O, were favour so, +Yours would I catch, fair Hermia, ere I go; +My ear should catch your voice, my eye your eye, +My tongue should catch your tongue's sweet melody. +Were the world mine, Demetrius being bated, +The rest I'd give to be to you translated. +O, teach me how you look, and with what art +You sway the motion of Demetrius' heart. + + + +HERMIA +I frown upon him, yet he loves me still. + + + +HELENA +O that your frowns would teach my smiles such skill! + + + +HERMIA +I give him curses, yet he gives me love. + + + +HELENA +O that my prayers could such affection move! + + + +HERMIA +The more I hate, the more he follows me. + + + +HELENA +The more I love, the more he hateth me. + + + +HERMIA +His folly, Helena, is no fault of mine. + + + +HELENA +None, but your beauty: would that fault were mine! + + + +HERMIA +Take comfort: he no more shall see my face; +Lysander and myself will fly this place. +Before the time I did Lysander see, +Seem'd Athens as a paradise to me: +O, then, what graces in my love do dwell, +That he hath turn'd a heaven unto a hell! + + + +LYSANDER +Helen, to you our minds we will unfold: +To-morrow night, when Phoebe doth behold +Her silver visage in the watery glass, +Decking with liquid pearl the bladed grass, +A time that lovers' flights doth still conceal, +Through Athens' gates have we devised to steal. + + + +HERMIA +And in the wood, where often you and I +Upon faint primrose-beds were wont to lie, +Emptying our bosoms of their counsel sweet, +There my Lysander and myself shall meet; +And thence from Athens turn away our eyes, +To seek new friends and stranger companies. +Farewell, sweet playfellow: pray thou for us; +And good luck grant thee thy Demetrius! +Keep word, Lysander: we must starve our sight +From lovers' food till morrow deep midnight. + + + +LYSANDER +I will, my Hermia. +Exit HERMIA +Helena, adieu: +As you on him, Demetrius dote on you! + + + +Exit + + +HELENA +How happy some o'er other some can be! +Through Athens I am thought as fair as she. +But what of that? Demetrius thinks not so; +He will not know what all but he do know: +And as he errs, doting on Hermia's eyes, +So I, admiring of his qualities: +Things base and vile, folding no quantity, +Love can transpose to form and dignity: +Love looks not with the eyes, but with the mind; +And therefore is wing'd Cupid painted blind: +Nor hath Love's mind of any judgement taste; +Wings and no eyes figure unheedy haste: +And therefore is Love said to be a child, +Because in choice he is so oft beguiled. +As waggish boys in game themselves forswear, +So the boy Love is perjured every where: +For ere Demetrius look'd on Hermia's eyne, +He hail'd down oaths that he was only mine; +And when this hail some heat from Hermia felt, +So he dissolved, and showers of oaths did melt. +I will go tell him of fair Hermia's flight: +Then to the wood will he to-morrow night +Pursue her; and for this intelligence +If I have thanks, it is a dear expense: +But herein mean I to enrich my pain, +To have his sight thither and back again. + + + +Exit + + +SCENE II. Athens. QUINCE'S house. +Enter QUINCE, SNUG, BOTTOM, FLUTE, SNOUT, and +STARVELING + + +QUINCE +Is all our company here? + + + +BOTTOM +You were best to call them generally, man by man, +according to the scrip. + + + +QUINCE +Here is the scroll of every man's name, which is +thought fit, through all Athens, to play in our +interlude before the duke and the duchess, on his +wedding-day at night. + + + +BOTTOM +First, good Peter Quince, say what the play treats +on, then read the names of the actors, and so grow +to a point. + + + +QUINCE +Marry, our play is, The most lamentable comedy, and +most cruel death of Pyramus and Thisby. + + + +BOTTOM +A very good piece of work, I assure you, and a +merry. Now, good Peter Quince, call forth your +actors by the scroll. Masters, spread yourselves. + + + +QUINCE +Answer as I call you. Nick Bottom, the weaver. + + + +BOTTOM +Ready. Name what part I am for, and proceed. + + + +QUINCE +You, Nick Bottom, are set down for Pyramus. + + + +BOTTOM +What is Pyramus? a lover, or a tyrant? + + + +QUINCE +A lover, that kills himself most gallant for love. + + + +BOTTOM +That will ask some tears in the true performing of +it: if I do it, let the audience look to their +eyes; I will move storms, I will condole in some +measure. To the rest: yet my chief humour is for a +tyrant: I could play Ercles rarely, or a part to +tear a cat in, to make all split. +The raging rocks +And shivering shocks +Shall break the locks +Of prison gates; +And Phibbus' car +Shall shine from far +And make and mar +The foolish Fates. +This was lofty! Now name the rest of the players. +This is Ercles' vein, a tyrant's vein; a lover is +more condoling. + + + +QUINCE +Francis Flute, the bellows-mender. + + + +FLUTE +Here, Peter Quince. + + + +QUINCE +Flute, you must take Thisby on you. + + + +FLUTE +What is Thisby? a wandering knight? + + + +QUINCE +It is the lady that Pyramus must love. + + + +FLUTE +Nay, faith, let me not play a woman; I have a beard coming. + + + +QUINCE +That's all one: you shall play it in a mask, and +you may speak as small as you will. + + + +BOTTOM +An I may hide my face, let me play Thisby too, I'll +speak in a monstrous little voice. 'Thisne, +Thisne;' 'Ah, Pyramus, lover dear! thy Thisby dear, +and lady dear!' + + + +QUINCE +No, no; you must play Pyramus: and, Flute, you Thisby. + + + +BOTTOM +Well, proceed. + + + +QUINCE +Robin Starveling, the tailor. + + + +STARVELING +Here, Peter Quince. + + + +QUINCE +Robin Starveling, you must play Thisby's mother. +Tom Snout, the tinker. + + + +SNOUT +Here, Peter Quince. + + + +QUINCE +You, Pyramus' father: myself, Thisby's father: +Snug, the joiner; you, the lion's part: and, I +hope, here is a play fitted. + + + +SNUG +Have you the lion's part written? pray you, if it +be, give it me, for I am slow of study. + + + +QUINCE +You may do it extempore, for it is nothing but roaring. + + + +BOTTOM +Let me play the lion too: I will roar, that I will +do any man's heart good to hear me; I will roar, +that I will make the duke say 'Let him roar again, +let him roar again.' + + + +QUINCE +An you should do it too terribly, you would fright +the duchess and the ladies, that they would shriek; +and that were enough to hang us all. + + + +ALL +That would hang us, every mother's son. + + + +BOTTOM +I grant you, friends, if that you should fright the +ladies out of their wits, they would have no more +discretion but to hang us: but I will aggravate my +voice so that I will roar you as gently as any +sucking dove; I will roar you an 'twere any +nightingale. + + + +QUINCE +You can play no part but Pyramus; for Pyramus is a +sweet-faced man; a proper man, as one shall see in a +summer's day; a most lovely gentleman-like man: +therefore you must needs play Pyramus. + + + +BOTTOM +Well, I will undertake it. What beard were I best +to play it in? + + + +QUINCE +Why, what you will. + + + +BOTTOM +I will discharge it in either your straw-colour +beard, your orange-tawny beard, your purple-in-grain +beard, or your French-crown-colour beard, your +perfect yellow. + + + +QUINCE +Some of your French crowns have no hair at all, and +then you will play bare-faced. But, masters, here +are your parts: and I am to entreat you, request +you and desire you, to con them by to-morrow night; +and meet me in the palace wood, a mile without the +town, by moonlight; there will we rehearse, for if +we meet in the city, we shall be dogged with +company, and our devices known. In the meantime I +will draw a bill of properties, such as our play +wants. I pray you, fail me not. + + + +BOTTOM +We will meet; and there we may rehearse most +obscenely and courageously. Take pains; be perfect: adieu. + + + +QUINCE +At the duke's oak we meet. + + + +BOTTOM +Enough; hold or cut bow-strings. + + + +Exeunt + + + + +ACT II + +SCENE I. A wood near Athens. +Enter, from opposite sides, a Fairy, and PUCK + + +PUCK +How now, spirit! whither wander you? + + + +Fairy +Over hill, over dale, +Thorough bush, thorough brier, +Over park, over pale, +Thorough flood, thorough fire, +I do wander everywhere, +Swifter than the moon's sphere; +And I serve the fairy queen, +To dew her orbs upon the green. +The cowslips tall her pensioners be: +In their gold coats spots you see; +Those be rubies, fairy favours, +In those freckles live their savours: +I must go seek some dewdrops here +And hang a pearl in every cowslip's ear. +Farewell, thou lob of spirits; I'll be gone: +Our queen and all our elves come here anon. + + + +PUCK +The king doth keep his revels here to-night: +Take heed the queen come not within his sight; +For Oberon is passing fell and wrath, +Because that she as her attendant hath +A lovely boy, stolen from an Indian king; +She never had so sweet a changeling; +And jealous Oberon would have the child +Knight of his train, to trace the forests wild; +But she perforce withholds the loved boy, +Crowns him with flowers and makes him all her joy: +And now they never meet in grove or green, +By fountain clear, or spangled starlight sheen, +But, they do square, that all their elves for fear +Creep into acorn-cups and hide them there. + + + +Fairy +Either I mistake your shape and making quite, +Or else you are that shrewd and knavish sprite +Call'd Robin Goodfellow: are not you he +That frights the maidens of the villagery; +Skim milk, and sometimes labour in the quern +And bootless make the breathless housewife churn; +And sometime make the drink to bear no barm; +Mislead night-wanderers, laughing at their harm? +Those that Hobgoblin call you and sweet Puck, +You do their work, and they shall have good luck: +Are not you he? + + + +PUCK +Thou speak'st aright; +I am that merry wanderer of the night. +I jest to Oberon and make him smile +When I a fat and bean-fed horse beguile, +Neighing in likeness of a filly foal: +And sometime lurk I in a gossip's bowl, +In very likeness of a roasted crab, +And when she drinks, against her lips I bob +And on her wither'd dewlap pour the ale. +The wisest aunt, telling the saddest tale, +Sometime for three-foot stool mistaketh me; +Then slip I from her bum, down topples she, +And 'tailor' cries, and falls into a cough; +And then the whole quire hold their hips and laugh, +And waxen in their mirth and neeze and swear +A merrier hour was never wasted there. +But, room, fairy! here comes Oberon. + + + +Fairy +And here my mistress. Would that he were gone! + + + +Enter, from one side, OBERON, with his train; +from the other, TITANIA, with hers + + +OBERON +Ill met by moonlight, proud Titania. + + + +TITANIA +What, jealous Oberon! Fairies, skip hence: +I have forsworn his bed and company. + + + +OBERON +Tarry, rash wanton: am not I thy lord? + + + +TITANIA +Then I must be thy lady: but I know +When thou hast stolen away from fairy land, +And in the shape of Corin sat all day, +Playing on pipes of corn and versing love +To amorous Phillida. Why art thou here, +Come from the farthest Steppe of India? +But that, forsooth, the bouncing Amazon, +Your buskin'd mistress and your warrior love, +To Theseus must be wedded, and you come +To give their bed joy and prosperity. + + + +OBERON +How canst thou thus for shame, Titania, +Glance at my credit with Hippolyta, +Knowing I know thy love to Theseus? +Didst thou not lead him through the glimmering night +From Perigenia, whom he ravished? +And make him with fair AEgle break his faith, +With Ariadne and Antiopa? + + + +TITANIA +These are the forgeries of jealousy: +And never, since the middle summer's spring, +Met we on hill, in dale, forest or mead, +By paved fountain or by rushy brook, +Or in the beached margent of the sea, +To dance our ringlets to the whistling wind, +But with thy brawls thou hast disturb'd our sport. +Therefore the winds, piping to us in vain, +As in revenge, have suck'd up from the sea +Contagious fogs; which falling in the land +Have every pelting river made so proud +That they have overborne their continents: +The ox hath therefore stretch'd his yoke in vain, +The ploughman lost his sweat, and the green corn +Hath rotted ere his youth attain'd a beard; +The fold stands empty in the drowned field, +And crows are fatted with the murrion flock; +The nine men's morris is fill'd up with mud, +And the quaint mazes in the wanton green +For lack of tread are undistinguishable: +The human mortals want their winter here; +No night is now with hymn or carol blest: +Therefore the moon, the governess of floods, +Pale in her anger, washes all the air, +That rheumatic diseases do abound: +And thorough this distemperature we see +The seasons alter: hoary-headed frosts +Far in the fresh lap of the crimson rose, +And on old Hiems' thin and icy crown +An odorous chaplet of sweet summer buds +Is, as in mockery, set: the spring, the summer, +The childing autumn, angry winter, change +Their wonted liveries, and the mazed world, +By their increase, now knows not which is which: +And this same progeny of evils comes +From our debate, from our dissension; +We are their parents and original. + + + +OBERON +Do you amend it then; it lies in you: +Why should Titania cross her Oberon? +I do but beg a little changeling boy, +To be my henchman. + + + +TITANIA +Set your heart at rest: +The fairy land buys not the child of me. +His mother was a votaress of my order: +And, in the spiced Indian air, by night, +Full often hath she gossip'd by my side, +And sat with me on Neptune's yellow sands, +Marking the embarked traders on the flood, +When we have laugh'd to see the sails conceive +And grow big-bellied with the wanton wind; +Which she, with pretty and with swimming gait +Following,--her womb then rich with my young squire,-- +Would imitate, and sail upon the land, +To fetch me trifles, and return again, +As from a voyage, rich with merchandise. +But she, being mortal, of that boy did die; +And for her sake do I rear up her boy, +And for her sake I will not part with him. + + + +OBERON +How long within this wood intend you stay? + + + +TITANIA +Perchance till after Theseus' wedding-day. +If you will patiently dance in our round +And see our moonlight revels, go with us; +If not, shun me, and I will spare your haunts. + + + +OBERON +Give me that boy, and I will go with thee. + + + +TITANIA +Not for thy fairy kingdom. Fairies, away! +We shall chide downright, if I longer stay. + + + +Exit TITANIA with her train + + +OBERON +Well, go thy way: thou shalt not from this grove +Till I torment thee for this injury. +My gentle Puck, come hither. Thou rememberest +Since once I sat upon a promontory, +And heard a mermaid on a dolphin's back +Uttering such dulcet and harmonious breath +That the rude sea grew civil at her song +And certain stars shot madly from their spheres, +To hear the sea-maid's music. + + + +PUCK +I remember. + + + +OBERON +That very time I saw, but thou couldst not, +Flying between the cold moon and the earth, +Cupid all arm'd: a certain aim he took +At a fair vestal throned by the west, +And loosed his love-shaft smartly from his bow, +As it should pierce a hundred thousand hearts; +But I might see young Cupid's fiery shaft +Quench'd in the chaste beams of the watery moon, +And the imperial votaress passed on, +In maiden meditation, fancy-free. +Yet mark'd I where the bolt of Cupid fell: +It fell upon a little western flower, +Before milk-white, now purple with love's wound, +And maidens call it love-in-idleness. +Fetch me that flower; the herb I shew'd thee once: +The juice of it on sleeping eye-lids laid +Will make or man or woman madly dote +Upon the next live creature that it sees. +Fetch me this herb; and be thou here again +Ere the leviathan can swim a league. + + + +PUCK +I'll put a girdle round about the earth +In forty minutes. + + + +Exit + + +OBERON +Having once this juice, +I'll watch Titania when she is asleep, +And drop the liquor of it in her eyes. +The next thing then she waking looks upon, +Be it on lion, bear, or wolf, or bull, +On meddling monkey, or on busy ape, +She shall pursue it with the soul of love: +And ere I take this charm from off her sight, +As I can take it with another herb, +I'll make her render up her page to me. +But who comes here? I am invisible; +And I will overhear their conference. + + + +Enter DEMETRIUS, HELENA, following him + + +DEMETRIUS +I love thee not, therefore pursue me not. +Where is Lysander and fair Hermia? +The one I'll slay, the other slayeth me. +Thou told'st me they were stolen unto this wood; +And here am I, and wode within this wood, +Because I cannot meet my Hermia. +Hence, get thee gone, and follow me no more. + + + +HELENA +You draw me, you hard-hearted adamant; +But yet you draw not iron, for my heart +Is true as steel: leave you your power to draw, +And I shall have no power to follow you. + + + +DEMETRIUS +Do I entice you? do I speak you fair? +Or, rather, do I not in plainest truth +Tell you, I do not, nor I cannot love you? + + + +HELENA +And even for that do I love you the more. +I am your spaniel; and, Demetrius, +The more you beat me, I will fawn on you: +Use me but as your spaniel, spurn me, strike me, +Neglect me, lose me; only give me leave, +Unworthy as I am, to follow you. +What worser place can I beg in your love,-- +And yet a place of high respect with me,-- +Than to be used as you use your dog? + + + +DEMETRIUS +Tempt not too much the hatred of my spirit; +For I am sick when I do look on thee. + + + +HELENA +And I am sick when I look not on you. + + + +DEMETRIUS +You do impeach your modesty too much, +To leave the city and commit yourself +Into the hands of one that loves you not; +To trust the opportunity of night +And the ill counsel of a desert place +With the rich worth of your virginity. + + + +HELENA +Your virtue is my privilege: for that +It is not night when I do see your face, +Therefore I think I am not in the night; +Nor doth this wood lack worlds of company, +For you in my respect are all the world: +Then how can it be said I am alone, +When all the world is here to look on me? + + + +DEMETRIUS +I'll run from thee and hide me in the brakes, +And leave thee to the mercy of wild beasts. + + + +HELENA +The wildest hath not such a heart as you. +Run when you will, the story shall be changed: +Apollo flies, and Daphne holds the chase; +The dove pursues the griffin; the mild hind +Makes speed to catch the tiger; bootless speed, +When cowardice pursues and valour flies. + + + +DEMETRIUS +I will not stay thy questions; let me go: +Or, if thou follow me, do not believe +But I shall do thee mischief in the wood. + + + +HELENA +Ay, in the temple, in the town, the field, +You do me mischief. Fie, Demetrius! +Your wrongs do set a scandal on my sex: +We cannot fight for love, as men may do; +We should be wood and were not made to woo. +Exit DEMETRIUS +I'll follow thee and make a heaven of hell, +To die upon the hand I love so well. + + + +Exit + + +OBERON +Fare thee well, nymph: ere he do leave this grove, +Thou shalt fly him and he shall seek thy love. +Re-enter PUCK +Hast thou the flower there? Welcome, wanderer. + + + +PUCK +Ay, there it is. + + + +OBERON +I pray thee, give it me. +I know a bank where the wild thyme blows, +Where oxlips and the nodding violet grows, +Quite over-canopied with luscious woodbine, +With sweet musk-roses and with eglantine: +There sleeps Titania sometime of the night, +Lull'd in these flowers with dances and delight; +And there the snake throws her enamell'd skin, +Weed wide enough to wrap a fairy in: +And with the juice of this I'll streak her eyes, +And make her full of hateful fantasies. +Take thou some of it, and seek through this grove: +A sweet Athenian lady is in love +With a disdainful youth: anoint his eyes; +But do it when the next thing he espies +May be the lady: thou shalt know the man +By the Athenian garments he hath on. +Effect it with some care, that he may prove +More fond on her than she upon her love: +And look thou meet me ere the first cock crow. + + + +PUCK +Fear not, my lord, your servant shall do so. + + + +Exeunt + + +SCENE II. Another part of the wood. +Enter TITANIA, with her train + + +TITANIA +Come, now a roundel and a fairy song; +Then, for the third part of a minute, hence; +Some to kill cankers in the musk-rose buds, +Some war with rere-mice for their leathern wings, +To make my small elves coats, and some keep back +The clamorous owl that nightly hoots and wonders +At our quaint spirits. Sing me now asleep; +Then to your offices and let me rest. +The Fairies sing +You spotted snakes with double tongue, +Thorny hedgehogs, be not seen; +Newts and blind-worms, do no wrong, +Come not near our fairy queen. +Philomel, with melody +Sing in our sweet lullaby; +Lulla, lulla, lullaby, lulla, lulla, lullaby: +Never harm, +Nor spell nor charm, +Come our lovely lady nigh; +So, good night, with lullaby. +Weaving spiders, come not here; +Hence, you long-legg'd spinners, hence! +Beetles black, approach not near; +Worm nor snail, do no offence. +Philomel, with melody, &c. + + + +Fairy +Hence, away! now all is well: +One aloof stand sentinel. + + +Exeunt Fairies. TITANIA sleeps +Enter OBERON and squeezes the flower on TITANIA's eyelids + + +OBERON +What thou seest when thou dost wake, +Do it for thy true-love take, +Love and languish for his sake: +Be it ounce, or cat, or bear, +Pard, or boar with bristled hair, +In thy eye that shall appear +When thou wakest, it is thy dear: +Wake when some vile thing is near. + + +Exit +Enter LYSANDER and HERMIA + + +LYSANDER +Fair love, you faint with wandering in the wood; +And to speak troth, I have forgot our way: +We'll rest us, Hermia, if you think it good, +And tarry for the comfort of the day. + + + +HERMIA +Be it so, Lysander: find you out a bed; +For I upon this bank will rest my head. + + + +LYSANDER +One turf shall serve as pillow for us both; +One heart, one bed, two bosoms and one troth. + + + +HERMIA +Nay, good Lysander; for my sake, my dear, +Lie further off yet, do not lie so near. + + + +LYSANDER +O, take the sense, sweet, of my innocence! +Love takes the meaning in love's conference. +I mean, that my heart unto yours is knit +So that but one heart we can make of it; +Two bosoms interchained with an oath; +So then two bosoms and a single troth. +Then by your side no bed-room me deny; +For lying so, Hermia, I do not lie. + + + +HERMIA +Lysander riddles very prettily: +Now much beshrew my manners and my pride, +If Hermia meant to say Lysander lied. +But, gentle friend, for love and courtesy +Lie further off; in human modesty, +Such separation as may well be said +Becomes a virtuous bachelor and a maid, +So far be distant; and, good night, sweet friend: +Thy love ne'er alter till thy sweet life end! + + + +LYSANDER +Amen, amen, to that fair prayer, say I; +And then end life when I end loyalty! +Here is my bed: sleep give thee all his rest! + + + +HERMIA +With half that wish the wisher's eyes be press'd! + + +They sleep +Enter PUCK + + +PUCK +Through the forest have I gone. +But Athenian found I none, +On whose eyes I might approve +This flower's force in stirring love. +Night and silence.--Who is here? +Weeds of Athens he doth wear: +This is he, my master said, +Despised the Athenian maid; +And here the maiden, sleeping sound, +On the dank and dirty ground. +Pretty soul! she durst not lie +Near this lack-love, this kill-courtesy. +Churl, upon thy eyes I throw +All the power this charm doth owe. +When thou wakest, let love forbid +Sleep his seat on thy eyelid: +So awake when I am gone; +For I must now to Oberon. + + +Exit +Enter DEMETRIUS and HELENA, running + + +HELENA +Stay, though thou kill me, sweet Demetrius. + + + +DEMETRIUS +I charge thee, hence, and do not haunt me thus. + + + +HELENA +O, wilt thou darkling leave me? do not so. + + + +DEMETRIUS +Stay, on thy peril: I alone will go. + + + +Exit + + +HELENA +O, I am out of breath in this fond chase! +The more my prayer, the lesser is my grace. +Happy is Hermia, wheresoe'er she lies; +For she hath blessed and attractive eyes. +How came her eyes so bright? Not with salt tears: +If so, my eyes are oftener wash'd than hers. +No, no, I am as ugly as a bear; +For beasts that meet me run away for fear: +Therefore no marvel though Demetrius +Do, as a monster fly my presence thus. +What wicked and dissembling glass of mine +Made me compare with Hermia's sphery eyne? +But who is here? Lysander! on the ground! +Dead? or asleep? I see no blood, no wound. +Lysander if you live, good sir, awake. + + + +LYSANDER +Awaking And run through fire I will for thy sweet sake. +Transparent Helena! Nature shows art, +That through thy bosom makes me see thy heart. +Where is Demetrius? O, how fit a word +Is that vile name to perish on my sword! + + + +HELENA +Do not say so, Lysander; say not so +What though he love your Hermia? Lord, what though? +Yet Hermia still loves you: then be content. + + + +LYSANDER +Content with Hermia! No; I do repent +The tedious minutes I with her have spent. +Not Hermia but Helena I love: +Who will not change a raven for a dove? +The will of man is by his reason sway'd; +And reason says you are the worthier maid. +Things growing are not ripe until their season +So I, being young, till now ripe not to reason; +And touching now the point of human skill, +Reason becomes the marshal to my will +And leads me to your eyes, where I o'erlook +Love's stories written in love's richest book. + + + +HELENA +Wherefore was I to this keen mockery born? +When at your hands did I deserve this scorn? +Is't not enough, is't not enough, young man, +That I did never, no, nor never can, +Deserve a sweet look from Demetrius' eye, +But you must flout my insufficiency? +Good troth, you do me wrong, good sooth, you do, +In such disdainful manner me to woo. +But fare you well: perforce I must confess +I thought you lord of more true gentleness. +O, that a lady, of one man refused. +Should of another therefore be abused! + + + +Exit + + +LYSANDER +She sees not Hermia. Hermia, sleep thou there: +And never mayst thou come Lysander near! +For as a surfeit of the sweetest things +The deepest loathing to the stomach brings, +Or as tie heresies that men do leave +Are hated most of those they did deceive, +So thou, my surfeit and my heresy, +Of all be hated, but the most of me! +And, all my powers, address your love and might +To honour Helen and to be her knight! + + + +Exit + + +HERMIA +Awaking Help me, Lysander, help me! do thy best +To pluck this crawling serpent from my breast! +Ay me, for pity! what a dream was here! +Lysander, look how I do quake with fear: +Methought a serpent eat my heart away, +And you sat smiling at his cruel pray. +Lysander! what, removed? Lysander! lord! +What, out of hearing? gone? no sound, no word? +Alack, where are you speak, an if you hear; +Speak, of all loves! I swoon almost with fear. +No? then I well perceive you all not nigh +Either death or you I'll find immediately. + + + +Exit + + + + +ACT III + +SCENE I. The wood. TITANIA lying asleep. +Enter QUINCE, SNUG, BOTTOM, FLUTE, SNOUT, and +STARVELING + + +BOTTOM +Are we all met? + + + +QUINCE +Pat, pat; and here's a marvellous convenient place +for our rehearsal. This green plot shall be our +stage, this hawthorn-brake our tiring-house; and we +will do it in action as we will do it before the duke. + + + +BOTTOM +Peter Quince,-- + + + +QUINCE +What sayest thou, bully Bottom? + + + +BOTTOM +There are things in this comedy of Pyramus and +Thisby that will never please. First, Pyramus must +draw a sword to kill himself; which the ladies +cannot abide. How answer you that? + + + +SNOUT +By'r lakin, a parlous fear. + + + +STARVELING +I believe we must leave the killing out, when all is done. + + + +BOTTOM +Not a whit: I have a device to make all well. +Write me a prologue; and let the prologue seem to +say, we will do no harm with our swords, and that +Pyramus is not killed indeed; and, for the more +better assurance, tell them that I, Pyramus, am not +Pyramus, but Bottom the weaver: this will put them +out of fear. + + + +QUINCE +Well, we will have such a prologue; and it shall be +written in eight and six. + + + +BOTTOM +No, make it two more; let it be written in eight and eight. + + + +SNOUT +Will not the ladies be afeard of the lion? + + + +STARVELING +I fear it, I promise you. + + + +BOTTOM +Masters, you ought to consider with yourselves: to +bring in--God shield us!--a lion among ladies, is a +most dreadful thing; for there is not a more fearful +wild-fowl than your lion living; and we ought to +look to 't. + + + +SNOUT +Therefore another prologue must tell he is not a lion. + + + +BOTTOM +Nay, you must name his name, and half his face must +be seen through the lion's neck: and he himself +must speak through, saying thus, or to the same +defect,--'Ladies,'--or 'Fair-ladies--I would wish +You,'--or 'I would request you,'--or 'I would +entreat you,--not to fear, not to tremble: my life +for yours. If you think I come hither as a lion, it +were pity of my life: no I am no such thing; I am a +man as other men are;' and there indeed let him name +his name, and tell them plainly he is Snug the joiner. + + + +QUINCE +Well it shall be so. But there is two hard things; +that is, to bring the moonlight into a chamber; for, +you know, Pyramus and Thisby meet by moonlight. + + + +SNOUT +Doth the moon shine that night we play our play? + + + +BOTTOM +A calendar, a calendar! look in the almanac; find +out moonshine, find out moonshine. + + + +QUINCE +Yes, it doth shine that night. + + + +BOTTOM +Why, then may you leave a casement of the great +chamber window, where we play, open, and the moon +may shine in at the casement. + + + +QUINCE +Ay; or else one must come in with a bush of thorns +and a lanthorn, and say he comes to disfigure, or to +present, the person of Moonshine. Then, there is +another thing: we must have a wall in the great +chamber; for Pyramus and Thisby says the story, did +talk through the chink of a wall. + + + +SNOUT +You can never bring in a wall. What say you, Bottom? + + + +BOTTOM +Some man or other must present Wall: and let him +have some plaster, or some loam, or some rough-cast +about him, to signify wall; and let him hold his +fingers thus, and through that cranny shall Pyramus +and Thisby whisper. + + + +QUINCE +If that may be, then all is well. Come, sit down, +every mother's son, and rehearse your parts. +Pyramus, you begin: when you have spoken your +speech, enter into that brake: and so every one +according to his cue. + + + +Enter PUCK behind + + +PUCK +What hempen home-spuns have we swaggering here, +So near the cradle of the fairy queen? +What, a play toward! I'll be an auditor; +An actor too, perhaps, if I see cause. + + + +QUINCE +Speak, Pyramus. Thisby, stand forth. + + + +BOTTOM +Thisby, the flowers of odious savours sweet,-- + + + +QUINCE +Odours, odours. + + + +BOTTOM +--odours savours sweet: +So hath thy breath, my dearest Thisby dear. +But hark, a voice! stay thou but here awhile, +And by and by I will to thee appear. + + + +Exit + + +PUCK +A stranger Pyramus than e'er played here. + + + +Exit + + +FLUTE +Must I speak now? + + + +QUINCE +Ay, marry, must you; for you must understand he goes +but to see a noise that he heard, and is to come again. + + + +FLUTE +Most radiant Pyramus, most lily-white of hue, +Of colour like the red rose on triumphant brier, +Most brisky juvenal and eke most lovely Jew, +As true as truest horse that yet would never tire, +I'll meet thee, Pyramus, at Ninny's tomb. + + + +QUINCE +'Ninus' tomb,' man: why, you must not speak that +yet; that you answer to Pyramus: you speak all your +part at once, cues and all Pyramus enter: your cue +is past; it is, 'never tire.' + + + +FLUTE +O,--As true as truest horse, that yet would +never tire. + + + +Re-enter PUCK, and BOTTOM with an ass's head + + +BOTTOM +If I were fair, Thisby, I were only thine. + + + +QUINCE +O monstrous! O strange! we are haunted. Pray, +masters! fly, masters! Help! + + + +Exeunt QUINCE, SNUG, FLUTE, SNOUT, and STARVELING + + +PUCK +I'll follow you, I'll lead you about a round, +Through bog, through bush, through brake, through brier: +Sometime a horse I'll be, sometime a hound, +A hog, a headless bear, sometime a fire; +And neigh, and bark, and grunt, and roar, and burn, +Like horse, hound, hog, bear, fire, at every turn. + + + +Exit + + +BOTTOM +Why do they run away? this is a knavery of them to +make me afeard. + + + +Re-enter SNOUT + + +SNOUT +O Bottom, thou art changed! what do I see on thee? + + + +BOTTOM +What do you see? you see an asshead of your own, do +you? + + +Exit SNOUT +Re-enter QUINCE + + +QUINCE +Bless thee, Bottom! bless thee! thou art +translated. + + + +Exit + + +BOTTOM +I see their knavery: this is to make an ass of me; +to fright me, if they could. But I will not stir +from this place, do what they can: I will walk up +and down here, and I will sing, that they shall hear +I am not afraid. +Sings +The ousel cock so black of hue, +With orange-tawny bill, +The throstle with his note so true, +The wren with little quill,-- + + + +TITANIA +Awaking What angel wakes me from my flowery bed? + + + +BOTTOM +Sings +The finch, the sparrow and the lark, +The plain-song cuckoo gray, +Whose note full many a man doth mark, +And dares not answer nay;-- +for, indeed, who would set his wit to so foolish +a bird? who would give a bird the lie, though he cry +'cuckoo' never so? + + + +TITANIA +I pray thee, gentle mortal, sing again: +Mine ear is much enamour'd of thy note; +So is mine eye enthralled to thy shape; +And thy fair virtue's force perforce doth move me +On the first view to say, to swear, I love thee. + + + +BOTTOM +Methinks, mistress, you should have little reason +for that: and yet, to say the truth, reason and +love keep little company together now-a-days; the +more the pity that some honest neighbours will not +make them friends. Nay, I can gleek upon occasion. + + + +TITANIA +Thou art as wise as thou art beautiful. + + + +BOTTOM +Not so, neither: but if I had wit enough to get out +of this wood, I have enough to serve mine own turn. + + + +TITANIA +Out of this wood do not desire to go: +Thou shalt remain here, whether thou wilt or no. +I am a spirit of no common rate; +The summer still doth tend upon my state; +And I do love thee: therefore, go with me; +I'll give thee fairies to attend on thee, +And they shall fetch thee jewels from the deep, +And sing while thou on pressed flowers dost sleep; +And I will purge thy mortal grossness so +That thou shalt like an airy spirit go. +Peaseblossom! Cobweb! Moth! and Mustardseed! + + + +Enter PEASEBLOSSOM, COBWEB, MOTH, and MUSTARDSEED + + +PEASEBLOSSOM +Ready. + + + +COBWEB +And I. + + + +MOTH +And I. + + + +MUSTARDSEED +And I. + + + +ALL +Where shall we go? + + + +TITANIA +Be kind and courteous to this gentleman; +Hop in his walks and gambol in his eyes; +Feed him with apricocks and dewberries, +With purple grapes, green figs, and mulberries; +The honey-bags steal from the humble-bees, +And for night-tapers crop their waxen thighs +And light them at the fiery glow-worm's eyes, +To have my love to bed and to arise; +And pluck the wings from Painted butterflies +To fan the moonbeams from his sleeping eyes: +Nod to him, elves, and do him courtesies. + + + +PEASEBLOSSOM +Hail, mortal! + + + +COBWEB +Hail! + + + +MOTH +Hail! + + + +MUSTARDSEED +Hail! + + + +BOTTOM +I cry your worship's mercy, heartily: I beseech your +worship's name. + + + +COBWEB +Cobweb. + + + +BOTTOM +I shall desire you of more acquaintance, good Master +Cobweb: if I cut my finger, I shall make bold with +you. Your name, honest gentleman? + + + +PEASEBLOSSOM +Peaseblossom. + + + +BOTTOM +I pray you, commend me to Mistress Squash, your +mother, and to Master Peascod, your father. Good +Master Peaseblossom, I shall desire you of more +acquaintance too. Your name, I beseech you, sir? + + + +MUSTARDSEED +Mustardseed. + + + +BOTTOM +Good Master Mustardseed, I know your patience well: +that same cowardly, giant-like ox-beef hath +devoured many a gentleman of your house: I promise +you your kindred had made my eyes water ere now. I +desire your more acquaintance, good Master +Mustardseed. + + + +TITANIA +Come, wait upon him; lead him to my bower. +The moon methinks looks with a watery eye; +And when she weeps, weeps every little flower, +Lamenting some enforced chastity. +Tie up my love's tongue bring him silently. + + + +Exeunt + + +SCENE II. Another part of the wood. +Enter OBERON + + +OBERON +I wonder if Titania be awaked; +Then, what it was that next came in her eye, +Which she must dote on in extremity. +Enter PUCK +Here comes my messenger. +How now, mad spirit! +What night-rule now about this haunted grove? + + + +PUCK +My mistress with a monster is in love. +Near to her close and consecrated bower, +While she was in her dull and sleeping hour, +A crew of patches, rude mechanicals, +That work for bread upon Athenian stalls, +Were met together to rehearse a play +Intended for great Theseus' nuptial-day. +The shallowest thick-skin of that barren sort, +Who Pyramus presented, in their sport +Forsook his scene and enter'd in a brake +When I did him at this advantage take, +An ass's nole I fixed on his head: +Anon his Thisbe must be answered, +And forth my mimic comes. When they him spy, +As wild geese that the creeping fowler eye, +Or russet-pated choughs, many in sort, +Rising and cawing at the gun's report, +Sever themselves and madly sweep the sky, +So, at his sight, away his fellows fly; +And, at our stamp, here o'er and o'er one falls; +He murder cries and help from Athens calls. +Their sense thus weak, lost with their fears +thus strong, +Made senseless things begin to do them wrong; +For briers and thorns at their apparel snatch; +Some sleeves, some hats, from yielders all +things catch. +I led them on in this distracted fear, +And left sweet Pyramus translated there: +When in that moment, so it came to pass, +Titania waked and straightway loved an ass. + + + +OBERON +This falls out better than I could devise. +But hast thou yet latch'd the Athenian's eyes +With the love-juice, as I did bid thee do? + + + +PUCK +I took him sleeping,--that is finish'd too,-- +And the Athenian woman by his side: +That, when he waked, of force she must be eyed. + + + +Enter HERMIA and DEMETRIUS + + +OBERON +Stand close: this is the same Athenian. + + + +PUCK +This is the woman, but not this the man. + + + +DEMETRIUS +O, why rebuke you him that loves you so? +Lay breath so bitter on your bitter foe. + + + +HERMIA +Now I but chide; but I should use thee worse, +For thou, I fear, hast given me cause to curse, +If thou hast slain Lysander in his sleep, +Being o'er shoes in blood, plunge in the deep, +And kill me too. +The sun was not so true unto the day +As he to me: would he have stolen away +From sleeping Hermia? I'll believe as soon +This whole earth may be bored and that the moon +May through the centre creep and so displease +Her brother's noontide with Antipodes. +It cannot be but thou hast murder'd him; +So should a murderer look, so dead, so grim. + + + +DEMETRIUS +So should the murder'd look, and so should I, +Pierced through the heart with your stern cruelty: +Yet you, the murderer, look as bright, as clear, +As yonder Venus in her glimmering sphere. + + + +HERMIA +What's this to my Lysander? where is he? +Ah, good Demetrius, wilt thou give him me? + + + +DEMETRIUS +I had rather give his carcass to my hounds. + + + +HERMIA +Out, dog! out, cur! thou drivest me past the bounds +Of maiden's patience. Hast thou slain him, then? +Henceforth be never number'd among men! +O, once tell true, tell true, even for my sake! +Durst thou have look'd upon him being awake, +And hast thou kill'd him sleeping? O brave touch! +Could not a worm, an adder, do so much? +An adder did it; for with doubler tongue +Than thine, thou serpent, never adder stung. + + + +DEMETRIUS +You spend your passion on a misprised mood: +I am not guilty of Lysander's blood; +Nor is he dead, for aught that I can tell. + + + +HERMIA +I pray thee, tell me then that he is well. + + + +DEMETRIUS +An if I could, what should I get therefore? + + + +HERMIA +A privilege never to see me more. +And from thy hated presence part I so: +See me no more, whether he be dead or no. + + + +Exit + + +DEMETRIUS +There is no following her in this fierce vein: +Here therefore for a while I will remain. +So sorrow's heaviness doth heavier grow +For debt that bankrupt sleep doth sorrow owe: +Which now in some slight measure it will pay, +If for his tender here I make some stay. + + + +Lies down and sleeps + + +OBERON +What hast thou done? thou hast mistaken quite +And laid the love-juice on some true-love's sight: +Of thy misprision must perforce ensue +Some true love turn'd and not a false turn'd true. + + + +PUCK +Then fate o'er-rules, that, one man holding troth, +A million fail, confounding oath on oath. + + + +OBERON +About the wood go swifter than the wind, +And Helena of Athens look thou find: +All fancy-sick she is and pale of cheer, +With sighs of love, that costs the fresh blood dear: +By some illusion see thou bring her here: +I'll charm his eyes against she do appear. + + + +PUCK +I go, I go; look how I go, +Swifter than arrow from the Tartar's bow. + + + +Exit + + +OBERON +Flower of this purple dye, +Hit with Cupid's archery, +Sink in apple of his eye. +When his love he doth espy, +Let her shine as gloriously +As the Venus of the sky. +When thou wakest, if she be by, +Beg of her for remedy. + + + +Re-enter PUCK + + +PUCK +Captain of our fairy band, +Helena is here at hand; +And the youth, mistook by me, +Pleading for a lover's fee. +Shall we their fond pageant see? +Lord, what fools these mortals be! + + + +OBERON +Stand aside: the noise they make +Will cause Demetrius to awake. + + + +PUCK +Then will two at once woo one; +That must needs be sport alone; +And those things do best please me +That befal preposterously. + + + +Enter LYSANDER and HELENA + + +LYSANDER +Why should you think that I should woo in scorn? +Scorn and derision never come in tears: +Look, when I vow, I weep; and vows so born, +In their nativity all truth appears. +How can these things in me seem scorn to you, +Bearing the badge of faith, to prove them true? + + + +HELENA +You do advance your cunning more and more. +When truth kills truth, O devilish-holy fray! +These vows are Hermia's: will you give her o'er? +Weigh oath with oath, and you will nothing weigh: +Your vows to her and me, put in two scales, +Will even weigh, and both as light as tales. + + + +LYSANDER +I had no judgment when to her I swore. + + + +HELENA +Nor none, in my mind, now you give her o'er. + + + +LYSANDER +Demetrius loves her, and he loves not you. + + + +DEMETRIUS +Awaking O Helena, goddess, nymph, perfect, divine! +To what, my love, shall I compare thine eyne? +Crystal is muddy. O, how ripe in show +Thy lips, those kissing cherries, tempting grow! +That pure congealed white, high Taurus snow, +Fann'd with the eastern wind, turns to a crow +When thou hold'st up thy hand: O, let me kiss +This princess of pure white, this seal of bliss! + + + +HELENA +O spite! O hell! I see you all are bent +To set against me for your merriment: +If you we re civil and knew courtesy, +You would not do me thus much injury. +Can you not hate me, as I know you do, +But you must join in souls to mock me too? +If you were men, as men you are in show, +You would not use a gentle lady so; +To vow, and swear, and superpraise my parts, +When I am sure you hate me with your hearts. +You both are rivals, and love Hermia; +And now both rivals, to mock Helena: +A trim exploit, a manly enterprise, +To conjure tears up in a poor maid's eyes +With your derision! none of noble sort +Would so offend a virgin, and extort +A poor soul's patience, all to make you sport. + + + +LYSANDER +You are unkind, Demetrius; be not so; +For you love Hermia; this you know I know: +And here, with all good will, with all my heart, +In Hermia's love I yield you up my part; +And yours of Helena to me bequeath, +Whom I do love and will do till my death. + + + +HELENA +Never did mockers waste more idle breath. + + + +DEMETRIUS +Lysander, keep thy Hermia; I will none: +If e'er I loved her, all that love is gone. +My heart to her but as guest-wise sojourn'd, +And now to Helen is it home return'd, +There to remain. + + + +LYSANDER +Helen, it is not so. + + + +DEMETRIUS +Disparage not the faith thou dost not know, +Lest, to thy peril, thou aby it dear. +Look, where thy love comes; yonder is thy dear. + + + +Re-enter HERMIA + + +HERMIA +Dark night, that from the eye his function takes, +The ear more quick of apprehension makes; +Wherein it doth impair the seeing sense, +It pays the hearing double recompense. +Thou art not by mine eye, Lysander, found; +Mine ear, I thank it, brought me to thy sound +But why unkindly didst thou leave me so? + + + +LYSANDER +Why should he stay, whom love doth press to go? + + + +HERMIA +What love could press Lysander from my side? + + + +LYSANDER +Lysander's love, that would not let him bide, +Fair Helena, who more engilds the night +Than all you fiery oes and eyes of light. +Why seek'st thou me? could not this make thee know, +The hate I bear thee made me leave thee so? + + + +HERMIA +You speak not as you think: it cannot be. + + + +HELENA +Lo, she is one of this confederacy! +Now I perceive they have conjoin'd all three +To fashion this false sport, in spite of me. +Injurious Hermia! most ungrateful maid! +Have you conspired, have you with these contrived +To bait me with this foul derision? +Is all the counsel that we two have shared, +The sisters' vows, the hours that we have spent, +When we have chid the hasty-footed time +For parting us,--O, is it all forgot? +All school-days' friendship, childhood innocence? +We, Hermia, like two artificial gods, +Have with our needles created both one flower, +Both on one sampler, sitting on one cushion, +Both warbling of one song, both in one key, +As if our hands, our sides, voices and minds, +Had been incorporate. So we grow together, +Like to a double cherry, seeming parted, +But yet an union in partition; +Two lovely berries moulded on one stem; +So, with two seeming bodies, but one heart; +Two of the first, like coats in heraldry, +Due but to one and crowned with one crest. +And will you rent our ancient love asunder, +To join with men in scorning your poor friend? +It is not friendly, 'tis not maidenly: +Our sex, as well as I, may chide you for it, +Though I alone do feel the injury. + + + +HERMIA +I am amazed at your passionate words. +I scorn you not: it seems that you scorn me. + + + +HELENA +Have you not set Lysander, as in scorn, +To follow me and praise my eyes and face? +And made your other love, Demetrius, +Who even but now did spurn me with his foot, +To call me goddess, nymph, divine and rare, +Precious, celestial? Wherefore speaks he this +To her he hates? and wherefore doth Lysander +Deny your love, so rich within his soul, +And tender me, forsooth, affection, +But by your setting on, by your consent? +What thought I be not so in grace as you, +So hung upon with love, so fortunate, +But miserable most, to love unloved? +This you should pity rather than despise. + + + +HERNIA +I understand not what you mean by this. + + + +HELENA +Ay, do, persever, counterfeit sad looks, +Make mouths upon me when I turn my back; +Wink each at other; hold the sweet jest up: +This sport, well carried, shall be chronicled. +If you have any pity, grace, or manners, +You would not make me such an argument. +But fare ye well: 'tis partly my own fault; +Which death or absence soon shall remedy. + + + +LYSANDER +Stay, gentle Helena; hear my excuse: +My love, my life my soul, fair Helena! + + + +HELENA +O excellent! + + + +HERMIA +Sweet, do not scorn her so. + + + +DEMETRIUS +If she cannot entreat, I can compel. + + + +LYSANDER +Thou canst compel no more than she entreat: +Thy threats have no more strength than her weak prayers. +Helen, I love thee; by my life, I do: +I swear by that which I will lose for thee, +To prove him false that says I love thee not. + + + +DEMETRIUS +I say I love thee more than he can do. + + + +LYSANDER +If thou say so, withdraw, and prove it too. + + + +DEMETRIUS +Quick, come! + + + +HERMIA +Lysander, whereto tends all this? + + + +LYSANDER +Away, you Ethiope! + + + +DEMETRIUS +No, no; he'll +Seem to break loose; take on as you would follow, +But yet come not: you are a tame man, go! + + + +LYSANDER +Hang off, thou cat, thou burr! vile thing, let loose, +Or I will shake thee from me like a serpent! + + + +HERMIA +Why are you grown so rude? what change is this? +Sweet love,-- + + + +LYSANDER +Thy love! out, tawny Tartar, out! +Out, loathed medicine! hated potion, hence! + + + +HERMIA +Do you not jest? + + + +HELENA +Yes, sooth; and so do you. + + + +LYSANDER +Demetrius, I will keep my word with thee. + + + +DEMETRIUS +I would I had your bond, for I perceive +A weak bond holds you: I'll not trust your word. + + + +LYSANDER +What, should I hurt her, strike her, kill her dead? +Although I hate her, I'll not harm her so. + + + +HERMIA +What, can you do me greater harm than hate? +Hate me! wherefore? O me! what news, my love! +Am not I Hermia? are not you Lysander? +I am as fair now as I was erewhile. +Since night you loved me; yet since night you left +me: +Why, then you left me--O, the gods forbid!-- +In earnest, shall I say? + + + +LYSANDER +Ay, by my life; +And never did desire to see thee more. +Therefore be out of hope, of question, of doubt; +Be certain, nothing truer; 'tis no jest +That I do hate thee and love Helena. + + + +HERMIA +O me! you juggler! you canker-blossom! +You thief of love! what, have you come by night +And stolen my love's heart from him? + + + +HELENA +Fine, i'faith! +Have you no modesty, no maiden shame, +No touch of bashfulness? What, will you tear +Impatient answers from my gentle tongue? +Fie, fie! you counterfeit, you puppet, you! + + + +HERMIA +Puppet? why so? ay, that way goes the game. +Now I perceive that she hath made compare +Between our statures; she hath urged her height; +And with her personage, her tall personage, +Her height, forsooth, she hath prevail'd with him. +And are you grown so high in his esteem; +Because I am so dwarfish and so low? +How low am I, thou painted maypole? speak; +How low am I? I am not yet so low +But that my nails can reach unto thine eyes. + + + +HELENA +I pray you, though you mock me, gentlemen, +Let her not hurt me: I was never curst; +I have no gift at all in shrewishness; +I am a right maid for my cowardice: +Let her not strike me. You perhaps may think, +Because she is something lower than myself, +That I can match her. + + + +HERMIA +Lower! hark, again. + + + +HELENA +Good Hermia, do not be so bitter with me. +I evermore did love you, Hermia, +Did ever keep your counsels, never wrong'd you; +Save that, in love unto Demetrius, +I told him of your stealth unto this wood. +He follow'd you; for love I follow'd him; +But he hath chid me hence and threaten'd me +To strike me, spurn me, nay, to kill me too: +And now, so you will let me quiet go, +To Athens will I bear my folly back +And follow you no further: let me go: +You see how simple and how fond I am. + + + +HERMIA +Why, get you gone: who is't that hinders you? + + + +HELENA +A foolish heart, that I leave here behind. + + + +HERMIA +What, with Lysander? + + + +HELENA +With Demetrius. + + + +LYSANDER +Be not afraid; she shall not harm thee, Helena. + + + +DEMETRIUS +No, sir, she shall not, though you take her part. + + + +HELENA +O, when she's angry, she is keen and shrewd! +She was a vixen when she went to school; +And though she be but little, she is fierce. + + + +HERMIA +'Little' again! nothing but 'low' and 'little'! +Why will you suffer her to flout me thus? +Let me come to her. + + + +LYSANDER +Get you gone, you dwarf; +You minimus, of hindering knot-grass made; +You bead, you acorn. + + + +DEMETRIUS +You are too officious +In her behalf that scorns your services. +Let her alone: speak not of Helena; +Take not her part; for, if thou dost intend +Never so little show of love to her, +Thou shalt aby it. + + + +LYSANDER +Now she holds me not; +Now follow, if thou darest, to try whose right, +Of thine or mine, is most in Helena. + + + +DEMETRIUS +Follow! nay, I'll go with thee, cheek by jole. + + + +Exeunt LYSANDER and DEMETRIUS + + +HERMIA +You, mistress, all this coil is 'long of you: +Nay, go not back. + + + +HELENA +I will not trust you, I, +Nor longer stay in your curst company. +Your hands than mine are quicker for a fray, +My legs are longer though, to run away. + + + +Exit + + +HERMIA +I am amazed, and know not what to say. + + + +Exit + + +OBERON +This is thy negligence: still thou mistakest, +Or else committ'st thy knaveries wilfully. + + + +PUCK +Believe me, king of shadows, I mistook. +Did not you tell me I should know the man +By the Athenian garment be had on? +And so far blameless proves my enterprise, +That I have 'nointed an Athenian's eyes; +And so far am I glad it so did sort +As this their jangling I esteem a sport. + + + +OBERON +Thou see'st these lovers seek a place to fight: +Hie therefore, Robin, overcast the night; +The starry welkin cover thou anon +With drooping fog as black as Acheron, +And lead these testy rivals so astray +As one come not within another's way. +Like to Lysander sometime frame thy tongue, +Then stir Demetrius up with bitter wrong; +And sometime rail thou like Demetrius; +And from each other look thou lead them thus, +Till o'er their brows death-counterfeiting sleep +With leaden legs and batty wings doth creep: +Then crush this herb into Lysander's eye; +Whose liquor hath this virtuous property, +To take from thence all error with his might, +And make his eyeballs roll with wonted sight. +When they next wake, all this derision +Shall seem a dream and fruitless vision, +And back to Athens shall the lovers wend, +With league whose date till death shall never end. +Whiles I in this affair do thee employ, +I'll to my queen and beg her Indian boy; +And then I will her charmed eye release +From monster's view, and all things shall be peace. + + + +PUCK +My fairy lord, this must be done with haste, +For night's swift dragons cut the clouds full fast, +And yonder shines Aurora's harbinger; +At whose approach, ghosts, wandering here and there, +Troop home to churchyards: damned spirits all, +That in crossways and floods have burial, +Already to their wormy beds are gone; +For fear lest day should look their shames upon, +They willfully themselves exile from light +And must for aye consort with black-brow'd night. + + + +OBERON +But we are spirits of another sort: +I with the morning's love have oft made sport, +And, like a forester, the groves may tread, +Even till the eastern gate, all fiery-red, +Opening on Neptune with fair blessed beams, +Turns into yellow gold his salt green streams. +But, notwithstanding, haste; make no delay: +We may effect this business yet ere day. + + + +Exit + + +PUCK +Up and down, up and down, +I will lead them up and down: +I am fear'd in field and town: +Goblin, lead them up and down. +Here comes one. + + + +Re-enter LYSANDER + + +LYSANDER +Where art thou, proud Demetrius? speak thou now. + + + +PUCK +Here, villain; drawn and ready. Where art thou? + + + +LYSANDER +I will be with thee straight. + + + +PUCK +Follow me, then, +To plainer ground. + + +Exit LYSANDER, as following the voice +Re-enter DEMETRIUS + + +DEMETRIUS +Lysander! speak again: +Thou runaway, thou coward, art thou fled? +Speak! In some bush? Where dost thou hide thy head? + + + +PUCK +Thou coward, art thou bragging to the stars, +Telling the bushes that thou look'st for wars, +And wilt not come? Come, recreant; come, thou child; +I'll whip thee with a rod: he is defiled +That draws a sword on thee. + + + +DEMETRIUS +Yea, art thou there? + + + +PUCK +Follow my voice: we'll try no manhood here. + + +Exeunt +Re-enter LYSANDER + + +LYSANDER +He goes before me and still dares me on: +When I come where he calls, then he is gone. +The villain is much lighter-heel'd than I: +I follow'd fast, but faster he did fly; +That fallen am I in dark uneven way, +And here will rest me. +Lies down +Come, thou gentle day! +For if but once thou show me thy grey light, +I'll find Demetrius and revenge this spite. + + +Sleeps +Re-enter PUCK and DEMETRIUS + + +PUCK +Ho, ho, ho! Coward, why comest thou not? + + + +DEMETRIUS +Abide me, if thou darest; for well I wot +Thou runn'st before me, shifting every place, +And darest not stand, nor look me in the face. +Where art thou now? + + + +PUCK +Come hither: I am here. + + + +DEMETRIUS +Nay, then, thou mock'st me. Thou shalt buy this dear, +If ever I thy face by daylight see: +Now, go thy way. Faintness constraineth me +To measure out my length on this cold bed. +By day's approach look to be visited. + + +Lies down and sleeps +Re-enter HELENA + + +HELENA +O weary night, O long and tedious night, +Abate thy hour! Shine comforts from the east, +That I may back to Athens by daylight, +From these that my poor company detest: +And sleep, that sometimes shuts up sorrow's eye, +Steal me awhile from mine own company. + + + +Lies down and sleeps + + +PUCK +Yet but three? Come one more; +Two of both kinds make up four. +Here she comes, curst and sad: +Cupid is a knavish lad, +Thus to make poor females mad. + + + +Re-enter HERMIA + + +HERMIA +Never so weary, never so in woe, +Bedabbled with the dew and torn with briers, +I can no further crawl, no further go; +My legs can keep no pace with my desires. +Here will I rest me till the break of day. +Heavens shield Lysander, if they mean a fray! + + + +Lies down and sleeps + + +PUCK +On the ground +Sleep sound: +I'll apply +To your eye, +Gentle lover, remedy. +Squeezing the juice on LYSANDER's eyes +When thou wakest, +Thou takest +True delight +In the sight +Of thy former lady's eye: +And the country proverb known, +That every man should take his own, +In your waking shall be shown: +Jack shall have Jill; +Nought shall go ill; +The man shall have his mare again, and all shall be well. + + + +Exit + + + + +ACT IV + +SCENE I. The same. LYSANDER, DEMETRIUS, HELENA, and HERMIA lying asleep. +Enter TITANIA and BOTTOM; PEASEBLOSSOM, COBWEB, MOTH, +MUSTARDSEED, and other Fairies attending; OBERON +behind unseen + + +TITANIA +Come, sit thee down upon this flowery bed, +While I thy amiable cheeks do coy, +And stick musk-roses in thy sleek smooth head, +And kiss thy fair large ears, my gentle joy. + + + +BOTTOM +Where's Peaseblossom? + + + +PEASEBLOSSOM +Ready. + + + +BOTTOM +Scratch my head Peaseblossom. Where's Mounsieur Cobweb? + + + +COBWEB +Ready. + + + +BOTTOM +Mounsieur Cobweb, good mounsieur, get you your +weapons in your hand, and kill me a red-hipped +humble-bee on the top of a thistle; and, good +mounsieur, bring me the honey-bag. Do not fret +yourself too much in the action, mounsieur; and, +good mounsieur, have a care the honey-bag break not; +I would be loath to have you overflown with a +honey-bag, signior. Where's Mounsieur Mustardseed? + + + +MUSTARDSEED +Ready. + + + +BOTTOM +Give me your neaf, Mounsieur Mustardseed. Pray you, +leave your courtesy, good mounsieur. + + + +MUSTARDSEED +What's your Will? + + + +BOTTOM +Nothing, good mounsieur, but to help Cavalery Cobweb +to scratch. I must to the barber's, monsieur; for +methinks I am marvellous hairy about the face; and I +am such a tender ass, if my hair do but tickle me, +I must scratch. + + + +TITANIA +What, wilt thou hear some music, +my sweet love? + + + +BOTTOM +I have a reasonable good ear in music. Let's have +the tongs and the bones. + + + +TITANIA +Or say, sweet love, what thou desirest to eat. + + + +BOTTOM +Truly, a peck of provender: I could munch your good +dry oats. Methinks I have a great desire to a bottle +of hay: good hay, sweet hay, hath no fellow. + + + +TITANIA +I have a venturous fairy that shall seek +The squirrel's hoard, and fetch thee new nuts. + + + +BOTTOM +I had rather have a handful or two of dried peas. +But, I pray you, let none of your people stir me: I +have an exposition of sleep come upon me. + + + +TITANIA +Sleep thou, and I will wind thee in my arms. +Fairies, begone, and be all ways away. +Exeunt fairies +So doth the woodbine the sweet honeysuckle +Gently entwist; the female ivy so +Enrings the barky fingers of the elm. +O, how I love thee! how I dote on thee! + + +They sleep +Enter PUCK + + +OBERON +Advancing Welcome, good Robin. +See'st thou this sweet sight? +Her dotage now I do begin to pity: +For, meeting her of late behind the wood, +Seeking sweet favours from this hateful fool, +I did upbraid her and fall out with her; +For she his hairy temples then had rounded +With a coronet of fresh and fragrant flowers; +And that same dew, which sometime on the buds +Was wont to swell like round and orient pearls, +Stood now within the pretty flowerets' eyes +Like tears that did their own disgrace bewail. +When I had at my pleasure taunted her +And she in mild terms begg'd my patience, +I then did ask of her her changeling child; +Which straight she gave me, and her fairy sent +To bear him to my bower in fairy land. +And now I have the boy, I will undo +This hateful imperfection of her eyes: +And, gentle Puck, take this transformed scalp +From off the head of this Athenian swain; +That, he awaking when the other do, +May all to Athens back again repair +And think no more of this night's accidents +But as the fierce vexation of a dream. +But first I will release the fairy queen. +Be as thou wast wont to be; +See as thou wast wont to see: +Dian's bud o'er Cupid's flower +Hath such force and blessed power. +Now, my Titania; wake you, my sweet queen. + + + +TITANIA +My Oberon! what visions have I seen! +Methought I was enamour'd of an ass. + + + +OBERON +There lies your love. + + + +TITANIA +How came these things to pass? +O, how mine eyes do loathe his visage now! + + + +OBERON +Silence awhile. Robin, take off this head. +Titania, music call; and strike more dead +Than common sleep of all these five the sense. + + + +TITANIA +Music, ho! music, such as charmeth sleep! + + + +Music, still + + +PUCK +Now, when thou wakest, with thine +own fool's eyes peep. + + + +OBERON +Sound, music! Come, my queen, take hands with me, +And rock the ground whereon these sleepers be. +Now thou and I are new in amity, +And will to-morrow midnight solemnly +Dance in Duke Theseus' house triumphantly, +And bless it to all fair prosperity: +There shall the pairs of faithful lovers be +Wedded, with Theseus, all in jollity. + + + +PUCK +Fairy king, attend, and mark: +I do hear the morning lark. + + + +OBERON +Then, my queen, in silence sad, +Trip we after the night's shade: +We the globe can compass soon, +Swifter than the wandering moon. + + + +TITANIA +Come, my lord, and in our flight +Tell me how it came this night +That I sleeping here was found +With these mortals on the ground. +Exeunt + + +Horns winded within +Enter THESEUS, HIPPOLYTA, EGEUS, and train + + +THESEUS +Go, one of you, find out the forester; +For now our observation is perform'd; +And since we have the vaward of the day, +My love shall hear the music of my hounds. +Uncouple in the western valley; let them go: +Dispatch, I say, and find the forester. +Exit an Attendant +We will, fair queen, up to the mountain's top, +And mark the musical confusion +Of hounds and echo in conjunction. + + + +HIPPOLYTA +I was with Hercules and Cadmus once, +When in a wood of Crete they bay'd the bear +With hounds of Sparta: never did I hear +Such gallant chiding: for, besides the groves, +The skies, the fountains, every region near +Seem'd all one mutual cry: I never heard +So musical a discord, such sweet thunder. + + + +THESEUS +My hounds are bred out of the Spartan kind, +So flew'd, so sanded, and their heads are hung +With ears that sweep away the morning dew; +Crook-knee'd, and dew-lapp'd like Thessalian bulls; +Slow in pursuit, but match'd in mouth like bells, +Each under each. A cry more tuneable +Was never holla'd to, nor cheer'd with horn, +In Crete, in Sparta, nor in Thessaly: +Judge when you hear. But, soft! what nymphs are these? + + + +EGEUS +My lord, this is my daughter here asleep; +And this, Lysander; this Demetrius is; +This Helena, old Nedar's Helena: +I wonder of their being here together. + + + +THESEUS +No doubt they rose up early to observe +The rite of May, and hearing our intent, +Came here in grace our solemnity. +But speak, Egeus; is not this the day +That Hermia should give answer of her choice? + + + +EGEUS +It is, my lord. + + + +THESEUS +Go, bid the huntsmen wake them with their horns. +Horns and shout within. LYSANDER, DEMETRIUS, +HELENA, and HERMIA wake and start up +Good morrow, friends. Saint Valentine is past: +Begin these wood-birds but to couple now? + + + +LYSANDER +Pardon, my lord. + + + +THESEUS +I pray you all, stand up. +I know you two are rival enemies: +How comes this gentle concord in the world, +That hatred is so far from jealousy, +To sleep by hate, and fear no enmity? + + + +LYSANDER +My lord, I shall reply amazedly, +Half sleep, half waking: but as yet, I swear, +I cannot truly say how I came here; +But, as I think,--for truly would I speak, +And now do I bethink me, so it is,-- +I came with Hermia hither: our intent +Was to be gone from Athens, where we might, +Without the peril of the Athenian law. + + + +EGEUS +Enough, enough, my lord; you have enough: +I beg the law, the law, upon his head. +They would have stolen away; they would, Demetrius, +Thereby to have defeated you and me, +You of your wife and me of my consent, +Of my consent that she should be your wife. + + + +DEMETRIUS +My lord, fair Helen told me of their stealth, +Of this their purpose hither to this wood; +And I in fury hither follow'd them, +Fair Helena in fancy following me. +But, my good lord, I wot not by what power,-- +But by some power it is,--my love to Hermia, +Melted as the snow, seems to me now +As the remembrance of an idle gaud +Which in my childhood I did dote upon; +And all the faith, the virtue of my heart, +The object and the pleasure of mine eye, +Is only Helena. To her, my lord, +Was I betroth'd ere I saw Hermia: +But, like in sickness, did I loathe this food; +But, as in health, come to my natural taste, +Now I do wish it, love it, long for it, +And will for evermore be true to it. + + + +THESEUS +Fair lovers, you are fortunately met: +Of this discourse we more will hear anon. +Egeus, I will overbear your will; +For in the temple by and by with us +These couples shall eternally be knit: +And, for the morning now is something worn, +Our purposed hunting shall be set aside. +Away with us to Athens; three and three, +We'll hold a feast in great solemnity. +Come, Hippolyta. + + + +Exeunt THESEUS, HIPPOLYTA, EGEUS, and train + + +DEMETRIUS +These things seem small and undistinguishable, + + + +HERMIA +Methinks I see these things with parted eye, +When every thing seems double. + + + +HELENA +So methinks: +And I have found Demetrius like a jewel, +Mine own, and not mine own. + + + +DEMETRIUS +Are you sure +That we are awake? It seems to me +That yet we sleep, we dream. Do not you think +The duke was here, and bid us follow him? + + + +HERMIA +Yea; and my father. + + + +HELENA +And Hippolyta. + + + +LYSANDER +And he did bid us follow to the temple. + + + +DEMETRIUS +Why, then, we are awake: let's follow him +And by the way let us recount our dreams. + + + +Exeunt + + +BOTTOM +Awaking When my cue comes, call me, and I will +answer: my next is, 'Most fair Pyramus.' Heigh-ho! +Peter Quince! Flute, the bellows-mender! Snout, +the tinker! Starveling! God's my life, stolen +hence, and left me asleep! I have had a most rare +vision. I have had a dream, past the wit of man to +say what dream it was: man is but an ass, if he go +about to expound this dream. Methought I was--there +is no man can tell what. Methought I was,--and +methought I had,--but man is but a patched fool, if +he will offer to say what methought I had. The eye +of man hath not heard, the ear of man hath not +seen, man's hand is not able to taste, his tongue +to conceive, nor his heart to report, what my dream +was. I will get Peter Quince to write a ballad of +this dream: it shall be called Bottom's Dream, +because it hath no bottom; and I will sing it in the +latter end of a play, before the duke: +peradventure, to make it the more gracious, I shall +sing it at her death. + + + +Exit + + +SCENE II. Athens. QUINCE'S house. +Enter QUINCE, FLUTE, SNOUT, and STARVELING + + +QUINCE +Have you sent to Bottom's house? is he come home yet? + + + +STARVELING +He cannot be heard of. Out of doubt he is +transported. + + + +FLUTE +If he come not, then the play is marred: it goes +not forward, doth it? + + + +QUINCE +It is not possible: you have not a man in all +Athens able to discharge Pyramus but he. + + + +FLUTE +No, he hath simply the best wit of any handicraft +man in Athens. + + + +QUINCE +Yea and the best person too; and he is a very +paramour for a sweet voice. + + + +FLUTE +You must say 'paragon:' a paramour is, God bless us, +a thing of naught. + + + +Enter SNUG + + +SNUG +Masters, the duke is coming from the temple, and +there is two or three lords and ladies more married: +if our sport had gone forward, we had all been made +men. + + + +FLUTE +O sweet bully Bottom! Thus hath he lost sixpence a +day during his life; he could not have 'scaped +sixpence a day: an the duke had not given him +sixpence a day for playing Pyramus, I'll be hanged; +he would have deserved it: sixpence a day in +Pyramus, or nothing. + + + +Enter BOTTOM + + +BOTTOM +Where are these lads? where are these hearts? + + + +QUINCE +Bottom! O most courageous day! O most happy hour! + + + +BOTTOM +Masters, I am to discourse wonders: but ask me not +what; for if I tell you, I am no true Athenian. I +will tell you every thing, right as it fell out. + + + +QUINCE +Let us hear, sweet Bottom. + + + +BOTTOM +Not a word of me. All that I will tell you is, that +the duke hath dined. Get your apparel together, +good strings to your beards, new ribbons to your +pumps; meet presently at the palace; every man look +o'er his part; for the short and the long is, our +play is preferred. In any case, let Thisby have +clean linen; and let not him that plays the lion +pair his nails, for they shall hang out for the +lion's claws. And, most dear actors, eat no onions +nor garlic, for we are to utter sweet breath; and I +do not doubt but to hear them say, it is a sweet +comedy. No more words: away! go, away! + + + +Exeunt + + + + +ACT V + +SCENE I. Athens. The palace of THESEUS. +Enter THESEUS, HIPPOLYTA, PHILOSTRATE, Lords and +Attendants + + +HIPPOLYTA +'Tis strange my Theseus, that these +lovers speak of. + + + +THESEUS +More strange than true: I never may believe +These antique fables, nor these fairy toys. +Lovers and madmen have such seething brains, +Such shaping fantasies, that apprehend +More than cool reason ever comprehends. +The lunatic, the lover and the poet +Are of imagination all compact: +One sees more devils than vast hell can hold, +That is, the madman: the lover, all as frantic, +Sees Helen's beauty in a brow of Egypt: +The poet's eye, in fine frenzy rolling, +Doth glance from heaven to earth, from earth to heaven; +And as imagination bodies forth +The forms of things unknown, the poet's pen +Turns them to shapes and gives to airy nothing +A local habitation and a name. +Such tricks hath strong imagination, +That if it would but apprehend some joy, +It comprehends some bringer of that joy; +Or in the night, imagining some fear, +How easy is a bush supposed a bear! + + + +HIPPOLYTA +But all the story of the night told over, +And all their minds transfigured so together, +More witnesseth than fancy's images +And grows to something of great constancy; +But, howsoever, strange and admirable. + + + +THESEUS +Here come the lovers, full of joy and mirth. +Enter LYSANDER, DEMETRIUS, HERMIA, and HELENA +Joy, gentle friends! joy and fresh days of love +Accompany your hearts! + + + +LYSANDER +More than to us +Wait in your royal walks, your board, your bed! + + + +THESEUS +Come now; what masques, what dances shall we have, +To wear away this long age of three hours +Between our after-supper and bed-time? +Where is our usual manager of mirth? +What revels are in hand? Is there no play, +To ease the anguish of a torturing hour? +Call Philostrate. + + + +PHILOSTRATE +Here, mighty Theseus. + + + +THESEUS +Say, what abridgement have you for this evening? +What masque? what music? How shall we beguile +The lazy time, if not with some delight? + + + +PHILOSTRATE +There is a brief how many sports are ripe: +Make choice of which your highness will see first. + + + +Giving a paper + + +THESEUS +Reads 'The battle with the Centaurs, to be sung +By an Athenian eunuch to the harp.' +We'll none of that: that have I told my love, +In glory of my kinsman Hercules. +Reads +'The riot of the tipsy Bacchanals, +Tearing the Thracian singer in their rage.' +That is an old device; and it was play'd +When I from Thebes came last a conqueror. +Reads +'The thrice three Muses mourning for the death +Of Learning, late deceased in beggary.' +That is some satire, keen and critical, +Not sorting with a nuptial ceremony. +Reads +'A tedious brief scene of young Pyramus +And his love Thisbe; very tragical mirth.' +Merry and tragical! tedious and brief! +That is, hot ice and wondrous strange snow. +How shall we find the concord of this discord? + + + +PHILOSTRATE +A play there is, my lord, some ten words long, +Which is as brief as I have known a play; +But by ten words, my lord, it is too long, +Which makes it tedious; for in all the play +There is not one word apt, one player fitted: +And tragical, my noble lord, it is; +For Pyramus therein doth kill himself. +Which, when I saw rehearsed, I must confess, +Made mine eyes water; but more merry tears +The passion of loud laughter never shed. + + + +THESEUS +What are they that do play it? + + + +PHILOSTRATE +Hard-handed men that work in Athens here, +Which never labour'd in their minds till now, +And now have toil'd their unbreathed memories +With this same play, against your nuptial. + + + +THESEUS +And we will hear it. + + + +PHILOSTRATE +No, my noble lord; +It is not for you: I have heard it over, +And it is nothing, nothing in the world; +Unless you can find sport in their intents, +Extremely stretch'd and conn'd with cruel pain, +To do you service. + + + +THESEUS +I will hear that play; +For never anything can be amiss, +When simpleness and duty tender it. +Go, bring them in: and take your places, ladies. + + + +Exit PHILOSTRATE + + +HIPPOLYTA +I love not to see wretchedness o'er charged +And duty in his service perishing. + + + +THESEUS +Why, gentle sweet, you shall see no such thing. + + + +HIPPOLYTA +He says they can do nothing in this kind. + + + +THESEUS +The kinder we, to give them thanks for nothing. +Our sport shall be to take what they mistake: +And what poor duty cannot do, noble respect +Takes it in might, not merit. +Where I have come, great clerks have purposed +To greet me with premeditated welcomes; +Where I have seen them shiver and look pale, +Make periods in the midst of sentences, +Throttle their practised accent in their fears +And in conclusion dumbly have broke off, +Not paying me a welcome. Trust me, sweet, +Out of this silence yet I pick'd a welcome; +And in the modesty of fearful duty +I read as much as from the rattling tongue +Of saucy and audacious eloquence. +Love, therefore, and tongue-tied simplicity +In least speak most, to my capacity. + + + +Re-enter PHILOSTRATE + + +PHILOSTRATE +So please your grace, the Prologue is address'd. + + + +THESEUS +Let him approach. + + +Flourish of trumpets +Enter QUINCE for the Prologue + + +Prologue +If we offend, it is with our good will. +That you should think, we come not to offend, +But with good will. To show our simple skill, +That is the true beginning of our end. +Consider then we come but in despite. +We do not come as minding to contest you, +Our true intent is. All for your delight +We are not here. That you should here repent you, +The actors are at hand and by their show +You shall know all that you are like to know. + + + +THESEUS +This fellow doth not stand upon points. + + + +LYSANDER +He hath rid his prologue like a rough colt; he knows +not the stop. A good moral, my lord: it is not +enough to speak, but to speak true. + + + +HIPPOLYTA +Indeed he hath played on his prologue like a child +on a recorder; a sound, but not in government. + + + +THESEUS +His speech, was like a tangled chain; nothing +impaired, but all disordered. Who is next? + + + +Enter Pyramus and Thisbe, Wall, Moonshine, and Lion + + +Prologue +Gentles, perchance you wonder at this show; +But wonder on, till truth make all things plain. +This man is Pyramus, if you would know; +This beauteous lady Thisby is certain. +This man, with lime and rough-cast, doth present +Wall, that vile Wall which did these lovers sunder; +And through Wall's chink, poor souls, they are content +To whisper. At the which let no man wonder. +This man, with lanthorn, dog, and bush of thorn, +Presenteth Moonshine; for, if you will know, +By moonshine did these lovers think no scorn +To meet at Ninus' tomb, there, there to woo. +This grisly beast, which Lion hight by name, +The trusty Thisby, coming first by night, +Did scare away, or rather did affright; +And, as she fled, her mantle she did fall, +Which Lion vile with bloody mouth did stain. +Anon comes Pyramus, sweet youth and tall, +And finds his trusty Thisby's mantle slain: +Whereat, with blade, with bloody blameful blade, +He bravely broach'd is boiling bloody breast; +And Thisby, tarrying in mulberry shade, +His dagger drew, and died. For all the rest, +Let Lion, Moonshine, Wall, and lovers twain +At large discourse, while here they do remain. + + + +Exeunt Prologue, Thisbe, Lion, and Moonshine + + +THESEUS +I wonder if the lion be to speak. + + + +DEMETRIUS +No wonder, my lord: one lion may, when many asses do. + + + +Wall +In this same interlude it doth befall +That I, one Snout by name, present a wall; +And such a wall, as I would have you think, +That had in it a crannied hole or chink, +Through which the lovers, Pyramus and Thisby, +Did whisper often very secretly. +This loam, this rough-cast and this stone doth show +That I am that same wall; the truth is so: +And this the cranny is, right and sinister, +Through which the fearful lovers are to whisper. + + + +THESEUS +Would you desire lime and hair to speak better? + + + +DEMETRIUS +It is the wittiest partition that ever I heard +discourse, my lord. + + + +Enter Pyramus + + +THESEUS +Pyramus draws near the wall: silence! + + + +Pyramus +O grim-look'd night! O night with hue so black! +O night, which ever art when day is not! +O night, O night! alack, alack, alack, +I fear my Thisby's promise is forgot! +And thou, O wall, O sweet, O lovely wall, +That stand'st between her father's ground and mine! +Thou wall, O wall, O sweet and lovely wall, +Show me thy chink, to blink through with mine eyne! +Wall holds up his fingers +Thanks, courteous wall: Jove shield thee well for this! +But what see I? No Thisby do I see. +O wicked wall, through whom I see no bliss! +Cursed be thy stones for thus deceiving me! + + + +THESEUS +The wall, methinks, being sensible, should curse again. + + + +Pyramus +No, in truth, sir, he should not. 'Deceiving me' +is Thisby's cue: she is to enter now, and I am to +spy her through the wall. You shall see, it will +fall pat as I told you. Yonder she comes. + + + +Enter Thisbe + + +Thisbe +O wall, full often hast thou heard my moans, +For parting my fair Pyramus and me! +My cherry lips have often kiss'd thy stones, +Thy stones with lime and hair knit up in thee. + + + +Pyramus +I see a voice: now will I to the chink, +To spy an I can hear my Thisby's face. Thisby! + + + +Thisbe +My love thou art, my love I think. + + + +Pyramus +Think what thou wilt, I am thy lover's grace; +And, like Limander, am I trusty still. + + + +Thisbe +And I like Helen, till the Fates me kill. + + + +Pyramus +Not Shafalus to Procrus was so true. + + + +Thisbe +As Shafalus to Procrus, I to you. + + + +Pyramus +O kiss me through the hole of this vile wall! + + + +Thisbe +I kiss the wall's hole, not your lips at all. + + + +Pyramus +Wilt thou at Ninny's tomb meet me straightway? + + + +Thisbe +'Tide life, 'tide death, I come without delay. + + + +Exeunt Pyramus and Thisbe + + +Wall +Thus have I, Wall, my part discharged so; +And, being done, thus Wall away doth go. + + + +Exit + + +THESEUS +Now is the mural down between the two neighbours. + + + +DEMETRIUS +No remedy, my lord, when walls are so wilful to hear +without warning. + + + +HIPPOLYTA +This is the silliest stuff that ever I heard. + + + +THESEUS +The best in this kind are but shadows; and the worst +are no worse, if imagination amend them. + + + +HIPPOLYTA +It must be your imagination then, and not theirs. + + + +THESEUS +If we imagine no worse of them than they of +themselves, they may pass for excellent men. Here +come two noble beasts in, a man and a lion. + + + +Enter Lion and Moonshine + + +Lion +You, ladies, you, whose gentle hearts do fear +The smallest monstrous mouse that creeps on floor, +May now perchance both quake and tremble here, +When lion rough in wildest rage doth roar. +Then know that I, one Snug the joiner, am +A lion-fell, nor else no lion's dam; +For, if I should as lion come in strife +Into this place, 'twere pity on my life. + + + +THESEUS +A very gentle beast, of a good conscience. + + + +DEMETRIUS +The very best at a beast, my lord, that e'er I saw. + + + +LYSANDER +This lion is a very fox for his valour. + + + +THESEUS +True; and a goose for his discretion. + + + +DEMETRIUS +Not so, my lord; for his valour cannot carry his +discretion; and the fox carries the goose. + + + +THESEUS +His discretion, I am sure, cannot carry his valour; +for the goose carries not the fox. It is well: +leave it to his discretion, and let us listen to the moon. + + + +Moonshine +This lanthorn doth the horned moon present;-- + + + +DEMETRIUS +He should have worn the horns on his head. + + + +THESEUS +He is no crescent, and his horns are +invisible within the circumference. + + + +Moonshine +This lanthorn doth the horned moon present; +Myself the man i' the moon do seem to be. + + + +THESEUS +This is the greatest error of all the rest: the man +should be put into the lanthorn. How is it else the +man i' the moon? + + + +DEMETRIUS +He dares not come there for the candle; for, you +see, it is already in snuff. + + + +HIPPOLYTA +I am aweary of this moon: would he would change! + + + +THESEUS +It appears, by his small light of discretion, that +he is in the wane; but yet, in courtesy, in all +reason, we must stay the time. + + + +LYSANDER +Proceed, Moon. + + + +Moonshine +All that I have to say, is, to tell you that the +lanthorn is the moon; I, the man in the moon; this +thorn-bush, my thorn-bush; and this dog, my dog. + + + +DEMETRIUS +Why, all these should be in the lanthorn; for all +these are in the moon. But, silence! here comes Thisbe. + + + +Enter Thisbe + + +Thisbe +This is old Ninny's tomb. Where is my love? + + + +Lion +Roaring Oh-- + + + +Thisbe runs off + + +DEMETRIUS +Well roared, Lion. + + + +THESEUS +Well run, Thisbe. + + + +HIPPOLYTA +Well shone, Moon. Truly, the moon shines with a +good grace. + + + +The Lion shakes Thisbe's mantle, and exit + + +THESEUS +Well moused, Lion. + + + +LYSANDER +And so the lion vanished. + + + +DEMETRIUS +And then came Pyramus. + + + +Enter Pyramus + + +Pyramus +Sweet Moon, I thank thee for thy sunny beams; +I thank thee, Moon, for shining now so bright; +For, by thy gracious, golden, glittering gleams, +I trust to take of truest Thisby sight. +But stay, O spite! +But mark, poor knight, +What dreadful dole is here! +Eyes, do you see? +How can it be? +O dainty duck! O dear! +Thy mantle good, +What, stain'd with blood! +Approach, ye Furies fell! +O Fates, come, come, +Cut thread and thrum; +Quail, crush, conclude, and quell! + + + +THESEUS +This passion, and the death of a dear friend, would +go near to make a man look sad. + + + +HIPPOLYTA +Beshrew my heart, but I pity the man. + + + +Pyramus +O wherefore, Nature, didst thou lions frame? +Since lion vile hath here deflower'd my dear: +Which is--no, no--which was the fairest dame +That lived, that loved, that liked, that look'd +with cheer. +Come, tears, confound; +Out, sword, and wound +The pap of Pyramus; +Ay, that left pap, +Where heart doth hop: +Stabs himself +Thus die I, thus, thus, thus. +Now am I dead, +Now am I fled; +My soul is in the sky: +Tongue, lose thy light; +Moon take thy flight: +Exit Moonshine +Now die, die, die, die, die. + + + +Dies + + +DEMETRIUS +No die, but an ace, for him; for he is but one. + + + +LYSANDER +Less than an ace, man; for he is dead; he is nothing. + + + +THESEUS +With the help of a surgeon he might yet recover, and +prove an ass. + + + +HIPPOLYTA +How chance Moonshine is gone before Thisbe comes +back and finds her lover? + + + +THESEUS +She will find him by starlight. Here she comes; and +her passion ends the play. + + + +Re-enter Thisbe + + +HIPPOLYTA +Methinks she should not use a long one for such a +Pyramus: I hope she will be brief. + + + +DEMETRIUS +A mote will turn the balance, which Pyramus, which +Thisbe, is the better; he for a man, God warrant us; +she for a woman, God bless us. + + + +LYSANDER +She hath spied him already with those sweet eyes. + + + +DEMETRIUS +And thus she means, videlicet:-- + + + +Thisbe +Asleep, my love? +What, dead, my dove? +O Pyramus, arise! +Speak, speak. Quite dumb? +Dead, dead? A tomb +Must cover thy sweet eyes. +These My lips, +This cherry nose, +These yellow cowslip cheeks, +Are gone, are gone: +Lovers, make moan: +His eyes were green as leeks. +O Sisters Three, +Come, come to me, +With hands as pale as milk; +Lay them in gore, +Since you have shore +With shears his thread of silk. +Tongue, not a word: +Come, trusty sword; +Come, blade, my breast imbrue: +Stabs herself +And, farewell, friends; +Thus Thisby ends: +Adieu, adieu, adieu. + + + +Dies + + +THESEUS +Moonshine and Lion are left to bury the dead. + + + +DEMETRIUS +Ay, and Wall too. + + + +BOTTOM +Starting up No assure you; the wall is down that +parted their fathers. Will it please you to see the +epilogue, or to hear a Bergomask dance between two +of our company? + + + +THESEUS +No epilogue, I pray you; for your play needs no +excuse. Never excuse; for when the players are all +dead, there needs none to be blamed. Marry, if he +that writ it had played Pyramus and hanged himself +in Thisbe's garter, it would have been a fine +tragedy: and so it is, truly; and very notably +discharged. But come, your Bergomask: let your +epilogue alone. +A dance +The iron tongue of midnight hath told twelve: +Lovers, to bed; 'tis almost fairy time. +I fear we shall out-sleep the coming morn +As much as we this night have overwatch'd. +This palpable-gross play hath well beguiled +The heavy gait of night. Sweet friends, to bed. +A fortnight hold we this solemnity, +In nightly revels and new jollity. + + +Exeunt +Enter PUCK + + +PUCK +Now the hungry lion roars, +And the wolf behowls the moon; +Whilst the heavy ploughman snores, +All with weary task fordone. +Now the wasted brands do glow, +Whilst the screech-owl, screeching loud, +Puts the wretch that lies in woe +In remembrance of a shroud. +Now it is the time of night +That the graves all gaping wide, +Every one lets forth his sprite, +In the church-way paths to glide: +And we fairies, that do run +By the triple Hecate's team, +From the presence of the sun, +Following darkness like a dream, +Now are frolic: not a mouse +Shall disturb this hallow'd house: +I am sent with broom before, +To sweep the dust behind the door. + + + +Enter OBERON and TITANIA with their train + + +OBERON +Through the house give gathering light, +By the dead and drowsy fire: +Every elf and fairy sprite +Hop as light as bird from brier; +And this ditty, after me, +Sing, and dance it trippingly. + + + +TITANIA +First, rehearse your song by rote +To each word a warbling note: +Hand in hand, with fairy grace, +Will we sing, and bless this place. + + + +Song and dance + + +OBERON +Now, until the break of day, +Through this house each fairy stray. +To the best bride-bed will we, +Which by us shall blessed be; +And the issue there create +Ever shall be fortunate. +So shall all the couples three +Ever true in loving be; +And the blots of Nature's hand +Shall not in their issue stand; +Never mole, hare lip, nor scar, +Nor mark prodigious, such as are +Despised in nativity, +Shall upon their children be. +With this field-dew consecrate, +Every fairy take his gait; +And each several chamber bless, +Through this palace, with sweet peace; +And the owner of it blest +Ever shall in safety rest. +Trip away; make no stay; +Meet me all by break of day. + + + +Exeunt OBERON, TITANIA, and train + + +PUCK +If we shadows have offended, +Think but this, and all is mended, +That you have but slumber'd here +While these visions did appear. +And this weak and idle theme, +No more yielding but a dream, +Gentles, do not reprehend: +if you pardon, we will mend: +And, as I am an honest Puck, +If we have unearned luck +Now to 'scape the serpent's tongue, +We will make amends ere long; +Else the Puck a liar call; +So, good night unto you all. +Give me your hands, if we be friends, +And Robin shall restore amends. + + + +
diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/resources/utf8testverify.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/resources/utf8testverify.xml --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/resources/utf8testverify.xml 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/resources/utf8testverify.xml 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,11 @@ + + + The world has many languages + Мир имеет много языков + el mundo tiene muchos idiomas + 世界有很多语言 + <Русский название="name" ценность="value"><имеет> + <汉语 名字="name" 价值="value">世界有很多语言 + "Mëtæl!" + <ä>Umlaut Element + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/resources/utf8test.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/resources/utf8test.xml --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/resources/utf8test.xml 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/resources/utf8test.xml 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,11 @@ + + + The world has many languages + Мир имеет много языков + el mundo tiene muchos idiomas + 世界有很多语言 + <Русский название="name" ценность="value"><имеет> + <汉语 名字="name" 价值="value">世界有很多语言 + "Mëtæl!" + <ä>Umlaut Element + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/setversion.py xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/setversion.py --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/setversion.py 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/setversion.py 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,107 @@ +# Python program to set the version. +############################################## + +import re +import sys + +def fileProcess( name, lineFunction ): + filestream = open( name, 'r' ) + if filestream.closed: + print( "file " + name + " not open." ) + return + + output = "" + print( "--- Processing " + name + " ---------" ) + while 1: + line = filestream.readline() + if not line: break + output += lineFunction( line ) + filestream.close() + + if not output: return # basic error checking + + print( "Writing file " + name ) + filestream = open( name, "w" ); + filestream.write( output ); + filestream.close() + + +def echoInput( line ): + return line + +major = input( "Major: " ) +minor = input( "Minor: " ) +build = input( "Build: " ) + +print "Setting dox,tinyxml2.h" +print "Version: " + `major` + "." + `minor` + "." + `build` + +#### Write the tinyxml.h #### + +def engineRule( line ): + + matchMajor = "static const int TIXML2_MAJOR_VERSION" + matchMinor = "static const int TIXML2_MINOR_VERSION" + matchBuild = "static const int TIXML2_PATCH_VERSION" + + if line[0:len(matchMajor)] == matchMajor: + print "1)tinyxml2.h Major found" + return matchMajor + " = " + `major` + ";\n" + + elif line[0:len(matchMinor)] == matchMinor: + print "2)tinyxml2.h Minor found" + return matchMinor + " = " + `minor` + ";\n" + + elif line[0:len(matchBuild)] == matchBuild: + print "3)tinyxml2.h Build found" + return matchBuild + " = " + `build` + ";\n" + + else: + return line; + +fileProcess( "tinyxml2.h", engineRule ) + + +#### Write the dox #### + +def doxRule( line ): + + match = "PROJECT_NUMBER" + + if line[0:len( match )] == match: + print "dox project found" + return "PROJECT_NUMBER = " + `major` + "." + `minor` + "." + `build` + "\n" + + else: + return line; + +fileProcess( "dox", doxRule ) + + +#### Write the CMakeLists.txt #### + +def cmakeRule1( line ): + + matchVersion = "set(GENERIC_LIB_VERSION" + + if line[0:len(matchVersion)] == matchVersion: + print "1)tinyxml2.h Major found" + return matchVersion + " \"" + `major` + "." + `minor` + "." + `build` + "\")" + "\n" + + else: + return line; + +fileProcess( "CMakeLists.txt", cmakeRule1 ) + +def cmakeRule2( line ): + + matchSoversion = "set(GENERIC_LIB_SOVERSION" + + if line[0:len(matchSoversion)] == matchSoversion: + print "1)tinyxml2.h Major found" + return matchSoversion + " \"" + `major` + "\")" + "\n" + + else: + return line; + +fileProcess( "CMakeLists.txt", cmakeRule2 ) diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/tinyxml2/tinyxml2.vcxproj xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/tinyxml2/tinyxml2.vcxproj --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/tinyxml2/tinyxml2.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/tinyxml2/tinyxml2.vcxproj 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,89 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {D1C528B6-AA02-4D29-9D61-DC08E317A70D} + Win32Proj + tinyxml2 + + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + true + Unicode + + + + + + + + + + + + + true + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDebug + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + + + Console + true + true + true + + + + + + + + + + + + + + \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/tinyxml2/tinyxml2.vcxproj.filters xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/tinyxml2/tinyxml2.vcxproj.filters --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/tinyxml2/tinyxml2.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/tinyxml2/tinyxml2.vcxproj.filters 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/tinyxml2/tinyxml2.xcodeproj/project.pbxproj xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/tinyxml2/tinyxml2.xcodeproj/project.pbxproj --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/tinyxml2/tinyxml2.xcodeproj/project.pbxproj 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/tinyxml2/tinyxml2.xcodeproj/project.pbxproj 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,204 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 037AE8A5151E692700E0F29F /* xmltest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 037AE8A3151E692700E0F29F /* xmltest.cpp */; }; + 03F28B53152E9B1B00D4CD90 /* tinyxml2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 03F28B4A152E9B1B00D4CD90 /* tinyxml2.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 037AE86D151E685F00E0F29F /* xmltest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = xmltest; sourceTree = BUILT_PRODUCTS_DIR; }; + 037AE8A3151E692700E0F29F /* xmltest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = xmltest.cpp; path = ../xmltest.cpp; sourceTree = SOURCE_ROOT; }; + 03F28B4A152E9B1B00D4CD90 /* tinyxml2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinyxml2.cpp; sourceTree = ""; }; + 03F28B4B152E9B1B00D4CD90 /* tinyxml2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tinyxml2.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 037AE86B151E685F00E0F29F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 037AE056151CCC5200E0F29F = { + isa = PBXGroup; + children = ( + 037AE069151CCC7000E0F29F /* Classes */, + 03F28B60152E9B4C00D4CD90 /* Libraries */, + 037AE06F151CCCB900E0F29F /* Products */, + ); + sourceTree = ""; + }; + 037AE069151CCC7000E0F29F /* Classes */ = { + isa = PBXGroup; + children = ( + 037AE8A3151E692700E0F29F /* xmltest.cpp */, + ); + name = Classes; + sourceTree = ""; + }; + 037AE06F151CCCB900E0F29F /* Products */ = { + isa = PBXGroup; + children = ( + 037AE86D151E685F00E0F29F /* xmltest */, + ); + name = Products; + sourceTree = ""; + }; + 03F28AD7152E9B1B00D4CD90 /* tinyxml2 */ = { + isa = PBXGroup; + children = ( + 03F28B4A152E9B1B00D4CD90 /* tinyxml2.cpp */, + 03F28B4B152E9B1B00D4CD90 /* tinyxml2.h */, + ); + name = tinyxml2; + path = ..; + sourceTree = SOURCE_ROOT; + }; + 03F28B60152E9B4C00D4CD90 /* Libraries */ = { + isa = PBXGroup; + children = ( + 03F28AD7152E9B1B00D4CD90 /* tinyxml2 */, + ); + name = Libraries; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 037AE86C151E685F00E0F29F /* xmltest */ = { + isa = PBXNativeTarget; + buildConfigurationList = 037AE873151E687E00E0F29F /* Build configuration list for PBXNativeTarget "xmltest" */; + buildPhases = ( + 037AE86A151E685F00E0F29F /* Sources */, + 037AE86B151E685F00E0F29F /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = xmltest; + productName = tinyxml2; + productReference = 037AE86D151E685F00E0F29F /* xmltest */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 037AE058151CCC5200E0F29F /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 037AE05B151CCC5200E0F29F /* Build configuration list for PBXProject "tinyxml2" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + English, + Japanese, + French, + German, + ); + mainGroup = 037AE056151CCC5200E0F29F; + productRefGroup = 037AE06F151CCCB900E0F29F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 037AE86C151E685F00E0F29F /* xmltest */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 037AE86A151E685F00E0F29F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 037AE8A5151E692700E0F29F /* xmltest.cpp in Sources */, + 03F28B53152E9B1B00D4CD90 /* tinyxml2.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 037AE059151CCC5200E0F29F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CONFIGURATION_BUILD_DIR = "$(SYMROOT)/Debug"; + COPY_PHASE_STRIP = NO; + SYMROOT = build; + }; + name = Debug; + }; + 037AE05A151CCC5200E0F29F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + }; + name = Release; + }; + 037AE86F151E686000E0F29F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CONFIGURATION_BUILD_DIR = ..; + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + INSTALL_PATH = /usr/local/bin; + PREBINDING = NO; + PRODUCT_NAME = xmltest; + }; + name = Debug; + }; + 037AE870151E686000E0F29F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CONFIGURATION_BUILD_DIR = ..; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_MODEL_TUNING = G5; + INSTALL_PATH = /usr/local/bin; + PREBINDING = NO; + PRODUCT_NAME = tinyxml2; + ZERO_LINK = NO; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 037AE05B151CCC5200E0F29F /* Build configuration list for PBXProject "tinyxml2" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 037AE059151CCC5200E0F29F /* Debug */, + 037AE05A151CCC5200E0F29F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 037AE873151E687E00E0F29F /* Build configuration list for PBXNativeTarget "xmltest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 037AE86F151E686000E0F29F /* Debug */, + 037AE870151E686000E0F29F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 037AE058151CCC5200E0F29F /* Project object */; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/tinyxml2.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/tinyxml2.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/tinyxml2.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/tinyxml2.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,2095 @@ +/* +Original code by Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#include "tinyxml2.h" + +#include // yes, this one new style header, is in the Android SDK. +# ifdef ANDROID_NDK +# include +#else +# include +#endif + +static const char LINE_FEED = (char)0x0a; // all line endings are normalized to LF +static const char LF = LINE_FEED; +static const char CARRIAGE_RETURN = (char)0x0d; // CR gets filtered out +static const char CR = CARRIAGE_RETURN; +static const char SINGLE_QUOTE = '\''; +static const char DOUBLE_QUOTE = '\"'; + +// Bunch of unicode info at: +// http://www.unicode.org/faq/utf_bom.html +// ef bb bf (Microsoft "lead bytes") - designates UTF-8 + +static const unsigned char TIXML_UTF_LEAD_0 = 0xefU; +static const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; +static const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; + + +#define DELETE_NODE( node ) { \ + if ( node ) { \ + MemPool* pool = node->_memPool; \ + node->~XMLNode(); \ + pool->Free( node ); \ + } \ + } +#define DELETE_ATTRIBUTE( attrib ) { \ + if ( attrib ) { \ + MemPool* pool = attrib->_memPool; \ + attrib->~XMLAttribute(); \ + pool->Free( attrib ); \ + } \ + } + +namespace tinyxml2 +{ + +struct Entity { + const char* pattern; + int length; + char value; +}; + +static const int NUM_ENTITIES = 5; +static const Entity entities[NUM_ENTITIES] = { + { "quot", 4, DOUBLE_QUOTE }, + { "amp", 3, '&' }, + { "apos", 4, SINGLE_QUOTE }, + { "lt", 2, '<' }, + { "gt", 2, '>' } +}; + + +StrPair::~StrPair() +{ + Reset(); +} + + +void StrPair::Reset() +{ + if ( _flags & NEEDS_DELETE ) { + delete [] _start; + } + _flags = 0; + _start = 0; + _end = 0; +} + + +void StrPair::SetStr( const char* str, int flags ) +{ + Reset(); + size_t len = strlen( str ); + _start = new char[ len+1 ]; + memcpy( _start, str, len+1 ); + _end = _start + len; + _flags = flags | NEEDS_DELETE; +} + + +char* StrPair::ParseText( char* p, const char* endTag, int strFlags ) +{ + TIXMLASSERT( endTag && *endTag ); + + char* start = p; // fixme: hides a member + char endChar = *endTag; + size_t length = strlen( endTag ); + + // Inner loop of text parsing. + while ( *p ) { + if ( *p == endChar && strncmp( p, endTag, length ) == 0 ) { + Set( start, p, strFlags ); + return p + length; + } + ++p; + } + return 0; +} + + +char* StrPair::ParseName( char* p ) +{ + char* start = p; + + if ( !start || !(*start) ) { + return 0; + } + + while( *p && ( p == start ? XMLUtil::IsNameStartChar( *p ) : XMLUtil::IsNameChar( *p ) )) { + ++p; + } + + if ( p > start ) { + Set( start, p, 0 ); + return p; + } + return 0; +} + + +void StrPair::CollapseWhitespace() +{ + // Trim leading space. + _start = XMLUtil::SkipWhiteSpace( _start ); + + if ( _start && *_start ) { + char* p = _start; // the read pointer + char* q = _start; // the write pointer + + while( *p ) { + if ( XMLUtil::IsWhiteSpace( *p )) { + p = XMLUtil::SkipWhiteSpace( p ); + if ( *p == 0 ) { + break; // don't write to q; this trims the trailing space. + } + *q = ' '; + ++q; + } + *q = *p; + ++q; + ++p; + } + *q = 0; + } +} + + +const char* StrPair::GetStr() +{ + if ( _flags & NEEDS_FLUSH ) { + *_end = 0; + _flags ^= NEEDS_FLUSH; + + if ( _flags ) { + char* p = _start; // the read pointer + char* q = _start; // the write pointer + + while( p < _end ) { + if ( (_flags & NEEDS_NEWLINE_NORMALIZATION) && *p == CR ) { + // CR-LF pair becomes LF + // CR alone becomes LF + // LF-CR becomes LF + if ( *(p+1) == LF ) { + p += 2; + } + else { + ++p; + } + *q++ = LF; + } + else if ( (_flags & NEEDS_NEWLINE_NORMALIZATION) && *p == LF ) { + if ( *(p+1) == CR ) { + p += 2; + } + else { + ++p; + } + *q++ = LF; + } + else if ( (_flags & NEEDS_ENTITY_PROCESSING) && *p == '&' ) { + // Entities handled by tinyXML2: + // - special entities in the entity table [in/out] + // - numeric character reference [in] + // 中 or 中 + + if ( *(p+1) == '#' ) { + char buf[10] = { 0 }; + int len; + p = const_cast( XMLUtil::GetCharacterRef( p, buf, &len ) ); + for( int i=0; i(p); + // Check for BOM: + if ( *(pu+0) == TIXML_UTF_LEAD_0 + && *(pu+1) == TIXML_UTF_LEAD_1 + && *(pu+2) == TIXML_UTF_LEAD_2 ) { + *bom = true; + p += 3; + } + return p; +} + + +void XMLUtil::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ) +{ + const unsigned long BYTE_MASK = 0xBF; + const unsigned long BYTE_MARK = 0x80; + const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; + + if (input < 0x80) { + *length = 1; + } + else if ( input < 0x800 ) { + *length = 2; + } + else if ( input < 0x10000 ) { + *length = 3; + } + else if ( input < 0x200000 ) { + *length = 4; + } + else { + *length = 0; // This code won't covert this correctly anyway. + return; + } + + output += *length; + + // Scary scary fall throughs. + switch (*length) { + case 4: + --output; + *output = (char)((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + case 3: + --output; + *output = (char)((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + case 2: + --output; + *output = (char)((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + case 1: + --output; + *output = (char)(input | FIRST_BYTE_MARK[*length]); + default: + break; + } +} + + +const char* XMLUtil::GetCharacterRef( const char* p, char* value, int* length ) +{ + // Presume an entity, and pull it out. + *length = 0; + + if ( *(p+1) == '#' && *(p+2) ) { + unsigned long ucs = 0; + ptrdiff_t delta = 0; + unsigned mult = 1; + + if ( *(p+2) == 'x' ) { + // Hexadecimal. + if ( !*(p+3) ) { + return 0; + } + + const char* q = p+3; + q = strchr( q, ';' ); + + if ( !q || !*q ) { + return 0; + } + + delta = q-p; + --q; + + while ( *q != 'x' ) { + if ( *q >= '0' && *q <= '9' ) { + ucs += mult * (*q - '0'); + } + else if ( *q >= 'a' && *q <= 'f' ) { + ucs += mult * (*q - 'a' + 10); + } + else if ( *q >= 'A' && *q <= 'F' ) { + ucs += mult * (*q - 'A' + 10 ); + } + else { + return 0; + } + mult *= 16; + --q; + } + } + else { + // Decimal. + if ( !*(p+2) ) { + return 0; + } + + const char* q = p+2; + q = strchr( q, ';' ); + + if ( !q || !*q ) { + return 0; + } + + delta = q-p; + --q; + + while ( *q != '#' ) { + if ( *q >= '0' && *q <= '9' ) { + ucs += mult * (*q - '0'); + } + else { + return 0; + } + mult *= 10; + --q; + } + } + // convert the UCS to UTF-8 + ConvertUTF32ToUTF8( ucs, value, length ); + return p + delta + 1; + } + return p+1; +} + + +void XMLUtil::ToStr( int v, char* buffer, int bufferSize ) +{ + TIXML_SNPRINTF( buffer, bufferSize, "%d", v ); +} + + +void XMLUtil::ToStr( unsigned v, char* buffer, int bufferSize ) +{ + TIXML_SNPRINTF( buffer, bufferSize, "%u", v ); +} + + +void XMLUtil::ToStr( bool v, char* buffer, int bufferSize ) +{ + TIXML_SNPRINTF( buffer, bufferSize, "%d", v ? 1 : 0 ); +} + + +void XMLUtil::ToStr( float v, char* buffer, int bufferSize ) +{ + TIXML_SNPRINTF( buffer, bufferSize, "%g", v ); +} + + +void XMLUtil::ToStr( double v, char* buffer, int bufferSize ) +{ + TIXML_SNPRINTF( buffer, bufferSize, "%g", v ); +} + + +bool XMLUtil::ToInt( const char* str, int* value ) +{ + if ( TIXML_SSCANF( str, "%d", value ) == 1 ) { + return true; + } + return false; +} + +bool XMLUtil::ToUnsigned( const char* str, unsigned *value ) +{ + if ( TIXML_SSCANF( str, "%u", value ) == 1 ) { + return true; + } + return false; +} + +bool XMLUtil::ToBool( const char* str, bool* value ) +{ + int ival = 0; + if ( ToInt( str, &ival )) { + *value = (ival==0) ? false : true; + return true; + } + if ( StringEqual( str, "true" ) ) { + *value = true; + return true; + } + else if ( StringEqual( str, "false" ) ) { + *value = false; + return true; + } + return false; +} + + +bool XMLUtil::ToFloat( const char* str, float* value ) +{ + if ( TIXML_SSCANF( str, "%f", value ) == 1 ) { + return true; + } + return false; +} + +bool XMLUtil::ToDouble( const char* str, double* value ) +{ + if ( TIXML_SSCANF( str, "%lf", value ) == 1 ) { + return true; + } + return false; +} + + +char* XMLDocument::Identify( char* p, XMLNode** node ) +{ + XMLNode* returnNode = 0; + char* start = p; + p = XMLUtil::SkipWhiteSpace( p ); + if( !p || !*p ) { + return p; + } + + // What is this thing? + // - Elements start with a letter or underscore, but xml is reserved. + // - Comments: + // + // With a special case: + // + // + // + // + // Where the closing element (/foo) *must* be the next thing after the opening + // element, and the names must match. BUT the tricky bit is that the closing + // element will be read by the child. + // + // 'endTag' is the end tag for this node, it is returned by a call to a child. + // 'parentEnd' is the end tag for the parent, which is filled in and returned. + + while( p && *p ) { + XMLNode* node = 0; + + p = _document->Identify( p, &node ); + if ( p == 0 || node == 0 ) { + break; + } + + StrPair endTag; + p = node->ParseDeep( p, &endTag ); + if ( !p ) { + DELETE_NODE( node ); + node = 0; + if ( !_document->Error() ) { + _document->SetError( XML_ERROR_PARSING, 0, 0 ); + } + break; + } + + // We read the end tag. Return it to the parent. + if ( node->ToElement() && node->ToElement()->ClosingType() == XMLElement::CLOSING ) { + if ( parentEnd ) { + *parentEnd = static_cast(node)->_value; + } + node->_memPool->SetTracked(); // created and then immediately deleted. + DELETE_NODE( node ); + return p; + } + + // Handle an end tag returned to this level. + // And handle a bunch of annoying errors. + XMLElement* ele = node->ToElement(); + if ( ele ) { + if ( endTag.Empty() && ele->ClosingType() == XMLElement::OPEN ) { + _document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 ); + p = 0; + } + else if ( !endTag.Empty() && ele->ClosingType() != XMLElement::OPEN ) { + _document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 ); + p = 0; + } + else if ( !endTag.Empty() ) { + if ( !XMLUtil::StringEqual( endTag.GetStr(), node->Value() )) { + _document->SetError( XML_ERROR_MISMATCHED_ELEMENT, node->Value(), 0 ); + p = 0; + } + } + } + if ( p == 0 ) { + DELETE_NODE( node ); + node = 0; + } + if ( node ) { + this->InsertEndChild( node ); + } + } + return 0; +} + +// --------- XMLText ---------- // +char* XMLText::ParseDeep( char* p, StrPair* ) +{ + const char* start = p; + if ( this->CData() ) { + p = _value.ParseText( p, "]]>", StrPair::NEEDS_NEWLINE_NORMALIZATION ); + if ( !p ) { + _document->SetError( XML_ERROR_PARSING_CDATA, start, 0 ); + } + return p; + } + else { + int flags = _document->ProcessEntities() ? StrPair::TEXT_ELEMENT : StrPair::TEXT_ELEMENT_LEAVE_ENTITIES; + if ( _document->WhitespaceMode() == COLLAPSE_WHITESPACE ) { + flags |= StrPair::COLLAPSE_WHITESPACE; + } + + p = _value.ParseText( p, "<", flags ); + if ( !p ) { + _document->SetError( XML_ERROR_PARSING_TEXT, start, 0 ); + } + if ( p && *p ) { + return p-1; + } + } + return 0; +} + + +XMLNode* XMLText::ShallowClone( XMLDocument* doc ) const +{ + if ( !doc ) { + doc = _document; + } + XMLText* text = doc->NewText( Value() ); // fixme: this will always allocate memory. Intern? + text->SetCData( this->CData() ); + return text; +} + + +bool XMLText::ShallowEqual( const XMLNode* compare ) const +{ + return ( compare->ToText() && XMLUtil::StringEqual( compare->ToText()->Value(), Value() )); +} + + +bool XMLText::Accept( XMLVisitor* visitor ) const +{ + return visitor->Visit( *this ); +} + + +// --------- XMLComment ---------- // + +XMLComment::XMLComment( XMLDocument* doc ) : XMLNode( doc ) +{ +} + + +XMLComment::~XMLComment() +{ +} + + +char* XMLComment::ParseDeep( char* p, StrPair* ) +{ + // Comment parses as text. + const char* start = p; + p = _value.ParseText( p, "-->", StrPair::COMMENT ); + if ( p == 0 ) { + _document->SetError( XML_ERROR_PARSING_COMMENT, start, 0 ); + } + return p; +} + + +XMLNode* XMLComment::ShallowClone( XMLDocument* doc ) const +{ + if ( !doc ) { + doc = _document; + } + XMLComment* comment = doc->NewComment( Value() ); // fixme: this will always allocate memory. Intern? + return comment; +} + + +bool XMLComment::ShallowEqual( const XMLNode* compare ) const +{ + return ( compare->ToComment() && XMLUtil::StringEqual( compare->ToComment()->Value(), Value() )); +} + + +bool XMLComment::Accept( XMLVisitor* visitor ) const +{ + return visitor->Visit( *this ); +} + + +// --------- XMLDeclaration ---------- // + +XMLDeclaration::XMLDeclaration( XMLDocument* doc ) : XMLNode( doc ) +{ +} + + +XMLDeclaration::~XMLDeclaration() +{ + //printf( "~XMLDeclaration\n" ); +} + + +char* XMLDeclaration::ParseDeep( char* p, StrPair* ) +{ + // Declaration parses as text. + const char* start = p; + p = _value.ParseText( p, "?>", StrPair::NEEDS_NEWLINE_NORMALIZATION ); + if ( p == 0 ) { + _document->SetError( XML_ERROR_PARSING_DECLARATION, start, 0 ); + } + return p; +} + + +XMLNode* XMLDeclaration::ShallowClone( XMLDocument* doc ) const +{ + if ( !doc ) { + doc = _document; + } + XMLDeclaration* dec = doc->NewDeclaration( Value() ); // fixme: this will always allocate memory. Intern? + return dec; +} + + +bool XMLDeclaration::ShallowEqual( const XMLNode* compare ) const +{ + return ( compare->ToDeclaration() && XMLUtil::StringEqual( compare->ToDeclaration()->Value(), Value() )); +} + + + +bool XMLDeclaration::Accept( XMLVisitor* visitor ) const +{ + return visitor->Visit( *this ); +} + +// --------- XMLUnknown ---------- // + +XMLUnknown::XMLUnknown( XMLDocument* doc ) : XMLNode( doc ) +{ +} + + +XMLUnknown::~XMLUnknown() +{ +} + + +char* XMLUnknown::ParseDeep( char* p, StrPair* ) +{ + // Unknown parses as text. + const char* start = p; + + p = _value.ParseText( p, ">", StrPair::NEEDS_NEWLINE_NORMALIZATION ); + if ( !p ) { + _document->SetError( XML_ERROR_PARSING_UNKNOWN, start, 0 ); + } + return p; +} + + +XMLNode* XMLUnknown::ShallowClone( XMLDocument* doc ) const +{ + if ( !doc ) { + doc = _document; + } + XMLUnknown* text = doc->NewUnknown( Value() ); // fixme: this will always allocate memory. Intern? + return text; +} + + +bool XMLUnknown::ShallowEqual( const XMLNode* compare ) const +{ + return ( compare->ToUnknown() && XMLUtil::StringEqual( compare->ToUnknown()->Value(), Value() )); +} + + +bool XMLUnknown::Accept( XMLVisitor* visitor ) const +{ + return visitor->Visit( *this ); +} + +// --------- XMLAttribute ---------- // +char* XMLAttribute::ParseDeep( char* p, bool processEntities ) +{ + // Parse using the name rules: bug fix, was using ParseText before + p = _name.ParseName( p ); + if ( !p || !*p ) { + return 0; + } + + // Skip white space before = + p = XMLUtil::SkipWhiteSpace( p ); + if ( !p || *p != '=' ) { + return 0; + } + + ++p; // move up to opening quote + p = XMLUtil::SkipWhiteSpace( p ); + if ( *p != '\"' && *p != '\'' ) { + return 0; + } + + char endTag[2] = { *p, 0 }; + ++p; // move past opening quote + + p = _value.ParseText( p, endTag, processEntities ? StrPair::ATTRIBUTE_VALUE : StrPair::ATTRIBUTE_VALUE_LEAVE_ENTITIES ); + return p; +} + + +void XMLAttribute::SetName( const char* n ) +{ + _name.SetStr( n ); +} + + +XMLError XMLAttribute::QueryIntValue( int* value ) const +{ + if ( XMLUtil::ToInt( Value(), value )) { + return XML_NO_ERROR; + } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +XMLError XMLAttribute::QueryUnsignedValue( unsigned int* value ) const +{ + if ( XMLUtil::ToUnsigned( Value(), value )) { + return XML_NO_ERROR; + } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +XMLError XMLAttribute::QueryBoolValue( bool* value ) const +{ + if ( XMLUtil::ToBool( Value(), value )) { + return XML_NO_ERROR; + } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +XMLError XMLAttribute::QueryFloatValue( float* value ) const +{ + if ( XMLUtil::ToFloat( Value(), value )) { + return XML_NO_ERROR; + } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +XMLError XMLAttribute::QueryDoubleValue( double* value ) const +{ + if ( XMLUtil::ToDouble( Value(), value )) { + return XML_NO_ERROR; + } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +void XMLAttribute::SetAttribute( const char* v ) +{ + _value.SetStr( v ); +} + + +void XMLAttribute::SetAttribute( int v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + _value.SetStr( buf ); +} + + +void XMLAttribute::SetAttribute( unsigned v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + _value.SetStr( buf ); +} + + +void XMLAttribute::SetAttribute( bool v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + _value.SetStr( buf ); +} + +void XMLAttribute::SetAttribute( double v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + _value.SetStr( buf ); +} + +void XMLAttribute::SetAttribute( float v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + _value.SetStr( buf ); +} + + +// --------- XMLElement ---------- // +XMLElement::XMLElement( XMLDocument* doc ) : XMLNode( doc ), + _closingType( 0 ), + _rootAttribute( 0 ) +{ +} + + +XMLElement::~XMLElement() +{ + while( _rootAttribute ) { + XMLAttribute* next = _rootAttribute->_next; + DELETE_ATTRIBUTE( _rootAttribute ); + _rootAttribute = next; + } +} + + +XMLAttribute* XMLElement::FindAttribute( const char* name ) +{ + XMLAttribute* a = 0; + for( a=_rootAttribute; a; a = a->_next ) { + if ( XMLUtil::StringEqual( a->Name(), name ) ) { + return a; + } + } + return 0; +} + + +const XMLAttribute* XMLElement::FindAttribute( const char* name ) const +{ + XMLAttribute* a = 0; + for( a=_rootAttribute; a; a = a->_next ) { + if ( XMLUtil::StringEqual( a->Name(), name ) ) { + return a; + } + } + return 0; +} + + +const char* XMLElement::Attribute( const char* name, const char* value ) const +{ + const XMLAttribute* a = FindAttribute( name ); + if ( !a ) { + return 0; + } + if ( !value || XMLUtil::StringEqual( a->Value(), value )) { + return a->Value(); + } + return 0; +} + + +const char* XMLElement::GetText() const +{ + if ( FirstChild() && FirstChild()->ToText() ) { + return FirstChild()->ToText()->Value(); + } + return 0; +} + + +XMLError XMLElement::QueryIntText( int* ival ) const +{ + if ( FirstChild() && FirstChild()->ToText() ) { + const char* t = FirstChild()->ToText()->Value(); + if ( XMLUtil::ToInt( t, ival ) ) { + return XML_SUCCESS; + } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + +XMLError XMLElement::QueryUnsignedText( unsigned* uval ) const +{ + if ( FirstChild() && FirstChild()->ToText() ) { + const char* t = FirstChild()->ToText()->Value(); + if ( XMLUtil::ToUnsigned( t, uval ) ) { + return XML_SUCCESS; + } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + +XMLError XMLElement::QueryBoolText( bool* bval ) const +{ + if ( FirstChild() && FirstChild()->ToText() ) { + const char* t = FirstChild()->ToText()->Value(); + if ( XMLUtil::ToBool( t, bval ) ) { + return XML_SUCCESS; + } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + +XMLError XMLElement::QueryDoubleText( double* dval ) const +{ + if ( FirstChild() && FirstChild()->ToText() ) { + const char* t = FirstChild()->ToText()->Value(); + if ( XMLUtil::ToDouble( t, dval ) ) { + return XML_SUCCESS; + } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + +XMLError XMLElement::QueryFloatText( float* fval ) const +{ + if ( FirstChild() && FirstChild()->ToText() ) { + const char* t = FirstChild()->ToText()->Value(); + if ( XMLUtil::ToFloat( t, fval ) ) { + return XML_SUCCESS; + } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + + +XMLAttribute* XMLElement::FindOrCreateAttribute( const char* name ) +{ + XMLAttribute* last = 0; + XMLAttribute* attrib = 0; + for( attrib = _rootAttribute; + attrib; + last = attrib, attrib = attrib->_next ) { + if ( XMLUtil::StringEqual( attrib->Name(), name ) ) { + break; + } + } + if ( !attrib ) { + attrib = new (_document->_attributePool.Alloc() ) XMLAttribute(); + attrib->_memPool = &_document->_attributePool; + if ( last ) { + last->_next = attrib; + } + else { + _rootAttribute = attrib; + } + attrib->SetName( name ); + attrib->_memPool->SetTracked(); // always created and linked. + } + return attrib; +} + + +void XMLElement::DeleteAttribute( const char* name ) +{ + XMLAttribute* prev = 0; + for( XMLAttribute* a=_rootAttribute; a; a=a->_next ) { + if ( XMLUtil::StringEqual( name, a->Name() ) ) { + if ( prev ) { + prev->_next = a->_next; + } + else { + _rootAttribute = a->_next; + } + DELETE_ATTRIBUTE( a ); + break; + } + prev = a; + } +} + + +char* XMLElement::ParseAttributes( char* p ) +{ + const char* start = p; + XMLAttribute* prevAttribute = 0; + + // Read the attributes. + while( p ) { + p = XMLUtil::SkipWhiteSpace( p ); + if ( !p || !(*p) ) { + _document->SetError( XML_ERROR_PARSING_ELEMENT, start, Name() ); + return 0; + } + + // attribute. + if (XMLUtil::IsNameStartChar( *p ) ) { + XMLAttribute* attrib = new (_document->_attributePool.Alloc() ) XMLAttribute(); + attrib->_memPool = &_document->_attributePool; + attrib->_memPool->SetTracked(); + + p = attrib->ParseDeep( p, _document->ProcessEntities() ); + if ( !p || Attribute( attrib->Name() ) ) { + DELETE_ATTRIBUTE( attrib ); + _document->SetError( XML_ERROR_PARSING_ATTRIBUTE, start, p ); + return 0; + } + // There is a minor bug here: if the attribute in the source xml + // document is duplicated, it will not be detected and the + // attribute will be doubly added. However, tracking the 'prevAttribute' + // avoids re-scanning the attribute list. Preferring performance for + // now, may reconsider in the future. + if ( prevAttribute ) { + prevAttribute->_next = attrib; + } + else { + _rootAttribute = attrib; + } + prevAttribute = attrib; + } + // end of the tag + else if ( *p == '/' && *(p+1) == '>' ) { + _closingType = CLOSED; + return p+2; // done; sealed element. + } + // end of the tag + else if ( *p == '>' ) { + ++p; + break; + } + else { + _document->SetError( XML_ERROR_PARSING_ELEMENT, start, p ); + return 0; + } + } + return p; +} + + +// +// +// foobar +// +char* XMLElement::ParseDeep( char* p, StrPair* strPair ) +{ + // Read the element name. + p = XMLUtil::SkipWhiteSpace( p ); + if ( !p ) { + return 0; + } + + // The closing element is the form. It is + // parsed just like a regular element then deleted from + // the DOM. + if ( *p == '/' ) { + _closingType = CLOSING; + ++p; + } + + p = _value.ParseName( p ); + if ( _value.Empty() ) { + return 0; + } + + p = ParseAttributes( p ); + if ( !p || !*p || _closingType ) { + return p; + } + + p = XMLNode::ParseDeep( p, strPair ); + return p; +} + + + +XMLNode* XMLElement::ShallowClone( XMLDocument* doc ) const +{ + if ( !doc ) { + doc = _document; + } + XMLElement* element = doc->NewElement( Value() ); // fixme: this will always allocate memory. Intern? + for( const XMLAttribute* a=FirstAttribute(); a; a=a->Next() ) { + element->SetAttribute( a->Name(), a->Value() ); // fixme: this will always allocate memory. Intern? + } + return element; +} + + +bool XMLElement::ShallowEqual( const XMLNode* compare ) const +{ + const XMLElement* other = compare->ToElement(); + if ( other && XMLUtil::StringEqual( other->Value(), Value() )) { + + const XMLAttribute* a=FirstAttribute(); + const XMLAttribute* b=other->FirstAttribute(); + + while ( a && b ) { + if ( !XMLUtil::StringEqual( a->Value(), b->Value() ) ) { + return false; + } + a = a->Next(); + b = b->Next(); + } + if ( a || b ) { + // different count + return false; + } + return true; + } + return false; +} + + +bool XMLElement::Accept( XMLVisitor* visitor ) const +{ + if ( visitor->VisitEnter( *this, _rootAttribute ) ) { + for ( const XMLNode* node=FirstChild(); node; node=node->NextSibling() ) { + if ( !node->Accept( visitor ) ) { + break; + } + } + } + return visitor->VisitExit( *this ); +} + + +// --------- XMLDocument ----------- // +XMLDocument::XMLDocument( bool processEntities, Whitespace whitespace ) : + XMLNode( 0 ), + _writeBOM( false ), + _processEntities( processEntities ), + _errorID( XML_NO_ERROR ), + _whitespace( whitespace ), + _errorStr1( 0 ), + _errorStr2( 0 ), + _charBuffer( 0 ) +{ + _document = this; // avoid warning about 'this' in initializer list +} + + +XMLDocument::~XMLDocument() +{ + DeleteChildren(); + delete [] _charBuffer; + +#if 0 + _textPool.Trace( "text" ); + _elementPool.Trace( "element" ); + _commentPool.Trace( "comment" ); + _attributePool.Trace( "attribute" ); +#endif + +#ifdef DEBUG + if ( Error() == false ) { + TIXMLASSERT( _elementPool.CurrentAllocs() == _elementPool.Untracked() ); + TIXMLASSERT( _attributePool.CurrentAllocs() == _attributePool.Untracked() ); + TIXMLASSERT( _textPool.CurrentAllocs() == _textPool.Untracked() ); + TIXMLASSERT( _commentPool.CurrentAllocs() == _commentPool.Untracked() ); + } +#endif +} + + +void XMLDocument::Clear() +{ + DeleteChildren(); + + _errorID = XML_NO_ERROR; + _errorStr1 = 0; + _errorStr2 = 0; + + delete [] _charBuffer; + _charBuffer = 0; +} + + +XMLElement* XMLDocument::NewElement( const char* name ) +{ + XMLElement* ele = new (_elementPool.Alloc()) XMLElement( this ); + ele->_memPool = &_elementPool; + ele->SetName( name ); + return ele; +} + + +XMLComment* XMLDocument::NewComment( const char* str ) +{ + XMLComment* comment = new (_commentPool.Alloc()) XMLComment( this ); + comment->_memPool = &_commentPool; + comment->SetValue( str ); + return comment; +} + + +XMLText* XMLDocument::NewText( const char* str ) +{ + XMLText* text = new (_textPool.Alloc()) XMLText( this ); + text->_memPool = &_textPool; + text->SetValue( str ); + return text; +} + + +XMLDeclaration* XMLDocument::NewDeclaration( const char* str ) +{ + XMLDeclaration* dec = new (_commentPool.Alloc()) XMLDeclaration( this ); + dec->_memPool = &_commentPool; + dec->SetValue( str ? str : "xml version=\"1.0\" encoding=\"UTF-8\"" ); + return dec; +} + + +XMLUnknown* XMLDocument::NewUnknown( const char* str ) +{ + XMLUnknown* unk = new (_commentPool.Alloc()) XMLUnknown( this ); + unk->_memPool = &_commentPool; + unk->SetValue( str ); + return unk; +} + + +XMLError XMLDocument::LoadFile( const char* filename ) +{ + Clear(); + FILE* fp = 0; + +#if defined(_MSC_VER) && (_MSC_VER >= 1400 ) + errno_t err = fopen_s(&fp, filename, "rb" ); + if ( !fp || err) { +#else + fp = fopen( filename, "rb" ); + if ( !fp) { +#endif + SetError( XML_ERROR_FILE_NOT_FOUND, filename, 0 ); + return _errorID; + } + LoadFile( fp ); + fclose( fp ); + return _errorID; +} + + +XMLError XMLDocument::LoadFile( FILE* fp ) +{ + Clear(); + + fseek( fp, 0, SEEK_END ); + size_t size = ftell( fp ); + fseek( fp, 0, SEEK_SET ); + + if ( size == 0 ) { + return _errorID; + } + + _charBuffer = new char[size+1]; + size_t read = fread( _charBuffer, 1, size, fp ); + if ( read != size ) { + SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 ); + return _errorID; + } + + _charBuffer[size] = 0; + + const char* p = _charBuffer; + p = XMLUtil::SkipWhiteSpace( p ); + p = XMLUtil::ReadBOM( p, &_writeBOM ); + if ( !p || !*p ) { + SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 ); + return _errorID; + } + + ParseDeep( _charBuffer + (p-_charBuffer), 0 ); + return _errorID; +} + + +XMLError XMLDocument::SaveFile( const char* filename, bool compact ) +{ + FILE* fp = 0; +#if defined(_MSC_VER) && (_MSC_VER >= 1400 ) + errno_t err = fopen_s(&fp, filename, "w" ); + if ( !fp || err) { +#else + fp = fopen( filename, "w" ); + if ( !fp) { +#endif + SetError( XML_ERROR_FILE_COULD_NOT_BE_OPENED, filename, 0 ); + return _errorID; + } + SaveFile(fp, compact); + fclose( fp ); + return _errorID; +} + + +XMLError XMLDocument::SaveFile( FILE* fp, bool compact ) +{ + XMLPrinter stream( fp, compact ); + Print( &stream ); + return _errorID; +} + + +XMLError XMLDocument::Parse( const char* p, size_t len ) +{ + Clear(); + + if ( !p || !*p ) { + SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 ); + return _errorID; + } + if ( len == (size_t)(-1) ) { + len = strlen( p ); + } + _charBuffer = new char[ len+1 ]; + memcpy( _charBuffer, p, len ); + _charBuffer[len] = 0; + + p = XMLUtil::SkipWhiteSpace( p ); + p = XMLUtil::ReadBOM( p, &_writeBOM ); + if ( !p || !*p ) { + SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 ); + return _errorID; + } + + ParseDeep( _charBuffer, 0 ); + return _errorID; +} + + +void XMLDocument::Print( XMLPrinter* streamer ) +{ + XMLPrinter stdStreamer( stdout ); + if ( !streamer ) { + streamer = &stdStreamer; + } + Accept( streamer ); +} + + +void XMLDocument::SetError( XMLError error, const char* str1, const char* str2 ) +{ + _errorID = error; + _errorStr1 = str1; + _errorStr2 = str2; +} + + +void XMLDocument::PrintError() const +{ + if ( _errorID ) { + static const int LEN = 20; + char buf1[LEN] = { 0 }; + char buf2[LEN] = { 0 }; + + if ( _errorStr1 ) { + TIXML_SNPRINTF( buf1, LEN, "%s", _errorStr1 ); + } + if ( _errorStr2 ) { + TIXML_SNPRINTF( buf2, LEN, "%s", _errorStr2 ); + } + + printf( "XMLDocument error id=%d str1=%s str2=%s\n", + _errorID, buf1, buf2 ); + } +} + + +XMLPrinter::XMLPrinter( FILE* file, bool compact ) : + _elementJustOpened( false ), + _firstElement( true ), + _fp( file ), + _depth( 0 ), + _textDepth( -1 ), + _processEntities( true ), + _compactMode( compact ) +{ + for( int i=0; i'] = true; // not required, but consistency is nice + _buffer.Push( 0 ); +} + + +void XMLPrinter::Print( const char* format, ... ) +{ + va_list va; + va_start( va, format ); + + if ( _fp ) { + vfprintf( _fp, format, va ); + } + else { + // This seems brutally complex. Haven't figured out a better + // way on windows. +#ifdef _MSC_VER + int len = -1; + int expand = 1000; + while ( len < 0 ) { + len = vsnprintf_s( _accumulator.Mem(), _accumulator.Capacity(), _TRUNCATE, format, va ); + if ( len < 0 ) { + expand *= 3/2; + _accumulator.PushArr( expand ); + } + } + char* p = _buffer.PushArr( len ) - 1; + memcpy( p, _accumulator.Mem(), len+1 ); +#else + int len = vsnprintf( 0, 0, format, va ); + // Close out and re-start the va-args + va_end( va ); + va_start( va, format ); + char* p = _buffer.PushArr( len ) - 1; + vsnprintf( p, len+1, format, va ); +#endif + } + va_end( va ); +} + + +void XMLPrinter::PrintSpace( int depth ) +{ + for( int i=0; i 0 && *q < ENTITY_RANGE ) { + // Check for entities. If one is found, flush + // the stream up until the entity, write the + // entity, and keep looking. + if ( flag[(unsigned)(*q)] ) { + while ( p < q ) { + Print( "%c", *p ); + ++p; + } + for( int i=0; i 0) ) { + Print( "%s", p ); + } +} + + +void XMLPrinter::PushHeader( bool writeBOM, bool writeDec ) +{ + static const unsigned char bom[] = { TIXML_UTF_LEAD_0, TIXML_UTF_LEAD_1, TIXML_UTF_LEAD_2, 0 }; + if ( writeBOM ) { + Print( "%s", bom ); + } + if ( writeDec ) { + PushDeclaration( "xml version=\"1.0\"" ); + } +} + + +void XMLPrinter::OpenElement( const char* name ) +{ + if ( _elementJustOpened ) { + SealElement(); + } + _stack.Push( name ); + + if ( _textDepth < 0 && !_firstElement && !_compactMode ) { + Print( "\n" ); + PrintSpace( _depth ); + } + + Print( "<%s", name ); + _elementJustOpened = true; + _firstElement = false; + ++_depth; +} + + +void XMLPrinter::PushAttribute( const char* name, const char* value ) +{ + TIXMLASSERT( _elementJustOpened ); + Print( " %s=\"", name ); + PrintString( value, false ); + Print( "\"" ); +} + + +void XMLPrinter::PushAttribute( const char* name, int v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + PushAttribute( name, buf ); +} + + +void XMLPrinter::PushAttribute( const char* name, unsigned v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + PushAttribute( name, buf ); +} + + +void XMLPrinter::PushAttribute( const char* name, bool v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + PushAttribute( name, buf ); +} + + +void XMLPrinter::PushAttribute( const char* name, double v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + PushAttribute( name, buf ); +} + + +void XMLPrinter::CloseElement() +{ + --_depth; + const char* name = _stack.Pop(); + + if ( _elementJustOpened ) { + Print( "/>" ); + } + else { + if ( _textDepth < 0 && !_compactMode) { + Print( "\n" ); + PrintSpace( _depth ); + } + Print( "", name ); + } + + if ( _textDepth == _depth ) { + _textDepth = -1; + } + if ( _depth == 0 && !_compactMode) { + Print( "\n" ); + } + _elementJustOpened = false; +} + + +void XMLPrinter::SealElement() +{ + _elementJustOpened = false; + Print( ">" ); +} + + +void XMLPrinter::PushText( const char* text, bool cdata ) +{ + _textDepth = _depth-1; + + if ( _elementJustOpened ) { + SealElement(); + } + if ( cdata ) { + Print( "" ); + } + else { + PrintString( text, true ); + } +} + +void XMLPrinter::PushText( int value ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( value, buf, BUF_SIZE ); + PushText( buf, false ); +} + + +void XMLPrinter::PushText( unsigned value ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( value, buf, BUF_SIZE ); + PushText( buf, false ); +} + + +void XMLPrinter::PushText( bool value ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( value, buf, BUF_SIZE ); + PushText( buf, false ); +} + + +void XMLPrinter::PushText( float value ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( value, buf, BUF_SIZE ); + PushText( buf, false ); +} + + +void XMLPrinter::PushText( double value ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( value, buf, BUF_SIZE ); + PushText( buf, false ); +} + + +void XMLPrinter::PushComment( const char* comment ) +{ + if ( _elementJustOpened ) { + SealElement(); + } + if ( _textDepth < 0 && !_firstElement && !_compactMode) { + Print( "\n" ); + PrintSpace( _depth ); + } + _firstElement = false; + Print( "", comment ); +} + + +void XMLPrinter::PushDeclaration( const char* value ) +{ + if ( _elementJustOpened ) { + SealElement(); + } + if ( _textDepth < 0 && !_firstElement && !_compactMode) { + Print( "\n" ); + PrintSpace( _depth ); + } + _firstElement = false; + Print( "", value ); +} + + +void XMLPrinter::PushUnknown( const char* value ) +{ + if ( _elementJustOpened ) { + SealElement(); + } + if ( _textDepth < 0 && !_firstElement && !_compactMode) { + Print( "\n" ); + PrintSpace( _depth ); + } + _firstElement = false; + Print( "", value ); +} + + +bool XMLPrinter::VisitEnter( const XMLDocument& doc ) +{ + _processEntities = doc.ProcessEntities(); + if ( doc.HasBOM() ) { + PushHeader( true, false ); + } + return true; +} + + +bool XMLPrinter::VisitEnter( const XMLElement& element, const XMLAttribute* attribute ) +{ + OpenElement( element.Name() ); + while ( attribute ) { + PushAttribute( attribute->Name(), attribute->Value() ); + attribute = attribute->Next(); + } + return true; +} + + +bool XMLPrinter::VisitExit( const XMLElement& ) +{ + CloseElement(); + return true; +} + + +bool XMLPrinter::Visit( const XMLText& text ) +{ + PushText( text.Value(), text.CData() ); + return true; +} + + +bool XMLPrinter::Visit( const XMLComment& comment ) +{ + PushComment( comment.Value() ); + return true; +} + +bool XMLPrinter::Visit( const XMLDeclaration& declaration ) +{ + PushDeclaration( declaration.Value() ); + return true; +} + + +bool XMLPrinter::Visit( const XMLUnknown& unknown ) +{ + PushUnknown( unknown.Value() ); + return true; +} + +} // namespace tinyxml2 + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/tinyxml2.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/tinyxml2.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/tinyxml2.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/tinyxml2.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,1968 @@ +/* +Original code by Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#ifndef TINYXML2_INCLUDED +#define TINYXML2_INCLUDED + +#if defined(ANDROID_NDK) || defined(__BORLANDC__) +# include +# include +# include +# include +# include +# include +#else +# include +# include +# include +# include +# include +# include +#endif + +/* + TODO: intern strings instead of allocation. +*/ +/* + gcc: + g++ -Wall -DDEBUG tinyxml2.cpp xmltest.cpp -o gccxmltest.exe + + Formatting, Artistic Style: + AStyle.exe --style=1tbs --indent-switches --break-closing-brackets --indent-preprocessor tinyxml2.cpp tinyxml2.h +*/ + +#if defined( _DEBUG ) || defined( DEBUG ) || defined (__DEBUG__) +# ifndef DEBUG +# define DEBUG +# endif +#endif + + +#if defined(DEBUG) +# if defined(_MSC_VER) +# define TIXMLASSERT( x ) if ( !(x)) { __debugbreak(); } //if ( !(x)) WinDebugBreak() +# elif defined (ANDROID_NDK) +# include +# define TIXMLASSERT( x ) if ( !(x)) { __android_log_assert( "assert", "grinliz", "ASSERT in '%s' at %d.", __FILE__, __LINE__ ); } +# else +# include +# define TIXMLASSERT assert +# endif +# else +# define TIXMLASSERT( x ) {} +#endif + + +#if defined(_MSC_VER) && (_MSC_VER >= 1400 ) +// Microsoft visual studio, version 2005 and higher. +/*int _snprintf_s( + char *buffer, + size_t sizeOfBuffer, + size_t count, + const char *format [, + argument] ... +);*/ +inline int TIXML_SNPRINTF( char* buffer, size_t size, const char* format, ... ) +{ + va_list va; + va_start( va, format ); + int result = vsnprintf_s( buffer, size, _TRUNCATE, format, va ); + va_end( va ); + return result; +} +#define TIXML_SSCANF sscanf_s +#else +// GCC version 3 and higher +//#warning( "Using sn* functions." ) +#define TIXML_SNPRINTF snprintf +#define TIXML_SSCANF sscanf +#endif + +static const int TIXML2_MAJOR_VERSION = 1; +static const int TIXML2_MINOR_VERSION = 0; +static const int TIXML2_PATCH_VERSION = 11; + +namespace tinyxml2 +{ +class XMLDocument; +class XMLElement; +class XMLAttribute; +class XMLComment; +class XMLNode; +class XMLText; +class XMLDeclaration; +class XMLUnknown; + +class XMLPrinter; + +/* + A class that wraps strings. Normally stores the start and end + pointers into the XML file itself, and will apply normalization + and entity translation if actually read. Can also store (and memory + manage) a traditional char[] +*/ +class StrPair +{ +public: + enum { + NEEDS_ENTITY_PROCESSING = 0x01, + NEEDS_NEWLINE_NORMALIZATION = 0x02, + COLLAPSE_WHITESPACE = 0x04, + + TEXT_ELEMENT = NEEDS_ENTITY_PROCESSING | NEEDS_NEWLINE_NORMALIZATION, + TEXT_ELEMENT_LEAVE_ENTITIES = NEEDS_NEWLINE_NORMALIZATION, + ATTRIBUTE_NAME = 0, + ATTRIBUTE_VALUE = NEEDS_ENTITY_PROCESSING | NEEDS_NEWLINE_NORMALIZATION, + ATTRIBUTE_VALUE_LEAVE_ENTITIES = NEEDS_NEWLINE_NORMALIZATION, + COMMENT = NEEDS_NEWLINE_NORMALIZATION + }; + + StrPair() : _flags( 0 ), _start( 0 ), _end( 0 ) {} + ~StrPair(); + + void Set( char* start, char* end, int flags ) { + Reset(); + _start = start; + _end = end; + _flags = flags | NEEDS_FLUSH; + } + + const char* GetStr(); + + bool Empty() const { + return _start == _end; + } + + void SetInternedStr( const char* str ) { + Reset(); + _start = const_cast(str); + } + + void SetStr( const char* str, int flags=0 ); + + char* ParseText( char* in, const char* endTag, int strFlags ); + char* ParseName( char* in ); + +private: + void Reset(); + void CollapseWhitespace(); + + enum { + NEEDS_FLUSH = 0x100, + NEEDS_DELETE = 0x200 + }; + + // After parsing, if *_end != 0, it can be set to zero. + int _flags; + char* _start; + char* _end; +}; + + +/* + A dynamic array of Plain Old Data. Doesn't support constructors, etc. + Has a small initial memory pool, so that low or no usage will not + cause a call to new/delete +*/ +template +class DynArray +{ +public: + DynArray< T, INIT >() { + _mem = _pool; + _allocated = INIT; + _size = 0; + } + + ~DynArray() { + if ( _mem != _pool ) { + delete [] _mem; + } + } + + void Push( T t ) { + EnsureCapacity( _size+1 ); + _mem[_size++] = t; + } + + T* PushArr( int count ) { + EnsureCapacity( _size+count ); + T* ret = &_mem[_size]; + _size += count; + return ret; + } + + T Pop() { + return _mem[--_size]; + } + + void PopArr( int count ) { + TIXMLASSERT( _size >= count ); + _size -= count; + } + + bool Empty() const { + return _size == 0; + } + + T& operator[](int i) { + TIXMLASSERT( i>= 0 && i < _size ); + return _mem[i]; + } + + const T& operator[](int i) const { + TIXMLASSERT( i>= 0 && i < _size ); + return _mem[i]; + } + + int Size() const { + return _size; + } + + int Capacity() const { + return _allocated; + } + + const T* Mem() const { + return _mem; + } + + T* Mem() { + return _mem; + } + +private: + void EnsureCapacity( int cap ) { + if ( cap > _allocated ) { + int newAllocated = cap * 2; + T* newMem = new T[newAllocated]; + memcpy( newMem, _mem, sizeof(T)*_size ); // warning: not using constructors, only works for PODs + if ( _mem != _pool ) { + delete [] _mem; + } + _mem = newMem; + _allocated = newAllocated; + } + } + + T* _mem; + T _pool[INIT]; + int _allocated; // objects allocated + int _size; // number objects in use +}; + + +/* + Parent virtual class of a pool for fast allocation + and deallocation of objects. +*/ +class MemPool +{ +public: + MemPool() {} + virtual ~MemPool() {} + + virtual int ItemSize() const = 0; + virtual void* Alloc() = 0; + virtual void Free( void* ) = 0; + virtual void SetTracked() = 0; +}; + + +/* + Template child class to create pools of the correct type. +*/ +template< int SIZE > +class MemPoolT : public MemPool +{ +public: + MemPoolT() : _root(0), _currentAllocs(0), _nAllocs(0), _maxAllocs(0), _nUntracked(0) {} + ~MemPoolT() { + // Delete the blocks. + for( int i=0; i<_blockPtrs.Size(); ++i ) { + delete _blockPtrs[i]; + } + } + + virtual int ItemSize() const { + return SIZE; + } + int CurrentAllocs() const { + return _currentAllocs; + } + + virtual void* Alloc() { + if ( !_root ) { + // Need a new block. + Block* block = new Block(); + _blockPtrs.Push( block ); + + for( int i=0; ichunk[i].next = &block->chunk[i+1]; + } + block->chunk[COUNT-1].next = 0; + _root = block->chunk; + } + void* result = _root; + _root = _root->next; + + ++_currentAllocs; + if ( _currentAllocs > _maxAllocs ) { + _maxAllocs = _currentAllocs; + } + _nAllocs++; + _nUntracked++; + return result; + } + virtual void Free( void* mem ) { + if ( !mem ) { + return; + } + --_currentAllocs; + Chunk* chunk = (Chunk*)mem; +#ifdef DEBUG + memset( chunk, 0xfe, sizeof(Chunk) ); +#endif + chunk->next = _root; + _root = chunk; + } + void Trace( const char* name ) { + printf( "Mempool %s watermark=%d [%dk] current=%d size=%d nAlloc=%d blocks=%d\n", + name, _maxAllocs, _maxAllocs*SIZE/1024, _currentAllocs, SIZE, _nAllocs, _blockPtrs.Size() ); + } + + void SetTracked() { + _nUntracked--; + } + + int Untracked() const { + return _nUntracked; + } + + // This number is perf sensitive. 4k seems like a good tradeoff on my machine. + // The test file is large, 170k. + // Release: VS2010 gcc(no opt) + // 1k: 4000 + // 2k: 4000 + // 4k: 3900 21000 + // 16k: 5200 + // 32k: 4300 + // 64k: 4000 21000 + enum { COUNT = (4*1024)/SIZE }; // Some compilers do not accept to use COUNT in private part if COUNT is private + +private: + union Chunk { + Chunk* next; + char mem[SIZE]; + }; + struct Block { + Chunk chunk[COUNT]; + }; + DynArray< Block*, 10 > _blockPtrs; + Chunk* _root; + + int _currentAllocs; + int _nAllocs; + int _maxAllocs; + int _nUntracked; +}; + + + +/** + Implements the interface to the "Visitor pattern" (see the Accept() method.) + If you call the Accept() method, it requires being passed a XMLVisitor + class to handle callbacks. For nodes that contain other nodes (Document, Element) + you will get called with a VisitEnter/VisitExit pair. Nodes that are always leafs + are simply called with Visit(). + + If you return 'true' from a Visit method, recursive parsing will continue. If you return + false, no children of this node or its siblings will be visited. + + All flavors of Visit methods have a default implementation that returns 'true' (continue + visiting). You need to only override methods that are interesting to you. + + Generally Accept() is called on the TiXmlDocument, although all nodes support visiting. + + You should never change the document from a callback. + + @sa XMLNode::Accept() +*/ +class XMLVisitor +{ +public: + virtual ~XMLVisitor() {} + + /// Visit a document. + virtual bool VisitEnter( const XMLDocument& /*doc*/ ) { + return true; + } + /// Visit a document. + virtual bool VisitExit( const XMLDocument& /*doc*/ ) { + return true; + } + + /// Visit an element. + virtual bool VisitEnter( const XMLElement& /*element*/, const XMLAttribute* /*firstAttribute*/ ) { + return true; + } + /// Visit an element. + virtual bool VisitExit( const XMLElement& /*element*/ ) { + return true; + } + + /// Visit a declaration. + virtual bool Visit( const XMLDeclaration& /*declaration*/ ) { + return true; + } + /// Visit a text node. + virtual bool Visit( const XMLText& /*text*/ ) { + return true; + } + /// Visit a comment node. + virtual bool Visit( const XMLComment& /*comment*/ ) { + return true; + } + /// Visit an unknown node. + virtual bool Visit( const XMLUnknown& /*unknown*/ ) { + return true; + } +}; + + +/* + Utility functionality. +*/ +class XMLUtil +{ +public: + // Anything in the high order range of UTF-8 is assumed to not be whitespace. This isn't + // correct, but simple, and usually works. + static const char* SkipWhiteSpace( const char* p ) { + while( !IsUTF8Continuation(*p) && isspace( *reinterpret_cast(p) ) ) { + ++p; + } + return p; + } + static char* SkipWhiteSpace( char* p ) { + while( !IsUTF8Continuation(*p) && isspace( *reinterpret_cast(p) ) ) { + ++p; + } + return p; + } + static bool IsWhiteSpace( char p ) { + return !IsUTF8Continuation(p) && isspace( static_cast(p) ); + } + + inline static bool IsNameStartChar( unsigned char ch ) { + return ( ( ch < 128 ) ? isalpha( ch ) : 1 ) + || ch == ':' + || ch == '_'; + } + + inline static bool IsNameChar( unsigned char ch ) { + return IsNameStartChar( ch ) + || isdigit( ch ) + || ch == '.' + || ch == '-'; + } + + inline static bool StringEqual( const char* p, const char* q, int nChar=INT_MAX ) { + int n = 0; + if ( p == q ) { + return true; + } + while( *p && *q && *p == *q && n(const_cast(this)->FirstChildElement( value )); + } + + /// Get the last child node, or null if none exists. + const XMLNode* LastChild() const { + return _lastChild; + } + + XMLNode* LastChild() { + return const_cast(const_cast(this)->LastChild() ); + } + + /** Get the last child element or optionally the last child + element with the specified name. + */ + const XMLElement* LastChildElement( const char* value=0 ) const; + + XMLElement* LastChildElement( const char* value=0 ) { + return const_cast(const_cast(this)->LastChildElement(value) ); + } + + /// Get the previous (left) sibling node of this node. + const XMLNode* PreviousSibling() const { + return _prev; + } + + XMLNode* PreviousSibling() { + return _prev; + } + + /// Get the previous (left) sibling element of this node, with an optionally supplied name. + const XMLElement* PreviousSiblingElement( const char* value=0 ) const ; + + XMLElement* PreviousSiblingElement( const char* value=0 ) { + return const_cast(const_cast(this)->PreviousSiblingElement( value ) ); + } + + /// Get the next (right) sibling node of this node. + const XMLNode* NextSibling() const { + return _next; + } + + XMLNode* NextSibling() { + return _next; + } + + /// Get the next (right) sibling element of this node, with an optionally supplied name. + const XMLElement* NextSiblingElement( const char* value=0 ) const; + + XMLElement* NextSiblingElement( const char* value=0 ) { + return const_cast(const_cast(this)->NextSiblingElement( value ) ); + } + + /** + Add a child node as the last (right) child. + */ + XMLNode* InsertEndChild( XMLNode* addThis ); + + XMLNode* LinkEndChild( XMLNode* addThis ) { + return InsertEndChild( addThis ); + } + /** + Add a child node as the first (left) child. + */ + XMLNode* InsertFirstChild( XMLNode* addThis ); + /** + Add a node after the specified child node. + */ + XMLNode* InsertAfterChild( XMLNode* afterThis, XMLNode* addThis ); + + /** + Delete all the children of this node. + */ + void DeleteChildren(); + + /** + Delete a child of this node. + */ + void DeleteChild( XMLNode* node ); + + /** + Make a copy of this node, but not its children. + You may pass in a Document pointer that will be + the owner of the new Node. If the 'document' is + null, then the node returned will be allocated + from the current Document. (this->GetDocument()) + + Note: if called on a XMLDocument, this will return null. + */ + virtual XMLNode* ShallowClone( XMLDocument* document ) const = 0; + + /** + Test if 2 nodes are the same, but don't test children. + The 2 nodes do not need to be in the same Document. + + Note: if called on a XMLDocument, this will return false. + */ + virtual bool ShallowEqual( const XMLNode* compare ) const = 0; + + /** Accept a hierarchical visit of the nodes in the TinyXML DOM. Every node in the + XML tree will be conditionally visited and the host will be called back + via the TiXmlVisitor interface. + + This is essentially a SAX interface for TinyXML. (Note however it doesn't re-parse + the XML for the callbacks, so the performance of TinyXML is unchanged by using this + interface versus any other.) + + The interface has been based on ideas from: + + - http://www.saxproject.org/ + - http://c2.com/cgi/wiki?HierarchicalVisitorPattern + + Which are both good references for "visiting". + + An example of using Accept(): + @verbatim + TiXmlPrinter printer; + tinyxmlDoc.Accept( &printer ); + const char* xmlcstr = printer.CStr(); + @endverbatim + */ + virtual bool Accept( XMLVisitor* visitor ) const = 0; + + // internal + virtual char* ParseDeep( char*, StrPair* ); + +protected: + XMLNode( XMLDocument* ); + virtual ~XMLNode(); + XMLNode( const XMLNode& ); // not supported + XMLNode& operator=( const XMLNode& ); // not supported + + XMLDocument* _document; + XMLNode* _parent; + mutable StrPair _value; + + XMLNode* _firstChild; + XMLNode* _lastChild; + + XMLNode* _prev; + XMLNode* _next; + +private: + MemPool* _memPool; + void Unlink( XMLNode* child ); +}; + + +/** XML text. + + Note that a text node can have child element nodes, for example: + @verbatim + This is bold + @endverbatim + + A text node can have 2 ways to output the next. "normal" output + and CDATA. It will default to the mode it was parsed from the XML file and + you generally want to leave it alone, but you can change the output mode with + SetCDATA() and query it with CDATA(). +*/ +class XMLText : public XMLNode +{ + friend class XMLBase; + friend class XMLDocument; +public: + virtual bool Accept( XMLVisitor* visitor ) const; + + virtual XMLText* ToText() { + return this; + } + virtual const XMLText* ToText() const { + return this; + } + + /// Declare whether this should be CDATA or standard text. + void SetCData( bool isCData ) { + _isCData = isCData; + } + /// Returns true if this is a CDATA text element. + bool CData() const { + return _isCData; + } + + char* ParseDeep( char*, StrPair* endTag ); + virtual XMLNode* ShallowClone( XMLDocument* document ) const; + virtual bool ShallowEqual( const XMLNode* compare ) const; + +protected: + XMLText( XMLDocument* doc ) : XMLNode( doc ), _isCData( false ) {} + virtual ~XMLText() {} + XMLText( const XMLText& ); // not supported + XMLText& operator=( const XMLText& ); // not supported + +private: + bool _isCData; +}; + + +/** An XML Comment. */ +class XMLComment : public XMLNode +{ + friend class XMLDocument; +public: + virtual XMLComment* ToComment() { + return this; + } + virtual const XMLComment* ToComment() const { + return this; + } + + virtual bool Accept( XMLVisitor* visitor ) const; + + char* ParseDeep( char*, StrPair* endTag ); + virtual XMLNode* ShallowClone( XMLDocument* document ) const; + virtual bool ShallowEqual( const XMLNode* compare ) const; + +protected: + XMLComment( XMLDocument* doc ); + virtual ~XMLComment(); + XMLComment( const XMLComment& ); // not supported + XMLComment& operator=( const XMLComment& ); // not supported + +private: +}; + + +/** In correct XML the declaration is the first entry in the file. + @verbatim + + @endverbatim + + TinyXML2 will happily read or write files without a declaration, + however. + + The text of the declaration isn't interpreted. It is parsed + and written as a string. +*/ +class XMLDeclaration : public XMLNode +{ + friend class XMLDocument; +public: + virtual XMLDeclaration* ToDeclaration() { + return this; + } + virtual const XMLDeclaration* ToDeclaration() const { + return this; + } + + virtual bool Accept( XMLVisitor* visitor ) const; + + char* ParseDeep( char*, StrPair* endTag ); + virtual XMLNode* ShallowClone( XMLDocument* document ) const; + virtual bool ShallowEqual( const XMLNode* compare ) const; + +protected: + XMLDeclaration( XMLDocument* doc ); + virtual ~XMLDeclaration(); + XMLDeclaration( const XMLDeclaration& ); // not supported + XMLDeclaration& operator=( const XMLDeclaration& ); // not supported +}; + + +/** Any tag that tinyXml doesn't recognize is saved as an + unknown. It is a tag of text, but should not be modified. + It will be written back to the XML, unchanged, when the file + is saved. + + DTD tags get thrown into TiXmlUnknowns. +*/ +class XMLUnknown : public XMLNode +{ + friend class XMLDocument; +public: + virtual XMLUnknown* ToUnknown() { + return this; + } + virtual const XMLUnknown* ToUnknown() const { + return this; + } + + virtual bool Accept( XMLVisitor* visitor ) const; + + char* ParseDeep( char*, StrPair* endTag ); + virtual XMLNode* ShallowClone( XMLDocument* document ) const; + virtual bool ShallowEqual( const XMLNode* compare ) const; + +protected: + XMLUnknown( XMLDocument* doc ); + virtual ~XMLUnknown(); + XMLUnknown( const XMLUnknown& ); // not supported + XMLUnknown& operator=( const XMLUnknown& ); // not supported +}; + + +enum XMLError { + XML_NO_ERROR = 0, + XML_SUCCESS = 0, + + XML_NO_ATTRIBUTE, + XML_WRONG_ATTRIBUTE_TYPE, + + XML_ERROR_FILE_NOT_FOUND, + XML_ERROR_FILE_COULD_NOT_BE_OPENED, + XML_ERROR_FILE_READ_ERROR, + XML_ERROR_ELEMENT_MISMATCH, + XML_ERROR_PARSING_ELEMENT, + XML_ERROR_PARSING_ATTRIBUTE, + XML_ERROR_IDENTIFYING_TAG, + XML_ERROR_PARSING_TEXT, + XML_ERROR_PARSING_CDATA, + XML_ERROR_PARSING_COMMENT, + XML_ERROR_PARSING_DECLARATION, + XML_ERROR_PARSING_UNKNOWN, + XML_ERROR_EMPTY_DOCUMENT, + XML_ERROR_MISMATCHED_ELEMENT, + XML_ERROR_PARSING, + + XML_CAN_NOT_CONVERT_TEXT, + XML_NO_TEXT_NODE +}; + + +/** An attribute is a name-value pair. Elements have an arbitrary + number of attributes, each with a unique name. + + @note The attributes are not XMLNodes. You may only query the + Next() attribute in a list. +*/ +class XMLAttribute +{ + friend class XMLElement; +public: + /// The name of the attribute. + const char* Name() const { + return _name.GetStr(); + } + /// The value of the attribute. + const char* Value() const { + return _value.GetStr(); + } + /// The next attribute in the list. + const XMLAttribute* Next() const { + return _next; + } + + /** IntAttribute interprets the attribute as an integer, and returns the value. + If the value isn't an integer, 0 will be returned. There is no error checking; + use QueryIntAttribute() if you need error checking. + */ + int IntValue() const { + int i=0; + QueryIntValue( &i ); + return i; + } + /// Query as an unsigned integer. See IntAttribute() + unsigned UnsignedValue() const { + unsigned i=0; + QueryUnsignedValue( &i ); + return i; + } + /// Query as a boolean. See IntAttribute() + bool BoolValue() const { + bool b=false; + QueryBoolValue( &b ); + return b; + } + /// Query as a double. See IntAttribute() + double DoubleValue() const { + double d=0; + QueryDoubleValue( &d ); + return d; + } + /// Query as a float. See IntAttribute() + float FloatValue() const { + float f=0; + QueryFloatValue( &f ); + return f; + } + + /** QueryIntAttribute interprets the attribute as an integer, and returns the value + in the provided parameter. The function will return XML_NO_ERROR on success, + and XML_WRONG_ATTRIBUTE_TYPE if the conversion is not successful. + */ + XMLError QueryIntValue( int* value ) const; + /// See QueryIntAttribute + XMLError QueryUnsignedValue( unsigned int* value ) const; + /// See QueryIntAttribute + XMLError QueryBoolValue( bool* value ) const; + /// See QueryIntAttribute + XMLError QueryDoubleValue( double* value ) const; + /// See QueryIntAttribute + XMLError QueryFloatValue( float* value ) const; + + /// Set the attribute to a string value. + void SetAttribute( const char* value ); + /// Set the attribute to value. + void SetAttribute( int value ); + /// Set the attribute to value. + void SetAttribute( unsigned value ); + /// Set the attribute to value. + void SetAttribute( bool value ); + /// Set the attribute to value. + void SetAttribute( double value ); + /// Set the attribute to value. + void SetAttribute( float value ); + +private: + enum { BUF_SIZE = 200 }; + + XMLAttribute() : _next( 0 ) {} + virtual ~XMLAttribute() {} + + XMLAttribute( const XMLAttribute& ); // not supported + void operator=( const XMLAttribute& ); // not supported + void SetName( const char* name ); + + char* ParseDeep( char* p, bool processEntities ); + + mutable StrPair _name; + mutable StrPair _value; + XMLAttribute* _next; + MemPool* _memPool; +}; + + +/** The element is a container class. It has a value, the element name, + and can contain other elements, text, comments, and unknowns. + Elements also contain an arbitrary number of attributes. +*/ +class XMLElement : public XMLNode +{ + friend class XMLBase; + friend class XMLDocument; +public: + /// Get the name of an element (which is the Value() of the node.) + const char* Name() const { + return Value(); + } + /// Set the name of the element. + void SetName( const char* str, bool staticMem=false ) { + SetValue( str, staticMem ); + } + + virtual XMLElement* ToElement() { + return this; + } + virtual const XMLElement* ToElement() const { + return this; + } + virtual bool Accept( XMLVisitor* visitor ) const; + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none + exists. For example: + + @verbatim + const char* value = ele->Attribute( "foo" ); + @endverbatim + + The 'value' parameter is normally null. However, if specified, + the attribute will only be returned if the 'name' and 'value' + match. This allow you to write code: + + @verbatim + if ( ele->Attribute( "foo", "bar" ) ) callFooIsBar(); + @endverbatim + + rather than: + @verbatim + if ( ele->Attribute( "foo" ) ) { + if ( strcmp( ele->Attribute( "foo" ), "bar" ) == 0 ) callFooIsBar(); + } + @endverbatim + */ + const char* Attribute( const char* name, const char* value=0 ) const; + + /** Given an attribute name, IntAttribute() returns the value + of the attribute interpreted as an integer. 0 will be + returned if there is an error. For a method with error + checking, see QueryIntAttribute() + */ + int IntAttribute( const char* name ) const { + int i=0; + QueryIntAttribute( name, &i ); + return i; + } + /// See IntAttribute() + unsigned UnsignedAttribute( const char* name ) const { + unsigned i=0; + QueryUnsignedAttribute( name, &i ); + return i; + } + /// See IntAttribute() + bool BoolAttribute( const char* name ) const { + bool b=false; + QueryBoolAttribute( name, &b ); + return b; + } + /// See IntAttribute() + double DoubleAttribute( const char* name ) const { + double d=0; + QueryDoubleAttribute( name, &d ); + return d; + } + /// See IntAttribute() + float FloatAttribute( const char* name ) const { + float f=0; + QueryFloatAttribute( name, &f ); + return f; + } + + /** Given an attribute name, QueryIntAttribute() returns + XML_NO_ERROR, XML_WRONG_ATTRIBUTE_TYPE if the conversion + can't be performed, or XML_NO_ATTRIBUTE if the attribute + doesn't exist. If successful, the result of the conversion + will be written to 'value'. If not successful, nothing will + be written to 'value'. This allows you to provide default + value: + + @verbatim + int value = 10; + QueryIntAttribute( "foo", &value ); // if "foo" isn't found, value will still be 10 + @endverbatim + */ + XMLError QueryIntAttribute( const char* name, int* value ) const { + const XMLAttribute* a = FindAttribute( name ); + if ( !a ) { + return XML_NO_ATTRIBUTE; + } + return a->QueryIntValue( value ); + } + /// See QueryIntAttribute() + XMLError QueryUnsignedAttribute( const char* name, unsigned int* value ) const { + const XMLAttribute* a = FindAttribute( name ); + if ( !a ) { + return XML_NO_ATTRIBUTE; + } + return a->QueryUnsignedValue( value ); + } + /// See QueryIntAttribute() + XMLError QueryBoolAttribute( const char* name, bool* value ) const { + const XMLAttribute* a = FindAttribute( name ); + if ( !a ) { + return XML_NO_ATTRIBUTE; + } + return a->QueryBoolValue( value ); + } + /// See QueryIntAttribute() + XMLError QueryDoubleAttribute( const char* name, double* value ) const { + const XMLAttribute* a = FindAttribute( name ); + if ( !a ) { + return XML_NO_ATTRIBUTE; + } + return a->QueryDoubleValue( value ); + } + /// See QueryIntAttribute() + XMLError QueryFloatAttribute( const char* name, float* value ) const { + const XMLAttribute* a = FindAttribute( name ); + if ( !a ) { + return XML_NO_ATTRIBUTE; + } + return a->QueryFloatValue( value ); + } + + + /** Given an attribute name, QueryAttribute() returns + XML_NO_ERROR, XML_WRONG_ATTRIBUTE_TYPE if the conversion + can't be performed, or XML_NO_ATTRIBUTE if the attribute + doesn't exist. It is overloaded for the primitive types, + and is a generally more convenient replacement of + QueryIntAttribute() and related functions. + + If successful, the result of the conversion + will be written to 'value'. If not successful, nothing will + be written to 'value'. This allows you to provide default + value: + + @verbatim + int value = 10; + QueryAttribute( "foo", &value ); // if "foo" isn't found, value will still be 10 + @endverbatim + */ + int QueryAttribute( const char* name, int* value ) const { + return QueryIntAttribute( name, value ); + } + + int QueryAttribute( const char* name, unsigned int* value ) const { + return QueryUnsignedAttribute( name, value ); + } + + int QueryAttribute( const char* name, bool* value ) const { + return QueryBoolAttribute( name, value ); + } + + int QueryAttribute( const char* name, double* value ) const { + return QueryDoubleAttribute( name, value ); + } + + int QueryAttribute( const char* name, float* value ) const { + return QueryFloatAttribute( name, value ); + } + + /// Sets the named attribute to value. + void SetAttribute( const char* name, const char* value ) { + XMLAttribute* a = FindOrCreateAttribute( name ); + a->SetAttribute( value ); + } + /// Sets the named attribute to value. + void SetAttribute( const char* name, int value ) { + XMLAttribute* a = FindOrCreateAttribute( name ); + a->SetAttribute( value ); + } + /// Sets the named attribute to value. + void SetAttribute( const char* name, unsigned value ) { + XMLAttribute* a = FindOrCreateAttribute( name ); + a->SetAttribute( value ); + } + /// Sets the named attribute to value. + void SetAttribute( const char* name, bool value ) { + XMLAttribute* a = FindOrCreateAttribute( name ); + a->SetAttribute( value ); + } + /// Sets the named attribute to value. + void SetAttribute( const char* name, double value ) { + XMLAttribute* a = FindOrCreateAttribute( name ); + a->SetAttribute( value ); + } + + /** + Delete an attribute. + */ + void DeleteAttribute( const char* name ); + + /// Return the first attribute in the list. + const XMLAttribute* FirstAttribute() const { + return _rootAttribute; + } + /// Query a specific attribute in the list. + const XMLAttribute* FindAttribute( const char* name ) const; + + /** Convenience function for easy access to the text inside an element. Although easy + and concise, GetText() is limited compared to getting the TiXmlText child + and accessing it directly. + + If the first child of 'this' is a TiXmlText, the GetText() + returns the character string of the Text node, else null is returned. + + This is a convenient method for getting the text of simple contained text: + @verbatim + This is text + const char* str = fooElement->GetText(); + @endverbatim + + 'str' will be a pointer to "This is text". + + Note that this function can be misleading. If the element foo was created from + this XML: + @verbatim + This is text + @endverbatim + + then the value of str would be null. The first child node isn't a text node, it is + another element. From this XML: + @verbatim + This is text + @endverbatim + GetText() will return "This is ". + */ + const char* GetText() const; + + /** + Convenience method to query the value of a child text node. This is probably best + shown by example. Given you have a document is this form: + @verbatim + + 1 + 1.4 + + @endverbatim + + The QueryIntText() and similar functions provide a safe and easier way to get to the + "value" of x and y. + + @verbatim + int x = 0; + float y = 0; // types of x and y are contrived for example + const XMLElement* xElement = pointElement->FirstChildElement( "x" ); + const XMLElement* yElement = pointElement->FirstChildElement( "y" ); + xElement->QueryIntText( &x ); + yElement->QueryFloatText( &y ); + @endverbatim + + @returns XML_SUCCESS (0) on success, XML_CAN_NOT_CONVERT_TEXT if the text cannot be converted + to the requested type, and XML_NO_TEXT_NODE if there is no child text to query. + + */ + XMLError QueryIntText( int* ival ) const; + /// See QueryIntText() + XMLError QueryUnsignedText( unsigned* uval ) const; + /// See QueryIntText() + XMLError QueryBoolText( bool* bval ) const; + /// See QueryIntText() + XMLError QueryDoubleText( double* dval ) const; + /// See QueryIntText() + XMLError QueryFloatText( float* fval ) const; + + // internal: + enum { + OPEN, // + CLOSED, // + CLOSING // + }; + int ClosingType() const { + return _closingType; + } + char* ParseDeep( char* p, StrPair* endTag ); + virtual XMLNode* ShallowClone( XMLDocument* document ) const; + virtual bool ShallowEqual( const XMLNode* compare ) const; + +private: + XMLElement( XMLDocument* doc ); + virtual ~XMLElement(); + XMLElement( const XMLElement& ); // not supported + void operator=( const XMLElement& ); // not supported + + XMLAttribute* FindAttribute( const char* name ); + XMLAttribute* FindOrCreateAttribute( const char* name ); + //void LinkAttribute( XMLAttribute* attrib ); + char* ParseAttributes( char* p ); + + int _closingType; + // The attribute list is ordered; there is no 'lastAttribute' + // because the list needs to be scanned for dupes before adding + // a new attribute. + XMLAttribute* _rootAttribute; +}; + + +enum Whitespace { + PRESERVE_WHITESPACE, + COLLAPSE_WHITESPACE +}; + + +/** A Document binds together all the functionality. + It can be saved, loaded, and printed to the screen. + All Nodes are connected and allocated to a Document. + If the Document is deleted, all its Nodes are also deleted. +*/ +class XMLDocument : public XMLNode +{ + friend class XMLElement; +public: + /// constructor + XMLDocument( bool processEntities = true, Whitespace = PRESERVE_WHITESPACE ); + ~XMLDocument(); + + virtual XMLDocument* ToDocument() { + return this; + } + virtual const XMLDocument* ToDocument() const { + return this; + } + + /** + Parse an XML file from a character string. + Returns XML_NO_ERROR (0) on success, or + an errorID. + + You may optionally pass in the 'nBytes', which is + the number of bytes which will be parsed. If not + specified, TinyXML will assume 'xml' points to a + null terminated string. + */ + XMLError Parse( const char* xml, size_t nBytes=(size_t)(-1) ); + + /** + Load an XML file from disk. + Returns XML_NO_ERROR (0) on success, or + an errorID. + */ + XMLError LoadFile( const char* filename ); + + /** + Load an XML file from disk. You are responsible + for providing and closing the FILE*. + + Returns XML_NO_ERROR (0) on success, or + an errorID. + */ + XMLError LoadFile( FILE* ); + + /** + Save the XML file to disk. + Returns XML_NO_ERROR (0) on success, or + an errorID. + */ + XMLError SaveFile( const char* filename, bool compact = false ); + + /** + Save the XML file to disk. You are responsible + for providing and closing the FILE*. + + Returns XML_NO_ERROR (0) on success, or + an errorID. + */ + XMLError SaveFile( FILE* fp, bool compact = false ); + + bool ProcessEntities() const { + return _processEntities; + } + Whitespace WhitespaceMode() const { + return _whitespace; + } + + /** + Returns true if this document has a leading Byte Order Mark of UTF8. + */ + bool HasBOM() const { + return _writeBOM; + } + /** Sets whether to write the BOM when writing the file. + */ + void SetBOM( bool useBOM ) { + _writeBOM = useBOM; + } + + /** Return the root element of DOM. Equivalent to FirstChildElement(). + To get the first node, use FirstChild(). + */ + XMLElement* RootElement() { + return FirstChildElement(); + } + const XMLElement* RootElement() const { + return FirstChildElement(); + } + + /** Print the Document. If the Printer is not provided, it will + print to stdout. If you provide Printer, this can print to a file: + @verbatim + XMLPrinter printer( fp ); + doc.Print( &printer ); + @endverbatim + + Or you can use a printer to print to memory: + @verbatim + XMLPrinter printer; + doc->Print( &printer ); + // printer.CStr() has a const char* to the XML + @endverbatim + */ + void Print( XMLPrinter* streamer=0 ); + virtual bool Accept( XMLVisitor* visitor ) const; + + /** + Create a new Element associated with + this Document. The memory for the Element + is managed by the Document. + */ + XMLElement* NewElement( const char* name ); + /** + Create a new Comment associated with + this Document. The memory for the Comment + is managed by the Document. + */ + XMLComment* NewComment( const char* comment ); + /** + Create a new Text associated with + this Document. The memory for the Text + is managed by the Document. + */ + XMLText* NewText( const char* text ); + /** + Create a new Declaration associated with + this Document. The memory for the object + is managed by the Document. + + If the 'text' param is null, the standard + declaration is used.: + @verbatim + + @endverbatim + */ + XMLDeclaration* NewDeclaration( const char* text=0 ); + /** + Create a new Unknown associated with + this Document. The memory for the object + is managed by the Document. + */ + XMLUnknown* NewUnknown( const char* text ); + + /** + Delete a node associated with this document. + It will be unlinked from the DOM. + */ + void DeleteNode( XMLNode* node ) { + node->_parent->DeleteChild( node ); + } + + void SetError( XMLError error, const char* str1, const char* str2 ); + + /// Return true if there was an error parsing the document. + bool Error() const { + return _errorID != XML_NO_ERROR; + } + /// Return the errorID. + XMLError ErrorID() const { + return _errorID; + } + /// Return a possibly helpful diagnostic location or string. + const char* GetErrorStr1() const { + return _errorStr1; + } + /// Return a possibly helpful secondary diagnostic location or string. + const char* GetErrorStr2() const { + return _errorStr2; + } + /// If there is an error, print it to stdout. + void PrintError() const; + + /// Clear the document, resetting it to the initial state. + void Clear(); + + // internal + char* Identify( char* p, XMLNode** node ); + + virtual XMLNode* ShallowClone( XMLDocument* /*document*/ ) const { + return 0; + } + virtual bool ShallowEqual( const XMLNode* /*compare*/ ) const { + return false; + } + +private: + XMLDocument( const XMLDocument& ); // not supported + void operator=( const XMLDocument& ); // not supported + + bool _writeBOM; + bool _processEntities; + XMLError _errorID; + Whitespace _whitespace; + const char* _errorStr1; + const char* _errorStr2; + char* _charBuffer; + + MemPoolT< sizeof(XMLElement) > _elementPool; + MemPoolT< sizeof(XMLAttribute) > _attributePool; + MemPoolT< sizeof(XMLText) > _textPool; + MemPoolT< sizeof(XMLComment) > _commentPool; +}; + + +/** + A XMLHandle is a class that wraps a node pointer with null checks; this is + an incredibly useful thing. Note that XMLHandle is not part of the TinyXML + DOM structure. It is a separate utility class. + + Take an example: + @verbatim + + + + + + + @endverbatim + + Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very + easy to write a *lot* of code that looks like: + + @verbatim + XMLElement* root = document.FirstChildElement( "Document" ); + if ( root ) + { + XMLElement* element = root->FirstChildElement( "Element" ); + if ( element ) + { + XMLElement* child = element->FirstChildElement( "Child" ); + if ( child ) + { + XMLElement* child2 = child->NextSiblingElement( "Child" ); + if ( child2 ) + { + // Finally do something useful. + @endverbatim + + And that doesn't even cover "else" cases. XMLHandle addresses the verbosity + of such code. A XMLHandle checks for null pointers so it is perfectly safe + and correct to use: + + @verbatim + XMLHandle docHandle( &document ); + XMLElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild().NextSibling().ToElement(); + if ( child2 ) + { + // do something useful + @endverbatim + + Which is MUCH more concise and useful. + + It is also safe to copy handles - internally they are nothing more than node pointers. + @verbatim + XMLHandle handleCopy = handle; + @endverbatim + + See also XMLConstHandle, which is the same as XMLHandle, but operates on const objects. +*/ +class XMLHandle +{ +public: + /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. + XMLHandle( XMLNode* node ) { + _node = node; + } + /// Create a handle from a node. + XMLHandle( XMLNode& node ) { + _node = &node; + } + /// Copy constructor + XMLHandle( const XMLHandle& ref ) { + _node = ref._node; + } + /// Assignment + XMLHandle& operator=( const XMLHandle& ref ) { + _node = ref._node; + return *this; + } + + /// Get the first child of this handle. + XMLHandle FirstChild() { + return XMLHandle( _node ? _node->FirstChild() : 0 ); + } + /// Get the first child element of this handle. + XMLHandle FirstChildElement( const char* value=0 ) { + return XMLHandle( _node ? _node->FirstChildElement( value ) : 0 ); + } + /// Get the last child of this handle. + XMLHandle LastChild() { + return XMLHandle( _node ? _node->LastChild() : 0 ); + } + /// Get the last child element of this handle. + XMLHandle LastChildElement( const char* _value=0 ) { + return XMLHandle( _node ? _node->LastChildElement( _value ) : 0 ); + } + /// Get the previous sibling of this handle. + XMLHandle PreviousSibling() { + return XMLHandle( _node ? _node->PreviousSibling() : 0 ); + } + /// Get the previous sibling element of this handle. + XMLHandle PreviousSiblingElement( const char* _value=0 ) { + return XMLHandle( _node ? _node->PreviousSiblingElement( _value ) : 0 ); + } + /// Get the next sibling of this handle. + XMLHandle NextSibling() { + return XMLHandle( _node ? _node->NextSibling() : 0 ); + } + /// Get the next sibling element of this handle. + XMLHandle NextSiblingElement( const char* _value=0 ) { + return XMLHandle( _node ? _node->NextSiblingElement( _value ) : 0 ); + } + + /// Safe cast to XMLNode. This can return null. + XMLNode* ToNode() { + return _node; + } + /// Safe cast to XMLElement. This can return null. + XMLElement* ToElement() { + return ( ( _node && _node->ToElement() ) ? _node->ToElement() : 0 ); + } + /// Safe cast to XMLText. This can return null. + XMLText* ToText() { + return ( ( _node && _node->ToText() ) ? _node->ToText() : 0 ); + } + /// Safe cast to XMLUnknown. This can return null. + XMLUnknown* ToUnknown() { + return ( ( _node && _node->ToUnknown() ) ? _node->ToUnknown() : 0 ); + } + /// Safe cast to XMLDeclaration. This can return null. + XMLDeclaration* ToDeclaration() { + return ( ( _node && _node->ToDeclaration() ) ? _node->ToDeclaration() : 0 ); + } + +private: + XMLNode* _node; +}; + + +/** + A variant of the XMLHandle class for working with const XMLNodes and Documents. It is the + same in all regards, except for the 'const' qualifiers. See XMLHandle for API. +*/ +class XMLConstHandle +{ +public: + XMLConstHandle( const XMLNode* node ) { + _node = node; + } + XMLConstHandle( const XMLNode& node ) { + _node = &node; + } + XMLConstHandle( const XMLConstHandle& ref ) { + _node = ref._node; + } + + XMLConstHandle& operator=( const XMLConstHandle& ref ) { + _node = ref._node; + return *this; + } + + const XMLConstHandle FirstChild() const { + return XMLConstHandle( _node ? _node->FirstChild() : 0 ); + } + const XMLConstHandle FirstChildElement( const char* value=0 ) const { + return XMLConstHandle( _node ? _node->FirstChildElement( value ) : 0 ); + } + const XMLConstHandle LastChild() const { + return XMLConstHandle( _node ? _node->LastChild() : 0 ); + } + const XMLConstHandle LastChildElement( const char* _value=0 ) const { + return XMLConstHandle( _node ? _node->LastChildElement( _value ) : 0 ); + } + const XMLConstHandle PreviousSibling() const { + return XMLConstHandle( _node ? _node->PreviousSibling() : 0 ); + } + const XMLConstHandle PreviousSiblingElement( const char* _value=0 ) const { + return XMLConstHandle( _node ? _node->PreviousSiblingElement( _value ) : 0 ); + } + const XMLConstHandle NextSibling() const { + return XMLConstHandle( _node ? _node->NextSibling() : 0 ); + } + const XMLConstHandle NextSiblingElement( const char* _value=0 ) const { + return XMLConstHandle( _node ? _node->NextSiblingElement( _value ) : 0 ); + } + + + const XMLNode* ToNode() const { + return _node; + } + const XMLElement* ToElement() const { + return ( ( _node && _node->ToElement() ) ? _node->ToElement() : 0 ); + } + const XMLText* ToText() const { + return ( ( _node && _node->ToText() ) ? _node->ToText() : 0 ); + } + const XMLUnknown* ToUnknown() const { + return ( ( _node && _node->ToUnknown() ) ? _node->ToUnknown() : 0 ); + } + const XMLDeclaration* ToDeclaration() const { + return ( ( _node && _node->ToDeclaration() ) ? _node->ToDeclaration() : 0 ); + } + +private: + const XMLNode* _node; +}; + + +/** + Printing functionality. The XMLPrinter gives you more + options than the XMLDocument::Print() method. + + It can: + -# Print to memory. + -# Print to a file you provide. + -# Print XML without a XMLDocument. + + Print to Memory + + @verbatim + XMLPrinter printer; + doc->Print( &printer ); + SomeFunction( printer.CStr() ); + @endverbatim + + Print to a File + + You provide the file pointer. + @verbatim + XMLPrinter printer( fp ); + doc.Print( &printer ); + @endverbatim + + Print without a XMLDocument + + When loading, an XML parser is very useful. However, sometimes + when saving, it just gets in the way. The code is often set up + for streaming, and constructing the DOM is just overhead. + + The Printer supports the streaming case. The following code + prints out a trivially simple XML file without ever creating + an XML document. + + @verbatim + XMLPrinter printer( fp ); + printer.OpenElement( "foo" ); + printer.PushAttribute( "foo", "bar" ); + printer.CloseElement(); + @endverbatim +*/ +class XMLPrinter : public XMLVisitor +{ +public: + /** Construct the printer. If the FILE* is specified, + this will print to the FILE. Else it will print + to memory, and the result is available in CStr(). + If 'compact' is set to true, then output is created + with only required whitespace and newlines. + */ + XMLPrinter( FILE* file=0, bool compact = false ); + ~XMLPrinter() {} + + /** If streaming, write the BOM and declaration. */ + void PushHeader( bool writeBOM, bool writeDeclaration ); + /** If streaming, start writing an element. + The element must be closed with CloseElement() + */ + void OpenElement( const char* name ); + /// If streaming, add an attribute to an open element. + void PushAttribute( const char* name, const char* value ); + void PushAttribute( const char* name, int value ); + void PushAttribute( const char* name, unsigned value ); + void PushAttribute( const char* name, bool value ); + void PushAttribute( const char* name, double value ); + /// If streaming, close the Element. + void CloseElement(); + + /// Add a text node. + void PushText( const char* text, bool cdata=false ); + /// Add a text node from an integer. + void PushText( int value ); + /// Add a text node from an unsigned. + void PushText( unsigned value ); + /// Add a text node from a bool. + void PushText( bool value ); + /// Add a text node from a float. + void PushText( float value ); + /// Add a text node from a double. + void PushText( double value ); + + /// Add a comment + void PushComment( const char* comment ); + + void PushDeclaration( const char* value ); + void PushUnknown( const char* value ); + + virtual bool VisitEnter( const XMLDocument& /*doc*/ ); + virtual bool VisitExit( const XMLDocument& /*doc*/ ) { + return true; + } + + virtual bool VisitEnter( const XMLElement& element, const XMLAttribute* attribute ); + virtual bool VisitExit( const XMLElement& element ); + + virtual bool Visit( const XMLText& text ); + virtual bool Visit( const XMLComment& comment ); + virtual bool Visit( const XMLDeclaration& declaration ); + virtual bool Visit( const XMLUnknown& unknown ); + + /** + If in print to memory mode, return a pointer to + the XML file in memory. + */ + const char* CStr() const { + return _buffer.Mem(); + } + /** + If in print to memory mode, return the size + of the XML file in memory. (Note the size returned + includes the terminating null.) + */ + int CStrSize() const { + return _buffer.Size(); + } + +private: + void SealElement(); + void PrintSpace( int depth ); + void PrintString( const char*, bool restrictedEntitySet ); // prints out, after detecting entities. + void Print( const char* format, ... ); + + bool _elementJustOpened; + bool _firstElement; + FILE* _fp; + int _depth; + int _textDepth; + bool _processEntities; + bool _compactMode; + + enum { + ENTITY_RANGE = 64, + BUF_SIZE = 200 + }; + bool _entityFlag[ENTITY_RANGE]; + bool _restrictedEntityFlag[ENTITY_RANGE]; + + DynArray< const char*, 10 > _stack; + DynArray< char, 20 > _buffer; +#ifdef _MSC_VER + DynArray< char, 20 > _accumulator; +#endif +}; + + +} // tinyxml2 + + +#endif // TINYXML2_INCLUDED diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/tinyxml2.pc.in xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/tinyxml2.pc.in --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/tinyxml2.pc.in 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/tinyxml2.pc.in 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,10 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=@CMAKE_INSTALL_LIBDIR@ +includedir=@CMAKE_INSTALL_INCLUDEDIR@ + +Name: TinyXML2 +Description: simple, small, C++ XML parser +Version: @GENERIC_LIB_VERSION@ +Libs: -L${libdir} -ltinyxml2 +Cflags: -I${includedir} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/tinyxml2.sln xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/tinyxml2.sln --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/tinyxml2.sln 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/tinyxml2.sln 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyxml2", "tinyxml2.vcproj", "{74F44A96-0BB5-416F-AA93-27A1DACB4234}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {74F44A96-0BB5-416F-AA93-27A1DACB4234}.Debug|Win32.ActiveCfg = Debug|Win32 + {74F44A96-0BB5-416F-AA93-27A1DACB4234}.Debug|Win32.Build.0 = Debug|Win32 + {74F44A96-0BB5-416F-AA93-27A1DACB4234}.Release|Win32.ActiveCfg = Release|Win32 + {74F44A96-0BB5-416F-AA93-27A1DACB4234}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/xmltest.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/xmltest.cpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/lib/tinyxml2/xmltest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/xmltest.cpp 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,1222 @@ +#if defined( _MSC_VER ) + #define _CRT_SECURE_NO_WARNINGS // This test file is not intended to be secure. +#endif + +#include "tinyxml2.h" +#include +#include +#include + +#if defined( _MSC_VER ) + #include // _mkdir + #include + #define WIN32_LEAN_AND_MEAN + #include + _CrtMemState startMemState; + _CrtMemState endMemState; +#elif defined(MINGW32) || defined(__MINGW32__) + #include // mkdir +#else + #include // mkdir +#endif + +using namespace tinyxml2; +int gPass = 0; +int gFail = 0; + + +bool XMLTest (const char* testString, const char* expected, const char* found, bool echo=true ) +{ + bool pass = !strcmp( expected, found ); + if ( pass ) + printf ("[pass]"); + else + printf ("[fail]"); + + if ( !echo ) + printf (" %s\n", testString); + else + printf (" %s [%s][%s]\n", testString, expected, found); + + if ( pass ) + ++gPass; + else + ++gFail; + return pass; +} + + +template< class T > bool XMLTest( const char* testString, T expected, T found, bool echo=true ) +{ + bool pass = ( expected == found ); + if ( pass ) + printf ("[pass]"); + else + printf ("[fail]"); + + if ( !echo ) + printf (" %s\n", testString); + else + printf (" %s [%d][%d]\n", testString, static_cast(expected), static_cast(found) ); + + if ( pass ) + ++gPass; + else + ++gFail; + return pass; +} + + +void NullLineEndings( char* p ) +{ + while( p && *p ) { + if ( *p == '\n' || *p == '\r' ) { + *p = 0; + return; + } + ++p; + } +} + + +int example_1() +{ + XMLDocument doc; + doc.LoadFile( "resources/dream.xml" ); + + return doc.ErrorID(); +} +/** @page Example-1 Load an XML File + * @dontinclude ./xmltest.cpp + * Basic XML file loading. + * The basic syntax to load an XML file from + * disk and check for an error. (ErrorID() + * will return 0 for no error.) + * @skip example_1() + * @until } + */ + + +int example_2() +{ + static const char* xml = ""; + XMLDocument doc; + doc.Parse( xml ); + + return doc.ErrorID(); +} +/** @page Example-2 Parse an XML from char buffer + * @dontinclude ./xmltest.cpp + * Basic XML string parsing. + * The basic syntax to parse an XML for + * a char* and check for an error. (ErrorID() + * will return 0 for no error.) + * @skip example_2() + * @until } + */ + + +int example_3() +{ + static const char* xml = + "" + "" + "" + "A Midsummer Night's Dream" + ""; + + XMLDocument doc; + doc.Parse( xml ); + + XMLElement* titleElement = doc.FirstChildElement( "PLAY" )->FirstChildElement( "TITLE" ); + const char* title = titleElement->GetText(); + printf( "Name of play (1): %s\n", title ); + + XMLText* textNode = titleElement->FirstChild()->ToText(); + title = textNode->Value(); + printf( "Name of play (2): %s\n", title ); + + return doc.ErrorID(); +} +/** @page Example-3 Get information out of XML + @dontinclude ./xmltest.cpp + In this example, we navigate a simple XML + file, and read some interesting text. Note + that this example doesn't use error + checking; working code should check for null + pointers when walking an XML tree, or use + XMLHandle. + + (The XML is an excerpt from "dream.xml"). + + @skip example_3() + @until "; + + The structure of the XML file is: + +
    +
  • (declaration)
  • +
  • (dtd stuff)
  • +
  • Element "PLAY"
  • +
      +
    • Element "TITLE"
    • +
        +
      • Text "A Midsummer Night's Dream"
      • +
      +
    +
+ + For this example, we want to print out the + title of the play. The text of the title (what + we want) is child of the "TITLE" element which + is a child of the "PLAY" element. + + We want to skip the declaration and dtd, so the + method FirstChildElement() is a good choice. The + FirstChildElement() of the Document is the "PLAY" + Element, the FirstChildElement() of the "PLAY" Element + is the "TITLE" Element. + + @until ( "TITLE" ); + + We can then use the convenience function GetText() + to get the title of the play. + + @until title ); + + Text is just another Node in the XML DOM. And in + fact you should be a little cautious with it, as + text nodes can contain elements. + + @verbatim + Consider: A Midsummer Night's Dream + @endverbatim + + It is more correct to actually query the Text Node + if in doubt: + + @until title ); + + Noting that here we use FirstChild() since we are + looking for XMLText, not an element, and ToText() + is a cast from a Node to a XMLText. +*/ + + +bool example_4() +{ + static const char* xml = + "" + " " + " " + " 2" + " " + ""; + + XMLDocument doc; + doc.Parse( xml ); + + int v0 = 0; + int v1 = 0; + + XMLElement* attributeApproachElement = doc.FirstChildElement()->FirstChildElement( "attributeApproach" ); + attributeApproachElement->QueryIntAttribute( "v", &v0 ); + + XMLElement* textApproachElement = doc.FirstChildElement()->FirstChildElement( "textApproach" ); + textApproachElement->FirstChildElement( "v" )->QueryIntText( &v1 ); + + printf( "Both values are the same: %d and %d\n", v0, v1 ); + + return !doc.Error() && ( v0 == v1 ); +} +/** @page Example-4 Read attributes and text information. + @dontinclude ./xmltest.cpp + + There are fundamentally 2 ways of writing a key-value + pair into an XML file. (Something that's always annoyed + me about XML.) Either by using attributes, or by writing + the key name into an element and the value into + the text node wrapped by the element. Both approaches + are illustrated in this example, which shows two ways + to encode the value "2" into the key "v": + + @skip example_4() + @until ""; + + TinyXML-2 has accessors for both approaches. + + When using an attribute, you navigate to the XMLElement + with that attribute and use the QueryIntAttribute() + group of methods. (Also QueryFloatAttribute(), etc.) + + @skip XMLElement* attributeApproachElement + @until &v0 ); + + When using the text approach, you need to navigate + down one more step to the XMLElement that contains + the text. Note the extra FirstChildElement( "v" ) + in the code below. The value of the text can then + be safely queried with the QueryIntText() group + of methods. (Also QueryFloatText(), etc.) + + @skip XMLElement* textApproachElement + @until &v1 ); +*/ + + +int main( int argc, const char ** argv ) +{ + #if defined( _MSC_VER ) && defined( DEBUG ) + _CrtMemCheckpoint( &startMemState ); + #endif + + #if defined(_MSC_VER) || defined(MINGW32) || defined(__MINGW32__) + _mkdir( "resources/out/" ); + #else + mkdir( "resources/out/", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); + #endif + + if ( argc > 1 ) { + XMLDocument* doc = new XMLDocument(); + clock_t startTime = clock(); + doc->LoadFile( argv[1] ); + clock_t loadTime = clock(); + int errorID = doc->ErrorID(); + delete doc; doc = 0; + clock_t deleteTime = clock(); + + printf( "Test file '%s' loaded. ErrorID=%d\n", argv[1], errorID ); + if ( !errorID ) { + printf( "Load time=%d\n", loadTime - startTime ); + printf( "Delete time=%d\n", deleteTime - loadTime ); + printf( "Total time=%d\n", deleteTime - startTime ); + } + exit(0); + } + + FILE* fp = fopen( "resources/dream.xml", "r" ); + if ( !fp ) { + printf( "Error opening test file 'dream.xml'.\n" + "Is your working directory the same as where \n" + "the xmltest.cpp and dream.xml file are?\n\n" + #if defined( _MSC_VER ) + "In windows Visual Studio you may need to set\n" + "Properties->Debugging->Working Directory to '..'\n" + #endif + ); + exit( 1 ); + } + fclose( fp ); + + XMLTest( "Example-1", 0, example_1() ); + XMLTest( "Example-2", 0, example_2() ); + XMLTest( "Example-3", 0, example_3() ); + XMLTest( "Example-4", true, example_4() ); + + /* ------ Example 2: Lookup information. ---- */ + + { + static const char* test[] = { "", + "", + "", + "", + "", + "", + " \n \n ", + "", + "", + "Text inside element.", + "", + "Text inside and bolded in the element.", + "Text inside and bolded in the element.", + "This & That.", + "", + 0 + }; + for( int i=0; test[i]; ++i ) { + XMLDocument doc; + doc.Parse( test[i] ); + doc.Print(); + printf( "----------------------------------------------\n" ); + } + } +#if 1 + { + static const char* test = ""; + + XMLDocument doc; + doc.Parse( test ); + doc.Print(); + } + + { + static const char* test = "Text before."; + XMLDocument doc; + doc.Parse( test ); + XMLElement* root = doc.FirstChildElement(); + XMLElement* newElement = doc.NewElement( "Subelement" ); + root->InsertEndChild( newElement ); + doc.Print(); + } + { + XMLDocument* doc = new XMLDocument(); + static const char* test = ""; + doc->Parse( test ); + delete doc; + } + { + // Test: Programmatic DOM + // Build: + // + // + // + // + // & Text! + // + + XMLDocument* doc = new XMLDocument(); + XMLNode* element = doc->InsertEndChild( doc->NewElement( "element" ) ); + + XMLElement* sub[3] = { doc->NewElement( "sub" ), doc->NewElement( "sub" ), doc->NewElement( "sub" ) }; + for( int i=0; i<3; ++i ) { + sub[i]->SetAttribute( "attrib", i ); + } + element->InsertEndChild( sub[2] ); + XMLNode* comment = element->InsertFirstChild( doc->NewComment( "comment" ) ); + element->InsertAfterChild( comment, sub[0] ); + element->InsertAfterChild( sub[0], sub[1] ); + sub[2]->InsertFirstChild( doc->NewText( "& Text!" )); + doc->Print(); + XMLTest( "Programmatic DOM", "comment", doc->FirstChildElement( "element" )->FirstChild()->Value() ); + XMLTest( "Programmatic DOM", "0", doc->FirstChildElement( "element" )->FirstChildElement()->Attribute( "attrib" ) ); + XMLTest( "Programmatic DOM", 2, doc->FirstChildElement()->LastChildElement( "sub" )->IntAttribute( "attrib" ) ); + XMLTest( "Programmatic DOM", "& Text!", + doc->FirstChildElement()->LastChildElement( "sub" )->FirstChild()->ToText()->Value() ); + + // And now deletion: + element->DeleteChild( sub[2] ); + doc->DeleteNode( comment ); + + element->FirstChildElement()->SetAttribute( "attrib", true ); + element->LastChildElement()->DeleteAttribute( "attrib" ); + + XMLTest( "Programmatic DOM", true, doc->FirstChildElement()->FirstChildElement()->BoolAttribute( "attrib" ) ); + int value = 10; + int result = doc->FirstChildElement()->LastChildElement()->QueryIntAttribute( "attrib", &value ); + XMLTest( "Programmatic DOM", result, (int)XML_NO_ATTRIBUTE ); + XMLTest( "Programmatic DOM", value, 10 ); + + doc->Print(); + + { + XMLPrinter streamer; + doc->Print( &streamer ); + printf( "%s", streamer.CStr() ); + } + { + XMLPrinter streamer( 0, true ); + doc->Print( &streamer ); + XMLTest( "Compact mode", "", streamer.CStr(), false ); + } + doc->SaveFile( "./resources/out/pretty.xml" ); + doc->SaveFile( "./resources/out/compact.xml", true ); + delete doc; + } + { + // Test: Dream + // XML1 : 1,187,569 bytes in 31,209 allocations + // XML2 : 469,073 bytes in 323 allocations + //int newStart = gNew; + XMLDocument doc; + doc.LoadFile( "resources/dream.xml" ); + + doc.SaveFile( "resources/out/dreamout.xml" ); + doc.PrintError(); + + XMLTest( "Dream", "xml version=\"1.0\"", + doc.FirstChild()->ToDeclaration()->Value() ); + XMLTest( "Dream", true, doc.FirstChild()->NextSibling()->ToUnknown() ? true : false ); + XMLTest( "Dream", "DOCTYPE PLAY SYSTEM \"play.dtd\"", + doc.FirstChild()->NextSibling()->ToUnknown()->Value() ); + XMLTest( "Dream", "And Robin shall restore amends.", + doc.LastChild()->LastChild()->LastChild()->LastChild()->LastChildElement()->GetText() ); + XMLTest( "Dream", "And Robin shall restore amends.", + doc.LastChild()->LastChild()->LastChild()->LastChild()->LastChildElement()->GetText() ); + + XMLDocument doc2; + doc2.LoadFile( "resources/out/dreamout.xml" ); + XMLTest( "Dream-out", "xml version=\"1.0\"", + doc2.FirstChild()->ToDeclaration()->Value() ); + XMLTest( "Dream-out", true, doc2.FirstChild()->NextSibling()->ToUnknown() ? true : false ); + XMLTest( "Dream-out", "DOCTYPE PLAY SYSTEM \"play.dtd\"", + doc2.FirstChild()->NextSibling()->ToUnknown()->Value() ); + XMLTest( "Dream-out", "And Robin shall restore amends.", + doc2.LastChild()->LastChild()->LastChild()->LastChild()->LastChildElement()->GetText() ); + + //gNewTotal = gNew - newStart; + } + + + { + const char* error = "\n" + "\n" + " \n" + ""; + + XMLDocument doc; + doc.Parse( error ); + XMLTest( "Bad XML", doc.ErrorID(), XML_ERROR_PARSING_ATTRIBUTE ); + } + + { + const char* str = ""; + + XMLDocument doc; + doc.Parse( str ); + + XMLElement* ele = doc.FirstChildElement(); + + int iVal, result; + double dVal; + + result = ele->QueryDoubleAttribute( "attr0", &dVal ); + XMLTest( "Query attribute: int as double", result, (int)XML_NO_ERROR ); + XMLTest( "Query attribute: int as double", (int)dVal, 1 ); + result = ele->QueryDoubleAttribute( "attr1", &dVal ); + XMLTest( "Query attribute: double as double", (int)dVal, 2 ); + result = ele->QueryIntAttribute( "attr1", &iVal ); + XMLTest( "Query attribute: double as int", result, (int)XML_NO_ERROR ); + XMLTest( "Query attribute: double as int", iVal, 2 ); + result = ele->QueryIntAttribute( "attr2", &iVal ); + XMLTest( "Query attribute: not a number", result, (int)XML_WRONG_ATTRIBUTE_TYPE ); + result = ele->QueryIntAttribute( "bar", &iVal ); + XMLTest( "Query attribute: does not exist", result, (int)XML_NO_ATTRIBUTE ); + } + + { + const char* str = ""; + + XMLDocument doc; + doc.Parse( str ); + + XMLElement* ele = doc.FirstChildElement(); + + int iVal, iVal2; + double dVal, dVal2; + + ele->SetAttribute( "str", "strValue" ); + ele->SetAttribute( "int", 1 ); + ele->SetAttribute( "double", -1.0 ); + + const char* cStr = ele->Attribute( "str" ); + ele->QueryIntAttribute( "int", &iVal ); + ele->QueryDoubleAttribute( "double", &dVal ); + + ele->QueryAttribute( "int", &iVal2 ); + ele->QueryAttribute( "double", &dVal2 ); + + XMLTest( "Attribute match test", ele->Attribute( "str", "strValue" ), "strValue" ); + XMLTest( "Attribute round trip. c-string.", "strValue", cStr ); + XMLTest( "Attribute round trip. int.", 1, iVal ); + XMLTest( "Attribute round trip. double.", -1, (int)dVal ); + XMLTest( "Alternate query", true, iVal == iVal2 ); + XMLTest( "Alternate query", true, dVal == dVal2 ); + } + + { + XMLDocument doc; + doc.LoadFile( "resources/utf8test.xml" ); + + // Get the attribute "value" from the "Russian" element and check it. + XMLElement* element = doc.FirstChildElement( "document" )->FirstChildElement( "Russian" ); + const unsigned char correctValue[] = { 0xd1U, 0x86U, 0xd0U, 0xb5U, 0xd0U, 0xbdU, 0xd0U, 0xbdU, + 0xd0U, 0xbeU, 0xd1U, 0x81U, 0xd1U, 0x82U, 0xd1U, 0x8cU, 0 }; + + XMLTest( "UTF-8: Russian value.", (const char*)correctValue, element->Attribute( "value" ) ); + + const unsigned char russianElementName[] = { 0xd0U, 0xa0U, 0xd1U, 0x83U, + 0xd1U, 0x81U, 0xd1U, 0x81U, + 0xd0U, 0xbaU, 0xd0U, 0xb8U, + 0xd0U, 0xb9U, 0 }; + const char russianText[] = "<\xD0\xB8\xD0\xBC\xD0\xB5\xD0\xB5\xD1\x82>"; + + XMLText* text = doc.FirstChildElement( "document" )->FirstChildElement( (const char*) russianElementName )->FirstChild()->ToText(); + XMLTest( "UTF-8: Browsing russian element name.", + russianText, + text->Value() ); + + // Now try for a round trip. + doc.SaveFile( "resources/out/utf8testout.xml" ); + + // Check the round trip. + int okay = 0; + + FILE* saved = fopen( "resources/out/utf8testout.xml", "r" ); + FILE* verify = fopen( "resources/utf8testverify.xml", "r" ); + + if ( saved && verify ) + { + okay = 1; + char verifyBuf[256]; + while ( fgets( verifyBuf, 256, verify ) ) + { + char savedBuf[256]; + fgets( savedBuf, 256, saved ); + NullLineEndings( verifyBuf ); + NullLineEndings( savedBuf ); + + if ( strcmp( verifyBuf, savedBuf ) ) + { + printf( "verify:%s<\n", verifyBuf ); + printf( "saved :%s<\n", savedBuf ); + okay = 0; + break; + } + } + } + if ( saved ) + fclose( saved ); + if ( verify ) + fclose( verify ); + XMLTest( "UTF-8: Verified multi-language round trip.", 1, okay ); + } + + // --------GetText()----------- + { + const char* str = "This is text"; + XMLDocument doc; + doc.Parse( str ); + const XMLElement* element = doc.RootElement(); + + XMLTest( "GetText() normal use.", "This is text", element->GetText() ); + + str = "This is text"; + doc.Parse( str ); + element = doc.RootElement(); + + XMLTest( "GetText() contained element.", element->GetText() == 0, true ); + } + + + // ---------- CDATA --------------- + { + const char* str = "" + " the rules!\n" + "...since I make symbolic puns" + "]]>" + ""; + XMLDocument doc; + doc.Parse( str ); + doc.Print(); + + XMLTest( "CDATA parse.", doc.FirstChildElement()->FirstChild()->Value(), + "I am > the rules!\n...since I make symbolic puns", + false ); + } + + // ----------- CDATA ------------- + { + const char* str = "" + "I am > the rules!\n" + "...since I make symbolic puns" + "]]>" + ""; + XMLDocument doc; + doc.Parse( str ); + doc.Print(); + + XMLTest( "CDATA parse. [ tixml1:1480107 ]", doc.FirstChildElement()->FirstChild()->Value(), + "I am > the rules!\n...since I make symbolic puns", + false ); + } + + // InsertAfterChild causes crash. + { + // InsertBeforeChild and InsertAfterChild causes crash. + XMLDocument doc; + XMLElement* parent = doc.NewElement( "Parent" ); + doc.InsertFirstChild( parent ); + + XMLElement* childText0 = doc.NewElement( "childText0" ); + XMLElement* childText1 = doc.NewElement( "childText1" ); + + XMLNode* childNode0 = parent->InsertEndChild( childText0 ); + XMLNode* childNode1 = parent->InsertAfterChild( childNode0, childText1 ); + + XMLTest( "Test InsertAfterChild on empty node. ", ( childNode1 == parent->LastChild() ), true ); + } + + { + // Entities not being written correctly. + // From Lynn Allen + + const char* passages = + "" + "" + " " + ""; + + XMLDocument doc; + doc.Parse( passages ); + XMLElement* psg = doc.RootElement()->FirstChildElement(); + const char* context = psg->Attribute( "context" ); + const char* expected = "Line 5 has \"quotation marks\" and 'apostrophe marks'. It also has <, >, and &, as well as a fake copyright \xC2\xA9."; + + XMLTest( "Entity transformation: read. ", expected, context, true ); + + FILE* textfile = fopen( "resources/out/textfile.txt", "w" ); + if ( textfile ) + { + XMLPrinter streamer( textfile ); + psg->Accept( &streamer ); + fclose( textfile ); + } + + textfile = fopen( "resources/out/textfile.txt", "r" ); + TIXMLASSERT( textfile ); + if ( textfile ) + { + char buf[ 1024 ]; + fgets( buf, 1024, textfile ); + XMLTest( "Entity transformation: write. ", + "\n", + buf, false ); + fclose( textfile ); + } + } + + { + // Suppress entities. + const char* passages = + "" + "" + "Crazy &ttk;" + ""; + + XMLDocument doc( false ); + doc.Parse( passages ); + + XMLTest( "No entity parsing.", doc.FirstChildElement()->FirstChildElement()->Attribute( "context" ), + "Line 5 has "quotation marks" and 'apostrophe marks'." ); + XMLTest( "No entity parsing.", doc.FirstChildElement()->FirstChildElement()->FirstChild()->Value(), + "Crazy &ttk;" ); + doc.Print(); + } + + { + const char* test = ""; + + XMLDocument doc; + doc.Parse( test ); + XMLTest( "dot in names", doc.Error(), false ); + XMLTest( "dot in names", doc.FirstChildElement()->Name(), "a.elem" ); + XMLTest( "dot in names", doc.FirstChildElement()->Attribute( "xmi.version" ), "2.0" ); + } + + { + const char* test = "1.1 Start easy ignore fin thickness "; + + XMLDocument doc; + doc.Parse( test ); + + XMLText* text = doc.FirstChildElement()->FirstChildElement()->FirstChild()->ToText(); + XMLTest( "Entity with one digit.", + text->Value(), "1.1 Start easy ignore fin thickness\n", + false ); + } + + { + // DOCTYPE not preserved (950171) + // + const char* doctype = + "" + "" + "" + "" + ""; + + XMLDocument doc; + doc.Parse( doctype ); + doc.SaveFile( "resources/out/test7.xml" ); + doc.DeleteChild( doc.RootElement() ); + doc.LoadFile( "resources/out/test7.xml" ); + doc.Print(); + + const XMLUnknown* decl = doc.FirstChild()->NextSibling()->ToUnknown(); + XMLTest( "Correct value of unknown.", "DOCTYPE PLAY SYSTEM 'play.dtd'", decl->Value() ); + + } + + { + // Comments do not stream out correctly. + const char* doctype = + ""; + XMLDocument doc; + doc.Parse( doctype ); + + XMLComment* comment = doc.FirstChild()->ToComment(); + + XMLTest( "Comment formatting.", " Somewhat ", comment->Value() ); + } + { + // Double attributes + const char* doctype = ""; + + XMLDocument doc; + doc.Parse( doctype ); + + XMLTest( "Parsing repeated attributes.", XML_ERROR_PARSING_ATTRIBUTE, doc.ErrorID() ); // is an error to tinyxml (didn't use to be, but caused issues) + doc.PrintError(); + } + + { + // Embedded null in stream. + const char* doctype = ""; + + XMLDocument doc; + doc.Parse( doctype ); + XMLTest( "Embedded null throws error.", true, doc.Error() ); + } + + { + // Empty documents should return TIXML_XML_ERROR_PARSING_EMPTY, bug 1070717 + const char* str = " "; + XMLDocument doc; + doc.Parse( str ); + XMLTest( "Empty document error", XML_ERROR_EMPTY_DOCUMENT, doc.ErrorID() ); + } + + { + // Low entities + XMLDocument doc; + doc.Parse( "" ); + const char result[] = { 0x0e, 0 }; + XMLTest( "Low entities.", doc.FirstChildElement()->GetText(), result ); + doc.Print(); + } + + { + // Attribute values with trailing quotes not handled correctly + XMLDocument doc; + doc.Parse( "" ); + XMLTest( "Throw error with bad end quotes.", doc.Error(), true ); + } + + { + // [ 1663758 ] Failure to report error on bad XML + XMLDocument xml; + xml.Parse(""); + XMLTest("Missing end tag at end of input", xml.Error(), true); + xml.Parse(" "); + XMLTest("Missing end tag with trailing whitespace", xml.Error(), true); + xml.Parse(""); + XMLTest("Mismatched tags", xml.ErrorID(), XML_ERROR_MISMATCHED_ELEMENT); + } + + + { + // [ 1475201 ] TinyXML parses entities in comments + XMLDocument xml; + xml.Parse("" + "" ); + + XMLNode* e0 = xml.FirstChild(); + XMLNode* e1 = e0->NextSibling(); + XMLComment* c0 = e0->ToComment(); + XMLComment* c1 = e1->ToComment(); + + XMLTest( "Comments ignore entities.", " declarations for & ", c0->Value(), true ); + XMLTest( "Comments ignore entities.", " far & away ", c1->Value(), true ); + } + + { + XMLDocument xml; + xml.Parse( "" + "" + "" + "" + "" ); + xml.Print(); + + int count = 0; + + for( XMLNode* ele = xml.FirstChildElement( "Parent" )->FirstChild(); + ele; + ele = ele->NextSibling() ) + { + ++count; + } + + XMLTest( "Comments iterate correctly.", 3, count ); + } + + { + // trying to repro ]1874301]. If it doesn't go into an infinite loop, all is well. + unsigned char buf[] = " " ); + XMLTest( "Handle end tag whitespace", false, xml.Error() ); + } + + { + // This one must not result in an infinite loop + XMLDocument xml; + xml.Parse( "loop" ); + XMLTest( "Infinite loop test.", true, true ); + } +#endif + { + const char* pub = " "; + XMLDocument doc; + doc.Parse( pub ); + + XMLDocument clone; + for( const XMLNode* node=doc.FirstChild(); node; node=node->NextSibling() ) { + XMLNode* copy = node->ShallowClone( &clone ); + clone.InsertEndChild( copy ); + } + + clone.Print(); + + int count=0; + const XMLNode* a=clone.FirstChild(); + const XMLNode* b=doc.FirstChild(); + for( ; a && b; a=a->NextSibling(), b=b->NextSibling() ) { + ++count; + XMLTest( "Clone and Equal", true, a->ShallowEqual( b )); + } + XMLTest( "Clone and Equal", 4, count ); + } + + { + // This shouldn't crash. + XMLDocument doc; + if(XML_NO_ERROR != doc.LoadFile( "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" )) + { + doc.PrintError(); + } + XMLTest( "Error in snprinf handling.", true, doc.Error() ); + } + + { + // Attribute ordering. + static const char* xml = ""; + XMLDocument doc; + doc.Parse( xml ); + XMLElement* ele = doc.FirstChildElement(); + + const XMLAttribute* a = ele->FirstAttribute(); + XMLTest( "Attribute order", "1", a->Value() ); + a = a->Next(); + XMLTest( "Attribute order", "2", a->Value() ); + a = a->Next(); + XMLTest( "Attribute order", "3", a->Value() ); + XMLTest( "Attribute order", "attrib3", a->Name() ); + + ele->DeleteAttribute( "attrib2" ); + a = ele->FirstAttribute(); + XMLTest( "Attribute order", "1", a->Value() ); + a = a->Next(); + XMLTest( "Attribute order", "3", a->Value() ); + + ele->DeleteAttribute( "attrib1" ); + ele->DeleteAttribute( "attrib3" ); + XMLTest( "Attribute order (empty)", false, ele->FirstAttribute() ? true : false ); + } + + { + // Make sure an attribute with a space in it succeeds. + static const char* xml0 = ""; + static const char* xml1 = ""; + static const char* xml2 = ""; + XMLDocument doc0; + doc0.Parse( xml0 ); + XMLDocument doc1; + doc1.Parse( xml1 ); + XMLDocument doc2; + doc2.Parse( xml2 ); + + XMLElement* ele = 0; + ele = doc0.FirstChildElement(); + XMLTest( "Attribute with space #1", "Test Attribute", ele->Attribute( "attribute1" ) ); + ele = doc1.FirstChildElement(); + XMLTest( "Attribute with space #2", "Test Attribute", ele->Attribute( "attribute1" ) ); + ele = doc2.FirstChildElement(); + XMLTest( "Attribute with space #3", "Test Attribute", ele->Attribute( "attribute1" ) ); + } + + { + // Make sure we don't go into an infinite loop. + static const char* xml = ""; + XMLDocument doc; + doc.Parse( xml ); + XMLElement* ele0 = doc.FirstChildElement()->FirstChildElement(); + XMLElement* ele1 = ele0->NextSiblingElement(); + bool equal = ele0->ShallowEqual( ele1 ); + + XMLTest( "Infinite loop in shallow equal.", true, equal ); + } + + // -------- Handles ------------ + { + static const char* xml = "Text"; + XMLDocument doc; + doc.Parse( xml ); + + XMLElement* ele = XMLHandle( doc ).FirstChildElement( "element" ).FirstChild().ToElement(); + XMLTest( "Handle, success, mutable", ele->Value(), "sub" ); + + XMLHandle docH( doc ); + ele = docH.FirstChildElement( "none" ).FirstChildElement( "element" ).ToElement(); + XMLTest( "Handle, dne, mutable", false, ele != 0 ); + } + + { + static const char* xml = "Text"; + XMLDocument doc; + doc.Parse( xml ); + XMLConstHandle docH( doc ); + + const XMLElement* ele = docH.FirstChildElement( "element" ).FirstChild().ToElement(); + XMLTest( "Handle, success, const", ele->Value(), "sub" ); + + ele = docH.FirstChildElement( "none" ).FirstChildElement( "element" ).ToElement(); + XMLTest( "Handle, dne, const", false, ele != 0 ); + } + { + // Default Declaration & BOM + XMLDocument doc; + doc.InsertEndChild( doc.NewDeclaration() ); + doc.SetBOM( true ); + + XMLPrinter printer; + doc.Print( &printer ); + + static const char* result = "\xef\xbb\xbf"; + XMLTest( "BOM and default declaration", printer.CStr(), result, false ); + XMLTest( "CStrSize", printer.CStrSize(), 42, false ); + } + { + const char* xml = " This \nis ' text ' " + " This is ' text ' \n" + "This is ' \n\n text '" + ""; + XMLDocument doc( true, COLLAPSE_WHITESPACE ); + doc.Parse( xml ); + + const XMLElement* element = doc.FirstChildElement(); + for( const XMLElement* parent = element->FirstChildElement(); + parent; + parent = parent->NextSiblingElement() ) + { + XMLTest( "Whitespace collapse", "This is ' text '", parent->GetText() ); + } + } + +#if 0 + { + // Passes if assert doesn't fire. + XMLDocument xmlDoc; + + xmlDoc.NewDeclaration(); + xmlDoc.NewComment("Configuration file"); + + XMLElement *root = xmlDoc.NewElement("settings"); + root->SetAttribute("version", 2); + } +#endif + + { + const char* xml = " "; + XMLDocument doc( true, COLLAPSE_WHITESPACE ); + doc.Parse( xml ); + XMLTest( "Whitespace all space", true, 0 == doc.FirstChildElement()->FirstChild() ); + } + +#if 0 // the question being explored is what kind of print to use: + // https://github.com/leethomason/tinyxml2/issues/63 + { + const char* xml = ""; + XMLDocument doc; + doc.Parse( xml ); + doc.FirstChildElement()->SetAttribute( "attrA", 123456789.123456789 ); + doc.FirstChildElement()->SetAttribute( "attrB", 1.001e9 ); + doc.Print(); + } +#endif + + { + // An assert should not fire. + const char* xml = ""; + XMLDocument doc; + doc.Parse( xml ); + XMLElement* ele = doc.NewElement( "unused" ); // This will get cleaned up with the 'doc' going out of scope. + XMLTest( "Tracking unused elements", true, ele != 0, false ); + } + + + { + const char* xml = "abc"; + XMLDocument doc; + doc.Parse( xml ); + XMLElement* ele = doc.FirstChildElement( "parent")->FirstChildElement( "child"); + + XMLPrinter printer; + ele->Accept( &printer ); + XMLTest( "Printing of sub-element", "abc\n", printer.CStr(), false ); + } + + + // ----------- Performance tracking -------------- + { +#if defined( _MSC_VER ) + __int64 start, end, freq; + QueryPerformanceFrequency( (LARGE_INTEGER*) &freq ); +#endif + + FILE* fp = fopen( "resources/dream.xml", "r" ); + fseek( fp, 0, SEEK_END ); + long size = ftell( fp ); + fseek( fp, 0, SEEK_SET ); + + char* mem = new char[size+1]; + fread( mem, size, 1, fp ); + fclose( fp ); + mem[size] = 0; + +#if defined( _MSC_VER ) + QueryPerformanceCounter( (LARGE_INTEGER*) &start ); +#else + clock_t cstart = clock(); +#endif + static const int COUNT = 10; + for( int i=0; i"; + + The structure of the XML file is: + +
    +
  • (declaration)
  • +
  • (dtd stuff)
  • +
  • Element "PLAY"
  • +
      +
    • Element "TITLE"
    • +
        +
      • Text "A Midsummer Night's Dream"
      • +
      +
    +
+ + For this example, we want to print out the + title of the play. The text of the title (what + we want) is child of the "TITLE" element which + is a child of the "PLAY" element. + + We want to skip the declaration and dtd, so the + method FirstChildElement() is a good choice. The + FirstChildElement() of the Document is the "PLAY" + Element, the FirstChildElement() of the "PLAY" Element + is the "TITLE" Element. + + @until ( "TITLE" ); + + We can then use the convenience function GetText() + to get the title of the play. + + @until title ); + + Text is just another Node in the XML DOM. And in + fact you should be a little cautious with it, as + text nodes can contain elements. + + @verbatim + Consider: A Midsummer Night's Dream + @endverbatim + + It is more correct to actually query the Text Node + if in doubt: + + @until title ); + + Noting that here we use FirstChild() since we are + looking for XMLText, not an element, and ToText() + is a cast from a Node to a XMLText. +*/ + +/** @page Example-4 Read attributes and text information. + @dontinclude ./xmltest.cpp + + There are fundamentally 2 ways of writing a key-value + pair into an XML file. (Something that's always annoyed + me about XML.) Either by using attributes, or by writing + the key name into an element and the value into + the text node wrapped by the element. Both approaches + are illustrated in this example, which shows two ways + to encode the value "2" into the key "v": + + @skip example_4 + @until ""; + + TinyXML-2 has accessors for both approaches. + + When using an attribute, you navigate to the XMLElement + with that attribute and use the QueryIntAttribute() + group of methods. (Also QueryFloatAttribute(), etc.) + + @skip XMLElement* attributeApproachElement + @until &v0 ); + + When using the text approach, you need to navigate + down one more step to the XMLElement that contains + the text. Note the extra FirstChildElement( "v" ) + in the code below. The value of the text can then + be safely queried with the QueryIntText() group + of methods. (Also QueryFloatText(), etc.) + + @skip XMLElement* textApproachElement + @until &v1 ); +*/ + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/Makefile.am --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/Makefile.am 2013-12-13 13:17:17.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/Makefile.am 2014-01-04 10:28:12.000000000 +0000 @@ -11,16 +11,19 @@ sync: cp -f ../xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxPacket.h xbmc/DVDDemuxPacket.h cat ../addons/library.xbmc.addon/libXBMC_addon.h | sed 's/#include "..\/library.xbmc.addon\/libXBMC_addon.h"/#include "libXBMC_addon.h"/' > xbmc/libXBMC_addon.h + cat ../addons/library.xbmc.codec/libXBMC_codec.h | sed 's/#include "..\/library.xbmc.addon\/libXBMC_addon.h"/#include "libXBMC_addon.h"/' > xbmc/libXBMC_codec.h cat ../addons/library.xbmc.gui/libXBMC_gui.h | sed 's/#include "..\/library.xbmc.addon\/libXBMC_addon.h"/#include "libXBMC_addon.h"/' > xbmc/libXBMC_gui.h cat ../addons/library.xbmc.pvr/libXBMC_pvr.h | sed 's/#include "..\/library.xbmc.addon\/libXBMC_addon.h"/#include "libXBMC_addon.h"/' > xbmc/libXBMC_pvr.h cp -f ../xbmc/addons/include/xbmc_addon_cpp_dll.h xbmc/xbmc_addon_cpp_dll.h cp -f ../xbmc/addons/include/xbmc_addon_dll.h xbmc/xbmc_addon_dll.h cp -f ../xbmc/addons/include/xbmc_addon_types.h xbmc/xbmc_addon_types.h + cp -f ../xbmc/addons/include/xbmc_codec_types.h xbmc/xbmc_codec_types.h cp -f ../xbmc/addons/include/xbmc_epg_types.h xbmc/xbmc_epg_types.h cp -f ../xbmc/addons/include/xbmc_pvr_dll.h xbmc/xbmc_pvr_dll.h cp -f ../xbmc/addons/include/xbmc_pvr_types.h xbmc/xbmc_pvr_types.h cp -f ../xbmc/addons/include/xbmc_scr_dll.h xbmc/xbmc_scr_dll.h cp -f ../xbmc/addons/include/xbmc_scr_types.h xbmc/xbmc_scr_types.h + cp -f ../xbmc/addons/include/xbmc_stream_utils.hpp xbmc/xbmc_stream_utils.hpp cp -f ../xbmc/addons/include/xbmc_vis_dll.h xbmc/xbmc_vis_dll.h cp -f ../xbmc/addons/include/xbmc_vis_types.h xbmc/xbmc_vis_types.h diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/project/VS2010Express/ConfigureAddonXML.bat xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/project/VS2010Express/ConfigureAddonXML.bat --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/project/VS2010Express/ConfigureAddonXML.bat 2012-12-02 04:00:29.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/project/VS2010Express/ConfigureAddonXML.bat 2014-01-04 10:28:19.000000000 +0000 @@ -11,7 +11,7 @@ FOR /F "tokens=*" %%S IN ('dir /B "pvr.*"') DO ( echo Configuring %%S cd "%%S\addon" - %SED% "s/@OS@/wingl windx/" addon.xml.in > addon.xml + %SED% -e "s/@OS@/wingl windx/" -e "s/@ARCHITECTURE@/x86/" addon.xml.in > addon.xml cd ..\.. ) diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/project/VS2010Express/platform/platform.vcxproj xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/project/VS2010Express/platform/platform.vcxproj --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/project/VS2010Express/platform/platform.vcxproj 2012-12-02 04:00:29.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/project/VS2010Express/platform/platform.vcxproj 2014-01-04 10:28:19.000000000 +0000 @@ -48,7 +48,7 @@ true - $(SolutionDir)\ConfigureAddonXML.bat + "$(SolutionDir)\ConfigureAddonXML.bat"
diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/project/VS2010Express/xbmc-pvr-addons.sln xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/project/VS2010Express/xbmc-pvr-addons.sln --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/project/VS2010Express/xbmc-pvr-addons.sln 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/project/VS2010Express/xbmc-pvr-addons.sln 2014-01-04 10:28:19.000000000 +0000 @@ -43,76 +43,145 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pvr.iptvsimple", "..\..\addons\pvr.iptvsimple\project\VS2010Express\pvr.iptvsimple.vcxproj", "{6C67B057-CE98-4732-AABF-0E374C718815}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyxml2", "..\..\lib\tinyxml2\tinyxml2\tinyxml2.vcxproj", "{D1C528B6-AA02-4D29-9D61-DC08E317A70D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libdvblinkremote", "..\..\lib\libdvblinkremote\project\VS2010Express\libdvblinkremote.vcxproj", "{DB826A81-E848-4E39-BE17-E779A49E2960}" + ProjectSection(ProjectDependencies) = postProject + {D1C528B6-AA02-4D29-9D61-DC08E317A70D} = {D1C528B6-AA02-4D29-9D61-DC08E317A70D} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pvr.dvblink", "..\..\addons\pvr.dvblink\project\VS2010Express\pvrclient_dvblink.vcxproj", "{F9F3E7B6-EF4C-4BD8-A921-3DE4C4268945}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pvr.wmc", "..\..\addons\pvr.wmc\project\VS2010Express\pvrclient_wmc.vcxproj", "{6834B003-2511-4745-818D-F418E87DD941}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 + Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {FE4573F6-A794-4AD3-B37F-49E51F1140E6}.Debug|Win32.ActiveCfg = Debug|Win32 {FE4573F6-A794-4AD3-B37F-49E51F1140E6}.Debug|Win32.Build.0 = Debug|Win32 + {FE4573F6-A794-4AD3-B37F-49E51F1140E6}.Debug|x64.ActiveCfg = Debug|Win32 {FE4573F6-A794-4AD3-B37F-49E51F1140E6}.Release|Win32.ActiveCfg = Release|Win32 {FE4573F6-A794-4AD3-B37F-49E51F1140E6}.Release|Win32.Build.0 = Release|Win32 + {FE4573F6-A794-4AD3-B37F-49E51F1140E6}.Release|x64.ActiveCfg = Release|Win32 {BDC7D21D-9FD9-41AA-BEC8-8B70E1448C50}.Debug|Win32.ActiveCfg = Debug|Win32 {BDC7D21D-9FD9-41AA-BEC8-8B70E1448C50}.Debug|Win32.Build.0 = Debug|Win32 + {BDC7D21D-9FD9-41AA-BEC8-8B70E1448C50}.Debug|x64.ActiveCfg = Debug|Win32 {BDC7D21D-9FD9-41AA-BEC8-8B70E1448C50}.Release|Win32.ActiveCfg = Release|Win32 {BDC7D21D-9FD9-41AA-BEC8-8B70E1448C50}.Release|Win32.Build.0 = Release|Win32 + {BDC7D21D-9FD9-41AA-BEC8-8B70E1448C50}.Release|x64.ActiveCfg = Release|Win32 {00700E12-A63B-4E54-B962-4011A90584BD}.Debug|Win32.ActiveCfg = Debug|Win32 {00700E12-A63B-4E54-B962-4011A90584BD}.Debug|Win32.Build.0 = Debug|Win32 + {00700E12-A63B-4E54-B962-4011A90584BD}.Debug|x64.ActiveCfg = Debug|Win32 {00700E12-A63B-4E54-B962-4011A90584BD}.Release|Win32.ActiveCfg = Release|Win32 {00700E12-A63B-4E54-B962-4011A90584BD}.Release|Win32.Build.0 = Release|Win32 + {00700E12-A63B-4E54-B962-4011A90584BD}.Release|x64.ActiveCfg = Release|Win32 {A81DC727-4D0A-4CF8-AC14-021FFF6C1E1C}.Debug|Win32.ActiveCfg = Debug|Win32 {A81DC727-4D0A-4CF8-AC14-021FFF6C1E1C}.Debug|Win32.Build.0 = Debug|Win32 + {A81DC727-4D0A-4CF8-AC14-021FFF6C1E1C}.Debug|x64.ActiveCfg = Debug|Win32 {A81DC727-4D0A-4CF8-AC14-021FFF6C1E1C}.Release|Win32.ActiveCfg = Release|Win32 {A81DC727-4D0A-4CF8-AC14-021FFF6C1E1C}.Release|Win32.Build.0 = Release|Win32 + {A81DC727-4D0A-4CF8-AC14-021FFF6C1E1C}.Release|x64.ActiveCfg = Release|Win32 {6C839B8E-2C7D-4725-8765-D6C0C10DBC06}.Debug|Win32.ActiveCfg = Debug|Win32 {6C839B8E-2C7D-4725-8765-D6C0C10DBC06}.Debug|Win32.Build.0 = Debug|Win32 + {6C839B8E-2C7D-4725-8765-D6C0C10DBC06}.Debug|x64.ActiveCfg = Debug|Win32 {6C839B8E-2C7D-4725-8765-D6C0C10DBC06}.Release|Win32.ActiveCfg = Release|Win32 {6C839B8E-2C7D-4725-8765-D6C0C10DBC06}.Release|Win32.Build.0 = Release|Win32 + {6C839B8E-2C7D-4725-8765-D6C0C10DBC06}.Release|x64.ActiveCfg = Release|Win32 {74C9642E-1988-48DC-8404-11717C355378}.Debug|Win32.ActiveCfg = Debug|Win32 {74C9642E-1988-48DC-8404-11717C355378}.Debug|Win32.Build.0 = Debug|Win32 + {74C9642E-1988-48DC-8404-11717C355378}.Debug|x64.ActiveCfg = Debug|Win32 {74C9642E-1988-48DC-8404-11717C355378}.Release|Win32.ActiveCfg = Release|Win32 {74C9642E-1988-48DC-8404-11717C355378}.Release|Win32.Build.0 = Release|Win32 + {74C9642E-1988-48DC-8404-11717C355378}.Release|x64.ActiveCfg = Release|Win32 {5ACBDC4B-75D8-49DC-926F-F6F2CC7F3F99}.Debug|Win32.ActiveCfg = Debug|Win32 {5ACBDC4B-75D8-49DC-926F-F6F2CC7F3F99}.Debug|Win32.Build.0 = Debug|Win32 + {5ACBDC4B-75D8-49DC-926F-F6F2CC7F3F99}.Debug|x64.ActiveCfg = Debug|Win32 {5ACBDC4B-75D8-49DC-926F-F6F2CC7F3F99}.Release|Win32.ActiveCfg = Release|Win32 {5ACBDC4B-75D8-49DC-926F-F6F2CC7F3F99}.Release|Win32.Build.0 = Release|Win32 + {5ACBDC4B-75D8-49DC-926F-F6F2CC7F3F99}.Release|x64.ActiveCfg = Release|Win32 {034B992A-F669-4AC3-B462-49179731066F}.Debug|Win32.ActiveCfg = Debug|Win32 {034B992A-F669-4AC3-B462-49179731066F}.Debug|Win32.Build.0 = Debug|Win32 + {034B992A-F669-4AC3-B462-49179731066F}.Debug|x64.ActiveCfg = Debug|Win32 {034B992A-F669-4AC3-B462-49179731066F}.Release|Win32.ActiveCfg = Release|Win32 {034B992A-F669-4AC3-B462-49179731066F}.Release|Win32.Build.0 = Release|Win32 + {034B992A-F669-4AC3-B462-49179731066F}.Release|x64.ActiveCfg = Release|Win32 {F3A72A50-E295-49BA-ACD7-8696907E0351}.Debug|Win32.ActiveCfg = Debug|Win32 {F3A72A50-E295-49BA-ACD7-8696907E0351}.Debug|Win32.Build.0 = Debug|Win32 + {F3A72A50-E295-49BA-ACD7-8696907E0351}.Debug|x64.ActiveCfg = Debug|Win32 {F3A72A50-E295-49BA-ACD7-8696907E0351}.Release|Win32.ActiveCfg = Release|Win32 {F3A72A50-E295-49BA-ACD7-8696907E0351}.Release|Win32.Build.0 = Release|Win32 + {F3A72A50-E295-49BA-ACD7-8696907E0351}.Release|x64.ActiveCfg = Release|Win32 {A55ACC6B-837D-4784-8E41-66947B1D9B8C}.Debug|Win32.ActiveCfg = Debug|Win32 {A55ACC6B-837D-4784-8E41-66947B1D9B8C}.Debug|Win32.Build.0 = Debug|Win32 + {A55ACC6B-837D-4784-8E41-66947B1D9B8C}.Debug|x64.ActiveCfg = Debug|Win32 {A55ACC6B-837D-4784-8E41-66947B1D9B8C}.Release|Win32.ActiveCfg = Release|Win32 {A55ACC6B-837D-4784-8E41-66947B1D9B8C}.Release|Win32.Build.0 = Release|Win32 + {A55ACC6B-837D-4784-8E41-66947B1D9B8C}.Release|x64.ActiveCfg = Release|Win32 {F9E6874D-60A8-49BA-9393-A2105E63ABCF}.Debug|Win32.ActiveCfg = Debug|Win32 {F9E6874D-60A8-49BA-9393-A2105E63ABCF}.Debug|Win32.Build.0 = Debug|Win32 + {F9E6874D-60A8-49BA-9393-A2105E63ABCF}.Debug|x64.ActiveCfg = Debug|Win32 {F9E6874D-60A8-49BA-9393-A2105E63ABCF}.Release|Win32.ActiveCfg = Release|Win32 {F9E6874D-60A8-49BA-9393-A2105E63ABCF}.Release|Win32.Build.0 = Release|Win32 + {F9E6874D-60A8-49BA-9393-A2105E63ABCF}.Release|x64.ActiveCfg = Release|Win32 {848DCDD6-7142-4507-A75A-6872A9256F3F}.Debug|Win32.ActiveCfg = Debug|Win32 {848DCDD6-7142-4507-A75A-6872A9256F3F}.Debug|Win32.Build.0 = Debug|Win32 + {848DCDD6-7142-4507-A75A-6872A9256F3F}.Debug|x64.ActiveCfg = Debug|Win32 {848DCDD6-7142-4507-A75A-6872A9256F3F}.Release|Win32.ActiveCfg = Release|Win32 {848DCDD6-7142-4507-A75A-6872A9256F3F}.Release|Win32.Build.0 = Release|Win32 + {848DCDD6-7142-4507-A75A-6872A9256F3F}.Release|x64.ActiveCfg = Release|Win32 {AAE3A937-C7CA-4A43-BCFC-C39C253820CC}.Debug|Win32.ActiveCfg = Debug|Win32 {AAE3A937-C7CA-4A43-BCFC-C39C253820CC}.Debug|Win32.Build.0 = Debug|Win32 + {AAE3A937-C7CA-4A43-BCFC-C39C253820CC}.Debug|x64.ActiveCfg = Debug|Win32 {AAE3A937-C7CA-4A43-BCFC-C39C253820CC}.Release|Win32.ActiveCfg = Release|Win32 {AAE3A937-C7CA-4A43-BCFC-C39C253820CC}.Release|Win32.Build.0 = Release|Win32 + {AAE3A937-C7CA-4A43-BCFC-C39C253820CC}.Release|x64.ActiveCfg = Release|Win32 {D31D6BEB-0285-47CF-9817-F8AD2CFDF0E8}.Debug|Win32.ActiveCfg = Debug|Win32 {D31D6BEB-0285-47CF-9817-F8AD2CFDF0E8}.Debug|Win32.Build.0 = Debug|Win32 + {D31D6BEB-0285-47CF-9817-F8AD2CFDF0E8}.Debug|x64.ActiveCfg = Debug|Win32 {D31D6BEB-0285-47CF-9817-F8AD2CFDF0E8}.Release|Win32.ActiveCfg = Release|Win32 {D31D6BEB-0285-47CF-9817-F8AD2CFDF0E8}.Release|Win32.Build.0 = Release|Win32 + {D31D6BEB-0285-47CF-9817-F8AD2CFDF0E8}.Release|x64.ActiveCfg = Release|Win32 {8D24D95E-3C4E-4DC5-ABEF-C35C938C2EBB}.Debug|Win32.ActiveCfg = Debug|Win32 {8D24D95E-3C4E-4DC5-ABEF-C35C938C2EBB}.Debug|Win32.Build.0 = Debug|Win32 + {8D24D95E-3C4E-4DC5-ABEF-C35C938C2EBB}.Debug|x64.ActiveCfg = Debug|Win32 {8D24D95E-3C4E-4DC5-ABEF-C35C938C2EBB}.Release|Win32.ActiveCfg = Release|Win32 {8D24D95E-3C4E-4DC5-ABEF-C35C938C2EBB}.Release|Win32.Build.0 = Release|Win32 + {8D24D95E-3C4E-4DC5-ABEF-C35C938C2EBB}.Release|x64.ActiveCfg = Release|Win32 {6C67B057-CE98-4732-AABF-0E374C718815}.Debug|Win32.ActiveCfg = Debug|Win32 {6C67B057-CE98-4732-AABF-0E374C718815}.Debug|Win32.Build.0 = Debug|Win32 + {6C67B057-CE98-4732-AABF-0E374C718815}.Debug|x64.ActiveCfg = Debug|Win32 {6C67B057-CE98-4732-AABF-0E374C718815}.Release|Win32.ActiveCfg = Release|Win32 {6C67B057-CE98-4732-AABF-0E374C718815}.Release|Win32.Build.0 = Release|Win32 + {6C67B057-CE98-4732-AABF-0E374C718815}.Release|x64.ActiveCfg = Release|Win32 + {D1C528B6-AA02-4D29-9D61-DC08E317A70D}.Debug|Win32.ActiveCfg = Debug|Win32 + {D1C528B6-AA02-4D29-9D61-DC08E317A70D}.Debug|Win32.Build.0 = Debug|Win32 + {D1C528B6-AA02-4D29-9D61-DC08E317A70D}.Debug|x64.ActiveCfg = Debug|Win32 + {D1C528B6-AA02-4D29-9D61-DC08E317A70D}.Release|Win32.ActiveCfg = Release|Win32 + {D1C528B6-AA02-4D29-9D61-DC08E317A70D}.Release|Win32.Build.0 = Release|Win32 + {D1C528B6-AA02-4D29-9D61-DC08E317A70D}.Release|x64.ActiveCfg = Release|Win32 + {DB826A81-E848-4E39-BE17-E779A49E2960}.Debug|Win32.ActiveCfg = Debug|Win32 + {DB826A81-E848-4E39-BE17-E779A49E2960}.Debug|Win32.Build.0 = Debug|Win32 + {DB826A81-E848-4E39-BE17-E779A49E2960}.Debug|x64.ActiveCfg = Debug|Win32 + {DB826A81-E848-4E39-BE17-E779A49E2960}.Release|Win32.ActiveCfg = Release|Win32 + {DB826A81-E848-4E39-BE17-E779A49E2960}.Release|Win32.Build.0 = Release|Win32 + {DB826A81-E848-4E39-BE17-E779A49E2960}.Release|x64.ActiveCfg = Release|Win32 + {F9F3E7B6-EF4C-4BD8-A921-3DE4C4268945}.Debug|Win32.ActiveCfg = Debug|Win32 + {F9F3E7B6-EF4C-4BD8-A921-3DE4C4268945}.Debug|Win32.Build.0 = Debug|Win32 + {F9F3E7B6-EF4C-4BD8-A921-3DE4C4268945}.Debug|x64.ActiveCfg = Debug|Win32 + {F9F3E7B6-EF4C-4BD8-A921-3DE4C4268945}.Release|Win32.ActiveCfg = Release|Win32 + {F9F3E7B6-EF4C-4BD8-A921-3DE4C4268945}.Release|Win32.Build.0 = Release|Win32 + {F9F3E7B6-EF4C-4BD8-A921-3DE4C4268945}.Release|x64.ActiveCfg = Release|Win32 + {6834B003-2511-4745-818D-F418E87DD941}.Debug|Win32.ActiveCfg = Debug|Win32 + {6834B003-2511-4745-818D-F418E87DD941}.Debug|Win32.Build.0 = Debug|Win32 + {6834B003-2511-4745-818D-F418E87DD941}.Debug|x64.ActiveCfg = Debug|Win32 + {6834B003-2511-4745-818D-F418E87DD941}.Release|Win32.ActiveCfg = Release|Win32 + {6834B003-2511-4745-818D-F418E87DD941}.Release|Win32.Build.0 = Release|Win32 + {6834B003-2511-4745-818D-F418E87DD941}.Release|x64.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/tools/rbp/depends.mk xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/tools/rbp/depends.mk --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/tools/rbp/depends.mk 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/tools/rbp/depends.mk 2014-01-04 10:28:12.000000000 +0000 @@ -7,7 +7,7 @@ export CFLAGS+=-isystem$(SYSROOT)/usr/include -isystem$(SYSROOT)/opt/vc/include -isystem$(SDKSTAGE)/opt/vc/include/interface/vcos/pthreads -isystem$(PREFIX)/include -isystem$(PREFIX)/usr/include/mysql --sysroot=$(SYSROOT) export CXXFLAGS=$(CFLAGS) --sysroot=$(SYSROOT) export CPPFLAGS=$(CFLAGS) --sysroot=$(SYSROOT) - export LDFLAGS=-L$(SYSROOT)/opt/vc/lib -L$(XBMCPREFIX)/lib + export LDFLAGS=-Wl,-rpath-link,${SYSROOT}/opt/vc/lib -L$(SYSROOT)/opt/vc/lib -L$(XBMCPREFIX)/lib export LD=$(TOOLCHAIN)/bin/$(HOST)-ld export CC=$(TOOLCHAIN)/bin/$(HOST)-gcc export CXX=$(TOOLCHAIN)/bin/$(HOST)-g++ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/avcodec.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/avcodec.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/avcodec.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/avcodec.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,455 +0,0 @@ -/* - * copyright (c) 2001 Fabrice Bellard - * - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef AVCODEC_AVCODEC_H -#define AVCODEC_AVCODEC_H - -#define LIBAVCODEC_VERSION_MAJOR 53 -#define LIBAVCODEC_VERSION_MINOR 108 -#define LIBAVCODEC_VERSION_MICRO 0 - -enum AVMediaType { - AVMEDIA_TYPE_UNKNOWN = -1, - AVMEDIA_TYPE_VIDEO, - AVMEDIA_TYPE_AUDIO, - AVMEDIA_TYPE_DATA, - AVMEDIA_TYPE_SUBTITLE, - AVMEDIA_TYPE_ATTACHMENT, - AVMEDIA_TYPE_NB -}; - -#define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24)) - -/** - * @file - * external API header - */ - -/** - * @defgroup libavc Encoding/Decoding Library - * @{ - * - * @defgroup lavc_decoding Decoding - * @{ - * @} - * - * @defgroup lavc_encoding Encoding - * @{ - * @} - * - * @defgroup lavc_codec Codecs - * @{ - * @defgroup lavc_codec_native Native Codecs - * @{ - * @} - * @defgroup lavc_codec_wrappers External library wrappers - * @{ - * @} - * @defgroup lavc_codec_hwaccel Hardware Accelerators bridge - * @{ - * @} - * @} - * @defgroup lavc_internal Internal - * @{ - * @} - * @} - * - */ - - -/** - * Identify the syntax and semantics of the bitstream. - * The principle is roughly: - * Two decoders with the same ID can decode the same streams. - * Two encoders with the same ID can encode compatible streams. - * There may be slight deviations from the principle due to implementation - * details. - * - * If you add a codec ID to this list, add it so that - * 1. no value of a existing codec ID changes (that would break ABI), - * 2. Give it a value which when taken as ASCII is recognized uniquely by a human as this specific codec. - * This ensures that 2 forks can independantly add CodecIDs without producing conflicts. - */ -enum CodecID { - CODEC_ID_NONE, - - /* video codecs */ - CODEC_ID_MPEG1VIDEO, - CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding - CODEC_ID_MPEG2VIDEO_XVMC, - CODEC_ID_H261, - CODEC_ID_H263, - CODEC_ID_RV10, - CODEC_ID_RV20, - CODEC_ID_MJPEG, - CODEC_ID_MJPEGB, - CODEC_ID_LJPEG, - CODEC_ID_SP5X, - CODEC_ID_JPEGLS, - CODEC_ID_MPEG4, - CODEC_ID_RAWVIDEO, - CODEC_ID_MSMPEG4V1, - CODEC_ID_MSMPEG4V2, - CODEC_ID_MSMPEG4V3, - CODEC_ID_WMV1, - CODEC_ID_WMV2, - CODEC_ID_H263P, - CODEC_ID_H263I, - CODEC_ID_FLV1, - CODEC_ID_SVQ1, - CODEC_ID_SVQ3, - CODEC_ID_DVVIDEO, - CODEC_ID_HUFFYUV, - CODEC_ID_CYUV, - CODEC_ID_H264, - CODEC_ID_INDEO3, - CODEC_ID_VP3, - CODEC_ID_THEORA, - CODEC_ID_ASV1, - CODEC_ID_ASV2, - CODEC_ID_FFV1, - CODEC_ID_4XM, - CODEC_ID_VCR1, - CODEC_ID_CLJR, - CODEC_ID_MDEC, - CODEC_ID_ROQ, - CODEC_ID_INTERPLAY_VIDEO, - CODEC_ID_XAN_WC3, - CODEC_ID_XAN_WC4, - CODEC_ID_RPZA, - CODEC_ID_CINEPAK, - CODEC_ID_WS_VQA, - CODEC_ID_MSRLE, - CODEC_ID_MSVIDEO1, - CODEC_ID_IDCIN, - CODEC_ID_8BPS, - CODEC_ID_SMC, - CODEC_ID_FLIC, - CODEC_ID_TRUEMOTION1, - CODEC_ID_VMDVIDEO, - CODEC_ID_MSZH, - CODEC_ID_ZLIB, - CODEC_ID_QTRLE, - CODEC_ID_SNOW, - CODEC_ID_TSCC, - CODEC_ID_ULTI, - CODEC_ID_QDRAW, - CODEC_ID_VIXL, - CODEC_ID_QPEG, - CODEC_ID_PNG, - CODEC_ID_PPM, - CODEC_ID_PBM, - CODEC_ID_PGM, - CODEC_ID_PGMYUV, - CODEC_ID_PAM, - CODEC_ID_FFVHUFF, - CODEC_ID_RV30, - CODEC_ID_RV40, - CODEC_ID_VC1, - CODEC_ID_WMV3, - CODEC_ID_LOCO, - CODEC_ID_WNV1, - CODEC_ID_AASC, - CODEC_ID_INDEO2, - CODEC_ID_FRAPS, - CODEC_ID_TRUEMOTION2, - CODEC_ID_BMP, - CODEC_ID_CSCD, - CODEC_ID_MMVIDEO, - CODEC_ID_ZMBV, - CODEC_ID_AVS, - CODEC_ID_SMACKVIDEO, - CODEC_ID_NUV, - CODEC_ID_KMVC, - CODEC_ID_FLASHSV, - CODEC_ID_CAVS, - CODEC_ID_JPEG2000, - CODEC_ID_VMNC, - CODEC_ID_VP5, - CODEC_ID_VP6, - CODEC_ID_VP6F, - CODEC_ID_TARGA, - CODEC_ID_DSICINVIDEO, - CODEC_ID_TIERTEXSEQVIDEO, - CODEC_ID_TIFF, - CODEC_ID_GIF, -#if LIBAVCODEC_VERSION_MAJOR == 53 - CODEC_ID_FFH264, -#endif - CODEC_ID_DXA, - CODEC_ID_DNXHD, - CODEC_ID_THP, - CODEC_ID_SGI, - CODEC_ID_C93, - CODEC_ID_BETHSOFTVID, - CODEC_ID_PTX, - CODEC_ID_TXD, - CODEC_ID_VP6A, - CODEC_ID_AMV, - CODEC_ID_VB, - CODEC_ID_PCX, - CODEC_ID_SUNRAST, - CODEC_ID_INDEO4, - CODEC_ID_INDEO5, - CODEC_ID_MIMIC, - CODEC_ID_RL2, -#if LIBAVCODEC_VERSION_MAJOR == 53 - CODEC_ID_8SVX_EXP, - CODEC_ID_8SVX_FIB, -#endif - CODEC_ID_ESCAPE124, - CODEC_ID_DIRAC, - CODEC_ID_BFI, - CODEC_ID_CMV, - CODEC_ID_MOTIONPIXELS, - CODEC_ID_TGV, - CODEC_ID_TGQ, - CODEC_ID_TQI, - CODEC_ID_AURA, - CODEC_ID_AURA2, - CODEC_ID_V210X, - CODEC_ID_TMV, - CODEC_ID_V210, - CODEC_ID_DPX, - CODEC_ID_MAD, - CODEC_ID_FRWU, - CODEC_ID_FLASHSV2, - CODEC_ID_CDGRAPHICS, - CODEC_ID_R210, - CODEC_ID_ANM, - CODEC_ID_BINKVIDEO, - CODEC_ID_IFF_ILBM, - CODEC_ID_IFF_BYTERUN1, - CODEC_ID_KGV1, - CODEC_ID_YOP, - CODEC_ID_VP8, - CODEC_ID_PICTOR, - CODEC_ID_ANSI, - CODEC_ID_A64_MULTI, - CODEC_ID_A64_MULTI5, - CODEC_ID_R10K, - CODEC_ID_MXPEG, - CODEC_ID_LAGARITH, - CODEC_ID_PRORES, - CODEC_ID_JV, - CODEC_ID_DFA, - CODEC_ID_WMV3IMAGE, - CODEC_ID_VC1IMAGE, -#if LIBAVCODEC_VERSION_MAJOR == 53 - CODEC_ID_G723_1_DEPRECATED, - CODEC_ID_G729_DEPRECATED, -#endif - CODEC_ID_UTVIDEO_DEPRECATED, - CODEC_ID_BMV_VIDEO, - CODEC_ID_VBLE, - CODEC_ID_DXTORY, - CODEC_ID_V410, - CODEC_ID_XWD, - CODEC_ID_Y41P = MKBETAG('Y','4','1','P'), - CODEC_ID_UTVIDEO = 0x800, - CODEC_ID_ESCAPE130 = MKBETAG('E','1','3','0'), - CODEC_ID_AVRP = MKBETAG('A','V','R','P'), - - CODEC_ID_G2M = MKBETAG( 0 ,'G','2','M'), - CODEC_ID_V308 = MKBETAG('V','3','0','8'), - CODEC_ID_YUV4 = MKBETAG('Y','U','V','4'), - - /* various PCM "codecs" */ - CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs - CODEC_ID_PCM_S16LE = 0x10000, - CODEC_ID_PCM_S16BE, - CODEC_ID_PCM_U16LE, - CODEC_ID_PCM_U16BE, - CODEC_ID_PCM_S8, - CODEC_ID_PCM_U8, - CODEC_ID_PCM_MULAW, - CODEC_ID_PCM_ALAW, - CODEC_ID_PCM_S32LE, - CODEC_ID_PCM_S32BE, - CODEC_ID_PCM_U32LE, - CODEC_ID_PCM_U32BE, - CODEC_ID_PCM_S24LE, - CODEC_ID_PCM_S24BE, - CODEC_ID_PCM_U24LE, - CODEC_ID_PCM_U24BE, - CODEC_ID_PCM_S24DAUD, - CODEC_ID_PCM_ZORK, - CODEC_ID_PCM_S16LE_PLANAR, - CODEC_ID_PCM_DVD, - CODEC_ID_PCM_F32BE, - CODEC_ID_PCM_F32LE, - CODEC_ID_PCM_F64BE, - CODEC_ID_PCM_F64LE, - CODEC_ID_PCM_BLURAY, - CODEC_ID_PCM_LXF, - CODEC_ID_S302M, - CODEC_ID_PCM_S8_PLANAR, - - /* various ADPCM codecs */ - CODEC_ID_ADPCM_IMA_QT = 0x11000, - CODEC_ID_ADPCM_IMA_WAV, - CODEC_ID_ADPCM_IMA_DK3, - CODEC_ID_ADPCM_IMA_DK4, - CODEC_ID_ADPCM_IMA_WS, - CODEC_ID_ADPCM_IMA_SMJPEG, - CODEC_ID_ADPCM_MS, - CODEC_ID_ADPCM_4XM, - CODEC_ID_ADPCM_XA, - CODEC_ID_ADPCM_ADX, - CODEC_ID_ADPCM_EA, - CODEC_ID_ADPCM_G726, - CODEC_ID_ADPCM_CT, - CODEC_ID_ADPCM_SWF, - CODEC_ID_ADPCM_YAMAHA, - CODEC_ID_ADPCM_SBPRO_4, - CODEC_ID_ADPCM_SBPRO_3, - CODEC_ID_ADPCM_SBPRO_2, - CODEC_ID_ADPCM_THP, - CODEC_ID_ADPCM_IMA_AMV, - CODEC_ID_ADPCM_EA_R1, - CODEC_ID_ADPCM_EA_R3, - CODEC_ID_ADPCM_EA_R2, - CODEC_ID_ADPCM_IMA_EA_SEAD, - CODEC_ID_ADPCM_IMA_EA_EACS, - CODEC_ID_ADPCM_EA_XAS, - CODEC_ID_ADPCM_EA_MAXIS_XA, - CODEC_ID_ADPCM_IMA_ISS, - CODEC_ID_ADPCM_G722, - CODEC_ID_ADPCM_IMA_APC, - - /* AMR */ - CODEC_ID_AMR_NB = 0x12000, - CODEC_ID_AMR_WB, - - /* RealAudio codecs*/ - CODEC_ID_RA_144 = 0x13000, - CODEC_ID_RA_288, - - /* various DPCM codecs */ - CODEC_ID_ROQ_DPCM = 0x14000, - CODEC_ID_INTERPLAY_DPCM, - CODEC_ID_XAN_DPCM, - CODEC_ID_SOL_DPCM, - - /* audio codecs */ - CODEC_ID_MP2 = 0x15000, - CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3 - CODEC_ID_AAC, - CODEC_ID_AC3, - CODEC_ID_DTS, - CODEC_ID_VORBIS, - CODEC_ID_DVAUDIO, - CODEC_ID_WMAV1, - CODEC_ID_WMAV2, - CODEC_ID_MACE3, - CODEC_ID_MACE6, - CODEC_ID_VMDAUDIO, -#if LIBAVCODEC_VERSION_MAJOR == 53 - CODEC_ID_SONIC, - CODEC_ID_SONIC_LS, -#endif - CODEC_ID_FLAC, - CODEC_ID_MP3ADU, - CODEC_ID_MP3ON4, - CODEC_ID_SHORTEN, - CODEC_ID_ALAC, - CODEC_ID_WESTWOOD_SND1, - CODEC_ID_GSM, ///< as in Berlin toast format - CODEC_ID_QDM2, - CODEC_ID_COOK, - CODEC_ID_TRUESPEECH, - CODEC_ID_TTA, - CODEC_ID_SMACKAUDIO, - CODEC_ID_QCELP, - CODEC_ID_WAVPACK, - CODEC_ID_DSICINAUDIO, - CODEC_ID_IMC, - CODEC_ID_MUSEPACK7, - CODEC_ID_MLP, - CODEC_ID_GSM_MS, /* as found in WAV */ - CODEC_ID_ATRAC3, - CODEC_ID_VOXWARE, - CODEC_ID_APE, - CODEC_ID_NELLYMOSER, - CODEC_ID_MUSEPACK8, - CODEC_ID_SPEEX, - CODEC_ID_WMAVOICE, - CODEC_ID_WMAPRO, - CODEC_ID_WMALOSSLESS, - CODEC_ID_ATRAC3P, - CODEC_ID_EAC3, - CODEC_ID_SIPR, - CODEC_ID_MP1, - CODEC_ID_TWINVQ, - CODEC_ID_TRUEHD, - CODEC_ID_MP4ALS, - CODEC_ID_ATRAC1, - CODEC_ID_BINKAUDIO_RDFT, - CODEC_ID_BINKAUDIO_DCT, - CODEC_ID_AAC_LATM, - CODEC_ID_QDMC, - CODEC_ID_CELT, -#if LIBAVCODEC_VERSION_MAJOR > 53 - CODEC_ID_G723_1_DEPRECATED, - CODEC_ID_G729_DEPRECATED, - CODEC_ID_8SVX_EXP, - CODEC_ID_8SVX_FIB, -#endif - CODEC_ID_BMV_AUDIO, - CODEC_ID_G729 = 0x15800, - CODEC_ID_G723_1= 0x15801, - CODEC_ID_FFWAVESYNTH = MKBETAG('F','F','W','S'), - CODEC_ID_8SVX_RAW = MKBETAG('8','S','V','X'), - - /* subtitle codecs */ - CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs. - CODEC_ID_DVD_SUBTITLE = 0x17000, - CODEC_ID_DVB_SUBTITLE, - CODEC_ID_TEXT, ///< raw UTF-8 text - CODEC_ID_XSUB, - CODEC_ID_SSA, - CODEC_ID_MOV_TEXT, - CODEC_ID_HDMV_PGS_SUBTITLE, - CODEC_ID_DVB_TELETEXT, - CODEC_ID_SRT, - CODEC_ID_MICRODVD = MKBETAG('m','D','V','D'), - - /* data codecs */ - CODEC_ID_VBI_DATA= 0x17500, - CODEC_ID_VBI_TELETEXT, - - /* other specific kind of codecs (generally used for attachments) */ - CODEC_ID_FIRST_UNKNOWN = 0x18000, ///< A dummy ID pointing at the start of various fake codecs. - CODEC_ID_TTF = 0x18000, - CODEC_ID_BINTEXT = MKBETAG('B','T','X','T'), - CODEC_ID_XBIN = MKBETAG('X','B','I','N'), - CODEC_ID_IDF = MKBETAG( 0 ,'I','D','F'), - - CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like CODEC_ID_NONE) but lavf should attempt to identify it - - CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS - * stream (only used by libavformat) */ - CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems - * stream (only used by libavformat) */ - CODEC_ID_FFMETADATA = 0x21000, ///< Dummy codec for streams containing only metadata information. -}; - -#endif - diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/DVDDemuxPacket.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/DVDDemuxPacket.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/DVDDemuxPacket.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/DVDDemuxPacket.h 2014-01-04 10:28:12.000000000 +0000 @@ -1,8 +1,8 @@ #pragma once /* - * Copyright (C) 2012 Team XBMC - * http://www.xbmc.org + * Copyright (C) 2012-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/libXBMC_addon.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/libXBMC_addon.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/libXBMC_addon.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/libXBMC_addon.h 2014-01-28 20:43:50.000000000 +0000 @@ -1,7 +1,7 @@ #pragma once /* - * Copyright (C) 2005-2010 Team XBMC - * http://www.xbmc.org + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -42,6 +42,16 @@ #else #define ADDON_HELPER_ARCH "x86-osx" #endif +#elif defined(__FreeBSD__) // freebsd +#if defined(__x86_64__) +#define ADDON_HELPER_ARCH "x86_64-freebsd" +#elif defined(_POWERPC) +#define ADDON_HELPER_ARCH "powerpc-freebsd" +#elif defined(_POWERPC64) +#define ADDON_HELPER_ARCH "powerpc64-freebsd" +#else +#define ADDON_HELPER_ARCH "i386-freebsd" +#endif #else // linux #if defined(__x86_64__) #define ADDON_HELPER_ARCH "x86_64-linux" @@ -158,6 +168,10 @@ dlsym(m_libXBMC_addon, "XBMC_queue_notification"); if (XBMC_queue_notification == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + XBMC_wake_on_lan = (bool (*)(void* HANDLE, void *CB, const char *mac)) + dlsym(m_libXBMC_addon, "XBMC_wake_on_lan"); + if (XBMC_wake_on_lan == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + XBMC_unknown_to_utf8 = (char* (*)(void* HANDLE, void* CB, const char* str)) dlsym(m_libXBMC_addon, "XBMC_unknown_to_utf8"); if (XBMC_unknown_to_utf8 == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } @@ -296,6 +310,16 @@ } /*! + * @brief Send WakeOnLan magic packet. + * @param mac Network address of the host to wake. + * @return True if the magic packet was successfully sent, false otherwise. + */ + bool WakeOnLan(const char* mac) + { + return XBMC_wake_on_lan(m_Handle, m_Callbacks, mac); + } + + /*! * @brief Translate a string with an unknown encoding to UTF8. * @param str The string to translate. * @return The string translated to UTF8. Must be freed by calling FreeString() when done. @@ -541,6 +565,7 @@ void (*XBMC_log)(void *HANDLE, void* CB, const addon_log_t loglevel, const char *msg); bool (*XBMC_get_setting)(void *HANDLE, void* CB, const char* settingName, void *settingValue); void (*XBMC_queue_notification)(void *HANDLE, void* CB, const queue_msg_t type, const char *msg); + bool (*XBMC_wake_on_lan)(void *HANDLE, void* CB, const char* mac); char* (*XBMC_unknown_to_utf8)(void *HANDLE, void* CB, const char* str); char* (*XBMC_get_localized_string)(void *HANDLE, void* CB, int dwCode); char* (*XBMC_get_dvd_menu_language)(void *HANDLE, void* CB); diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/libXBMC_codec.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/libXBMC_codec.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/libXBMC_codec.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/libXBMC_codec.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,124 @@ +#pragma once +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include +#include +#include +#include +#include +#include "xbmc_codec_types.h" +#include "libXBMC_addon.h" + +#ifdef _WIN32 +#define CODEC_HELPER_DLL "\\library.xbmc.codec\\libXBMC_codec" ADDON_HELPER_EXT +#else +#define CODEC_HELPER_DLL_NAME "libXBMC_codec-" ADDON_HELPER_ARCH ADDON_HELPER_EXT +#define CODEC_HELPER_DLL "/library.xbmc.codec/" CODEC_HELPER_DLL_NAME +#endif + +class CHelper_libXBMC_codec +{ +public: + CHelper_libXBMC_codec(void) + { + m_libXBMC_codec = NULL; + m_Handle = NULL; + } + + ~CHelper_libXBMC_codec(void) + { + if (m_libXBMC_codec) + { + CODEC_unregister_me(m_Handle, m_Callbacks); + dlclose(m_libXBMC_codec); + } + } + + /*! + * @brief Resolve all callback methods + * @param handle Pointer to the add-on + * @return True when all methods were resolved, false otherwise. + */ + bool RegisterMe(void* handle) + { + m_Handle = handle; + + std::string libBasePath; + libBasePath = ((cb_array*)m_Handle)->libPath; + libBasePath += CODEC_HELPER_DLL; + +#if defined(ANDROID) + struct stat st; + if(stat(libBasePath.c_str(),&st) != 0) + { + std::string tempbin = getenv("XBMC_ANDROID_LIBS"); + libBasePath = tempbin + "/" + CODEC_HELPER_DLL_NAME; + } +#endif + + m_libXBMC_codec = dlopen(libBasePath.c_str(), RTLD_LAZY); + if (m_libXBMC_codec == NULL) + { + fprintf(stderr, "Unable to load %s\n", dlerror()); + return false; + } + + CODEC_register_me = (void* (*)(void *HANDLE)) + dlsym(m_libXBMC_codec, "CODEC_register_me"); + if (CODEC_register_me == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + CODEC_unregister_me = (void (*)(void* HANDLE, void* CB)) + dlsym(m_libXBMC_codec, "CODEC_unregister_me"); + if (CODEC_unregister_me == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + CODEC_get_codec_by_name = (xbmc_codec_t (*)(void* HANDLE, void* CB, const char* strCodecName)) + dlsym(m_libXBMC_codec, "CODEC_get_codec_by_name"); + if (CODEC_get_codec_by_name == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + m_Callbacks = CODEC_register_me(m_Handle); + return m_Callbacks != NULL; + } + + /*! + * @brief Get the codec id used by XBMC + * @param strCodecName The name of the codec + * @return The codec_id, or a codec_id with 0 values when not supported + */ + xbmc_codec_t GetCodecByName(const char* strCodecName) + { + return CODEC_get_codec_by_name(m_Handle, m_Callbacks, strCodecName); + } + +protected: + void* (*CODEC_register_me)(void*); + void (*CODEC_unregister_me)(void*, void*); + xbmc_codec_t (*CODEC_get_codec_by_name)(void *HANDLE, void* CB, const char* strCodecName); + +private: + void* m_libXBMC_codec; + void* m_Handle; + void* m_Callbacks; + struct cb_array + { + const char* libPath; + }; +}; + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/libXBMC_gui.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/libXBMC_gui.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/libXBMC_gui.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/libXBMC_gui.h 2014-01-04 10:28:12.000000000 +0000 @@ -1,7 +1,7 @@ #pragma once /* - * Copyright (C) 2005-2010 Team XBMC - * http://www.xbmc.org + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -35,6 +35,12 @@ #define GUI_HELPER_DLL "/library.xbmc.gui/" GUI_HELPER_DLL_NAME #endif +/* current ADDONGUI API version */ +#define XBMC_GUI_API_VERSION "5.0.1" + +/* min. ADDONGUI API version */ +#define XBMC_GUI_MIN_API_VERSION "5.0.1" + #define ADDON_ACTION_PREVIOUS_MENU 10 #define ADDON_ACTION_CLOSE_DIALOG 51 @@ -43,6 +49,7 @@ class CAddonGUIRadioButton; class CAddonGUIProgressControl; class CAddonListItem; +class CAddonGUIRenderingControl; class CHelper_libXBMC_gui { @@ -154,6 +161,14 @@ dlsym(m_libXBMC_gui, "GUI_ListItem_destroy"); if (GUI_ListItem_destroy == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + GUI_control_get_rendering = (CAddonGUIRenderingControl* (*)(void *HANDLE, void *CB, CAddonGUIWindow *window, int controlId)) + dlsym(m_libXBMC_gui, "GUI_control_get_rendering"); + if (GUI_control_get_rendering == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + + GUI_control_release_rendering = (void (*)(CAddonGUIRenderingControl* p)) + dlsym(m_libXBMC_gui, "GUI_control_release_rendering"); + if (GUI_control_release_rendering == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; } + m_Callbacks = GUI_register_me(m_Handle); return m_Callbacks != NULL; @@ -234,6 +249,16 @@ return GUI_ListItem_destroy(p); } + CAddonGUIRenderingControl* Control_getRendering(CAddonGUIWindow *window, int controlId) + { + return GUI_control_get_rendering(m_Handle, m_Callbacks, window, controlId); + } + + void Control_releaseRendering(CAddonGUIRenderingControl* p) + { + return GUI_control_release_rendering(p); + } + protected: void* (*GUI_register_me)(void *HANDLE); void (*GUI_unregister_me)(void *HANDLE, void* CB); @@ -252,6 +277,8 @@ void (*GUI_control_release_progress)(CAddonGUIProgressControl* p); CAddonListItem* (*GUI_ListItem_create)(void *HANDLE, void* CB, const char *label, const char *label2, const char *iconImage, const char *thumbnailImage, const char *path); void (*GUI_ListItem_destroy)(CAddonListItem* p); + CAddonGUIRenderingControl* (*GUI_control_get_rendering)(void *HANDLE, void* CB, CAddonGUIWindow *window, int controlId); + void (*GUI_control_release_rendering)(CAddonGUIRenderingControl* p); private: void *m_libXBMC_gui; @@ -355,6 +382,7 @@ friend class CAddonGUISpinControl; friend class CAddonGUIRadioButton; friend class CAddonGUIProgressControl; +friend class CAddonGUIRenderingControl; public: CAddonGUIWindow(void *hdl, void *cb, const char *xmlFilename, const char *defaultSkin, bool forceFallback, bool asDialog); @@ -385,6 +413,7 @@ virtual void SetCurrentListPosition(int listPos); virtual int GetCurrentListPosition(); virtual void SetControlLabel(int controlId, const char *label); + virtual void MarkDirtyRegion(); virtual bool OnClick(int controlId); virtual bool OnFocus(int controlId); @@ -402,3 +431,29 @@ void *m_Handle; void *m_cb; }; + +class CAddonGUIRenderingControl +{ +public: + CAddonGUIRenderingControl(void *hdl, void *cb, CAddonGUIWindow *window, int controlId); + virtual ~CAddonGUIRenderingControl(); + virtual void Init(); + + virtual bool Create(int x, int y, int w, int h, void *device); + virtual void Render(); + virtual void Stop(); + virtual bool Dirty(); + + GUIHANDLE m_cbhdl; + bool (*CBCreate)(GUIHANDLE cbhdl, int x, int y, int w, int h, void *device); + void (*CBRender)(GUIHANDLE cbhdl); + void (*CBStop)(GUIHANDLE cbhdl); + bool (*CBDirty)(GUIHANDLE cbhdl); + +private: + CAddonGUIWindow *m_Window; + int m_ControlId; + GUIHANDLE m_RenderingHandle; + void *m_Handle; + void *m_cb; +}; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/libXBMC_pvr.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/libXBMC_pvr.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/libXBMC_pvr.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/libXBMC_pvr.h 2014-01-04 10:28:12.000000000 +0000 @@ -1,7 +1,7 @@ #pragma once /* - * Copyright (C) 2005-2010 Team XBMC - * http://www.xbmc.org + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_addon_cpp_dll.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_addon_cpp_dll.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_addon_cpp_dll.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_addon_cpp_dll.h 2014-01-04 10:28:12.000000000 +0000 @@ -2,8 +2,8 @@ #define __XBMC_ADDON_CPP_H__ /* - * Copyright (C) 2005-2012 Team XBMC - * http://www.xbmc.org + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_addon_dll.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_addon_dll.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_addon_dll.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_addon_dll.h 2014-01-04 10:28:12.000000000 +0000 @@ -2,8 +2,8 @@ #define __XBMC_ADDON_DLL_H__ /* - * Copyright (C) 2005-2012 Team XBMC - * http://www.xbmc.org + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,7 +21,7 @@ * */ -#ifdef _WIN32 +#ifdef TARGET_WINDOWS #include #else #ifndef __cdecl @@ -46,6 +46,7 @@ unsigned int __declspec(dllexport) ADDON_GetSettings(ADDON_StructSetting ***sSet); ADDON_STATUS __declspec(dllexport) ADDON_SetSetting(const char *settingName, const void *settingValue); void __declspec(dllexport) ADDON_FreeSettings(); + void __declspec(dllexport) ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data); #ifdef __cplusplus }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_addon_types.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_addon_types.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_addon_types.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_addon_types.h 2014-01-04 10:28:12.000000000 +0000 @@ -2,8 +2,8 @@ #define __XBMC_ADDON_TYPES_H__ /* - * Copyright (C) 2005-2012 Team XBMC - * http://www.xbmc.org + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_codec_descriptor.hpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_codec_descriptor.hpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_codec_descriptor.hpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_codec_descriptor.hpp 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ +#ifndef XBMC_CODEC_DESCRIPTOR_HPP +#define XBMC_CODEC_DESCRIPTOR_HPP + +#include "libXBMC_codec.h" + +/** + * Adapter which converts codec names used by tvheadend and VDR into their + * FFmpeg equivalents. + */ +class CodecDescriptor +{ +public: + CodecDescriptor(void) + { + m_codec.codec_id = XBMC_INVALID_CODEC_ID; + m_codec.codec_type = XBMC_CODEC_TYPE_UNKNOWN; + } + + CodecDescriptor(xbmc_codec_t codec, const char* name) : + m_codec(codec), + m_strName(name) {} + virtual ~CodecDescriptor(void) {} + + const std::string& Name(void) const { return m_strName; } + xbmc_codec_t Codec(void) const { return m_codec; } + + static CodecDescriptor GetCodecByName(const char* strCodecName) + { + CodecDescriptor retVal; + // some of Tvheadend's and VDR's codec names don't match ffmpeg's, so translate them to something ffmpeg understands + if (!strcmp(strCodecName, "MPEG2AUDIO")) + retVal = CodecDescriptor(CODEC->GetCodecByName("MP2"), strCodecName); + else if (!strcmp(strCodecName, "MPEGTS")) + retVal = CodecDescriptor(CODEC->GetCodecByName("MPEG2VIDEO"), strCodecName); + else if (!strcmp(strCodecName, "TEXTSUB")) + retVal = CodecDescriptor(CODEC->GetCodecByName("TEXT"), strCodecName); + else + retVal = CodecDescriptor(CODEC->GetCodecByName(strCodecName), strCodecName); + + return retVal; + } + +private: + xbmc_codec_t m_codec; + std::string m_strName; +}; + +#endif /* XBMC_CODEC_DESCRIPTOR_HPP */ diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_codec_types.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_codec_types.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_codec_types.h 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_codec_types.h 2014-01-04 10:28:12.000000000 +0000 @@ -0,0 +1,54 @@ +#ifndef __XBMC_CODEC_TYPES_H__ +#define __XBMC_CODEC_TYPES_H__ + +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef unsigned int xbmc_codec_id_t; + +typedef enum +{ + XBMC_CODEC_TYPE_UNKNOWN = -1, + XBMC_CODEC_TYPE_VIDEO, + XBMC_CODEC_TYPE_AUDIO, + XBMC_CODEC_TYPE_DATA, + XBMC_CODEC_TYPE_SUBTITLE, + XBMC_CODEC_TYPE_NB +} xbmc_codec_type_t; + +typedef struct +{ + xbmc_codec_type_t codec_type; + xbmc_codec_id_t codec_id; +} xbmc_codec_t; + +#define XBMC_INVALID_CODEC_ID 0 +#define XBMC_INVALID_CODEC { XBMC_CODEC_TYPE_UNKNOWN, XBMC_INVALID_CODEC_ID } + +#ifdef __cplusplus +}; +#endif + +#endif + diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_epg_types.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_epg_types.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_epg_types.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_epg_types.h 2014-01-04 10:28:12.000000000 +0000 @@ -1,7 +1,7 @@ #pragma once /* - * Copyright (C) 2005-2012 Team XBMC - * http://www.xbmc.org + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_pvr_dll.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_pvr_dll.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_pvr_dll.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_pvr_dll.h 2014-01-04 10:28:12.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Copyright (C) 2005-2012 Team XBMC - * http://www.xbmc.org + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -51,6 +51,22 @@ const char* GetMininumPVRAPIVersion(void); /*! + * Get the XBMC_GUI_API_VERSION that was used to compile this add-on. + * Used to check if this add-on is compatible with XBMC. + * @return The XBMC_GUI_API_VERSION that was used to compile this add-on. + * @remarks Valid implementation required. + */ + const char* GetGUIAPIVersion(void); + + /*! + * Get the XBMC_GUI_MIN_API_VERSION that was used to compile this add-on. + * Used to check if this add-on is compatible with XBMC. + * @return The XBMC_GUI_MIN_API_VERSION that was used to compile this add-on. + * @remarks Valid implementation required. + */ + const char* GetMininumGUIAPIVersion(void); + + /*! * Get the list of features that this add-on provides. * Called by XBMC to query the add-on's capabilities. * Used to check which options should be presented in the UI, which methods to call, etc. @@ -92,10 +108,11 @@ * Call one of the menu hooks (if supported). * Supported PVR_MENUHOOK instances have to be added in ADDON_Create(), by calling AddMenuHook() on the callback. * @param menuhook The hook to call. + * @param item The selected item for which the hook was called. * @return PVR_ERROR_NO_ERROR if the hook was called successfully. * @remarks Optional. Return PVR_ERROR_NOT_IMPLEMENTED if this add-on won't provide this function. */ - PVR_ERROR CallMenuHook(const PVR_MENUHOOK& menuhook); + PVR_ERROR CallMenuHook(const PVR_MENUHOOK& menuhook, const PVR_MENUHOOK_DATA &item); //@} /*! @name PVR EPG methods @@ -284,6 +301,16 @@ */ int GetRecordingLastPlayedPosition(const PVR_RECORDING& recording); + /*! + * Retrieve the edit decision list (EDL) of a recording on the backend. + * @param recording The recording. + * @param edl out: The function has to write the EDL list into this array. + * @param size in: The maximum size of the EDL, out: the actual size of the EDL. + * @return PVR_ERROR_NO_ERROR if the EDL was successfully read. + * @remarks Required if bSupportsRecordingEdl is set to true. Return PVR_ERROR_NOT_IMPLEMENTED if this add-on won't provide this function. + */ + PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY edl[], int *size); + //@} /** @name PVR timer methods * @remarks Only used by XBMC is bSupportsTimers is set to true. @@ -549,6 +576,25 @@ void SetSpeed(int speed); /*! + * Get actual playing time from addon. With timeshift enabled this is + * different to live. + * @return time as UTC + */ + time_t GetPlayingTime(); + + /*! + * Get time of oldest packet in timeshift buffer + * @return time as UTC + */ + time_t GetBufferTimeStart(); + + /*! + * Get time of latest packet in timeshift buffer + * @return time as UTC + */ + time_t GetBufferTimeEnd(); + + /*! * Called by XBMC to assign the function pointers of this add-on to pClient. * @param pClient The struct to assign the function pointers to. */ @@ -556,6 +602,8 @@ { pClient->GetPVRAPIVersion = GetPVRAPIVersion; pClient->GetMininumPVRAPIVersion = GetMininumPVRAPIVersion; + pClient->GetGUIAPIVersion = GetGUIAPIVersion; + pClient->GetMininumGUIAPIVersion = GetMininumGUIAPIVersion; pClient->GetAddonCapabilities = GetAddonCapabilities; pClient->GetStreamProperties = GetStreamProperties; pClient->GetConnectionString = GetConnectionString; @@ -586,6 +634,7 @@ pClient->SetRecordingPlayCount = SetRecordingPlayCount; pClient->SetRecordingLastPlayedPosition = SetRecordingLastPlayedPosition; pClient->GetRecordingLastPlayedPosition = GetRecordingLastPlayedPosition; + pClient->GetRecordingEdl = GetRecordingEdl; pClient->GetTimersAmount = GetTimersAmount; pClient->GetTimers = GetTimers; @@ -621,6 +670,10 @@ pClient->DemuxAbort = DemuxAbort; pClient->DemuxFlush = DemuxFlush; pClient->DemuxRead = DemuxRead; + + pClient->GetPlayingTime = GetPlayingTime; + pClient->GetBufferTimeStart = GetBufferTimeStart; + pClient->GetBufferTimeEnd = GetBufferTimeEnd; }; }; diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_pvr_types.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_pvr_types.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_pvr_types.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_pvr_types.h 2014-01-04 10:28:12.000000000 +0000 @@ -1,7 +1,7 @@ #pragma once /* - * Copyright (C) 2005-2012 Team XBMC - * http://www.xbmc.org + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ #ifndef __PVRCLIENT_TYPES_H__ #define __PVRCLIENT_TYPES_H__ -#ifdef _WIN32 +#ifdef TARGET_WINDOWS #include #else #ifndef __cdecl @@ -33,9 +33,11 @@ #endif #endif #include +#include #include "xbmc_addon_types.h" #include "xbmc_epg_types.h" +#include "xbmc_codec_types.h" /*! @note Define "USE_DEMUX" at compile time if demuxing in the PVR add-on is used. * Also XBMC's "DVDDemuxPacket.h" file must be in the include path of the add-on, @@ -67,15 +69,16 @@ #define PVR_ADDON_URL_STRING_LENGTH 1024 #define PVR_ADDON_DESC_STRING_LENGTH 1024 #define PVR_ADDON_INPUT_FORMAT_STRING_LENGTH 32 +#define PVR_ADDON_EDL_LENGTH 32 /* using the default avformat's MAX_STREAMS value to be safe */ #define PVR_STREAM_MAX_STREAMS 20 /* current PVR API version */ -#define XBMC_PVR_API_VERSION "1.6.0" +#define XBMC_PVR_API_VERSION "1.9.0" /* min. PVR API version */ -#define XBMC_PVR_MIN_API_VERSION "1.6.0" +#define XBMC_PVR_MIN_API_VERSION "1.9.0" #ifdef __cplusplus extern "C" { @@ -119,6 +122,7 @@ */ typedef enum { + PVR_MENUHOOK_UNKNOWN =-1, /*!< @brief unknown menu hook */ PVR_MENUHOOK_ALL = 0, /*!< @brief all categories */ PVR_MENUHOOK_CHANNEL = 1, /*!< @brief for channels */ PVR_MENUHOOK_TIMER = 2, /*!< @brief for timers */ @@ -154,6 +158,7 @@ bool bSupportsRecordingFolders; /*!< @brief true if the backend supports timers / recordings in folders. */ bool bSupportsRecordingPlayCount; /*!< @brief true if the backend supports play count for recordings. */ bool bSupportsLastPlayedPosition; /*!< @brief true if the backend supports store/retrieve of last played position for recordings. */ + bool bSupportsRecordingEdl; /*!< @brief true if the backend supports retrieving an edit decision list for recordings. */ } ATTRIBUTE_PACKED PVR_ADDON_CAPABILITIES; /*! @@ -164,22 +169,22 @@ unsigned int iStreamCount; struct PVR_STREAM { - unsigned int iPhysicalId; /*!< @brief (required) physical index */ - unsigned int iCodecType; /*!< @brief (required) codec type id */ - unsigned int iCodecId; /*!< @brief (required) codec id */ - char strLanguage[4]; /*!< @brief (required) language id */ - int iIdentifier; /*!< @brief (required) stream id */ - int iFPSScale; /*!< @brief (required) scale of 1000 and a rate of 29970 will result in 29.97 fps */ - int iFPSRate; /*!< @brief (required) FPS rate */ - int iHeight; /*!< @brief (required) height of the stream reported by the demuxer */ - int iWidth; /*!< @brief (required) width of the stream reported by the demuxer */ - float fAspect; /*!< @brief (required) display aspect ratio of the stream */ - int iChannels; /*!< @brief (required) amount of channels */ - int iSampleRate; /*!< @brief (required) sample rate */ - int iBlockAlign; /*!< @brief (required) block alignment */ - int iBitRate; /*!< @brief (required) bit rate */ - int iBitsPerSample; /*!< @brief (required) bits per sample */ - } stream[PVR_STREAM_MAX_STREAMS]; /*!< @brief (required) the streams */ + unsigned int iPhysicalId; /*!< @brief (required) physical index */ + xbmc_codec_type_t iCodecType; /*!< @brief (required) codec type this stream */ + xbmc_codec_id_t iCodecId; /*!< @brief (required) codec id of this stream */ + char strLanguage[4]; /*!< @brief (required) language id */ + int iIdentifier; /*!< @brief (required) stream id */ + int iFPSScale; /*!< @brief (required) scale of 1000 and a rate of 29970 will result in 29.97 fps */ + int iFPSRate; /*!< @brief (required) FPS rate */ + int iHeight; /*!< @brief (required) height of the stream reported by the demuxer */ + int iWidth; /*!< @brief (required) width of the stream reported by the demuxer */ + float fAspect; /*!< @brief (required) display aspect ratio of the stream */ + int iChannels; /*!< @brief (required) amount of channels */ + int iSampleRate; /*!< @brief (required) sample rate */ + int iBlockAlign; /*!< @brief (required) block alignment */ + int iBitRate; /*!< @brief (required) bit rate */ + int iBitsPerSample; /*!< @brief (required) bits per sample */ + } stream[PVR_STREAM_MAX_STREAMS]; /*!< @brief (required) the streams */ } ATTRIBUTE_PACKED PVR_STREAM_PROPERTIES; /*! @@ -189,6 +194,9 @@ { char strAdapterName[PVR_ADDON_NAME_STRING_LENGTH]; /*!< @brief (optional) name of the adapter that's being used */ char strAdapterStatus[PVR_ADDON_NAME_STRING_LENGTH]; /*!< @brief (optional) status of the adapter that's being used */ + char strServiceName[PVR_ADDON_NAME_STRING_LENGTH]; /*!< @brief (optional) name of the current service */ + char strProviderName[PVR_ADDON_NAME_STRING_LENGTH]; /*!< @brief (optional) name of the current service's provider */ + char strMuxName[PVR_ADDON_NAME_STRING_LENGTH]; /*!< @brief (optional) name of the current mux */ int iSNR; /*!< @brief (optional) signal/noise ratio */ int iSignal; /*!< @brief (optional) signal strength */ long iBER; /*!< @brief (optional) bit error rate */ @@ -285,22 +293,57 @@ int iGenreType; /*!< @brief (optional) genre type */ int iGenreSubType; /*!< @brief (optional) genre sub type */ int iPlayCount; /*!< @brief (optional) play count of this recording on the client */ + int iLastPlayedPosition; /*!< @brief (optional) last played position of this recording on the client */ } ATTRIBUTE_PACKED PVR_RECORDING; /*! + * @brief Edit definition list (EDL) + */ + typedef enum + { + PVR_EDL_TYPE_CUT = 0, /*!< @brief cut (completly remove content) */ + PVR_EDL_TYPE_MUTE = 1, /*!< @brief mute audio */ + PVR_EDL_TYPE_SCENE = 2, /*!< @brief scene markers (chapter seeking) */ + PVR_EDL_TYPE_COMBREAK = 3 /*!< @brief commercial breaks */ + } PVR_EDL_TYPE; + + typedef struct PVR_EDL_ENTRY + { + int64_t start; // ms + int64_t end; // ms + PVR_EDL_TYPE type; + } ATTRIBUTE_PACKED PVR_EDL_ENTRY; + + /*! + * @brief PVR menu hook data + */ + typedef struct PVR_MENUHOOK_DATA + { + PVR_MENUHOOK_CAT cat; + union data { + int iEpgUid; + PVR_CHANNEL channel; + PVR_TIMER timer; + PVR_RECORDING recording; + } data; + } ATTRIBUTE_PACKED PVR_MENUHOOK_DATA; + + /*! * @brief Structure to transfer the methods from xbmc_pvr_dll.h to XBMC */ typedef struct PVRClient { const char* (__cdecl* GetPVRAPIVersion)(void); const char* (__cdecl* GetMininumPVRAPIVersion)(void); + const char* (__cdecl* GetGUIAPIVersion)(void); + const char* (__cdecl* GetMininumGUIAPIVersion)(void); PVR_ERROR (__cdecl* GetAddonCapabilities)(PVR_ADDON_CAPABILITIES*); PVR_ERROR (__cdecl* GetStreamProperties)(PVR_STREAM_PROPERTIES*); const char* (__cdecl* GetBackendName)(void); const char* (__cdecl* GetBackendVersion)(void); const char* (__cdecl* GetConnectionString)(void); PVR_ERROR (__cdecl* GetDriveSpace)(long long*, long long*); - PVR_ERROR (__cdecl* MenuHook)(const PVR_MENUHOOK&); + PVR_ERROR (__cdecl* MenuHook)(const PVR_MENUHOOK&, const PVR_MENUHOOK_DATA&); PVR_ERROR (__cdecl* GetEpg)(ADDON_HANDLE, const PVR_CHANNEL&, time_t, time_t); int (__cdecl* GetChannelGroupsAmount)(void); PVR_ERROR (__cdecl* GetChannelGroups)(ADDON_HANDLE, bool); @@ -320,6 +363,7 @@ PVR_ERROR (__cdecl* SetRecordingPlayCount)(const PVR_RECORDING&, int); PVR_ERROR (__cdecl* SetRecordingLastPlayedPosition)(const PVR_RECORDING&, int); int (__cdecl* GetRecordingLastPlayedPosition)(const PVR_RECORDING&); + PVR_ERROR (__cdecl* GetRecordingEdl)(const PVR_RECORDING&, PVR_EDL_ENTRY[], int*); int (__cdecl* GetTimersAmount)(void); PVR_ERROR (__cdecl* GetTimers)(ADDON_HANDLE); PVR_ERROR (__cdecl* AddTimer)(const PVR_TIMER&); @@ -351,6 +395,9 @@ bool (__cdecl* CanSeekStream)(void); bool (__cdecl* SeekTime)(int, bool, double*); void (__cdecl* SetSpeed)(int); + time_t (__cdecl* GetPlayingTime)(void); + time_t (__cdecl* GetBufferTimeStart)(void); + time_t (__cdecl* GetBufferTimeEnd)(void); } PVRClient; #ifdef __cplusplus diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_scr_dll.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_scr_dll.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_scr_dll.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_scr_dll.h 2014-01-04 10:28:12.000000000 +0000 @@ -1,7 +1,7 @@ #pragma once /* - * Copyright (C) 2005-2012 Team XBMC - * http://www.xbmc.org + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_scr_types.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_scr_types.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_scr_types.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_scr_types.h 2014-01-04 10:28:12.000000000 +0000 @@ -1,7 +1,7 @@ #pragma once /* - * Copyright (C) 2005-2012 Team XBMC - * http://www.xbmc.org + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_stream_utils.hpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_stream_utils.hpp --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_stream_utils.hpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_stream_utils.hpp 2014-01-04 10:28:19.000000000 +0000 @@ -0,0 +1,264 @@ +#pragma once +/* + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#include "xbmc_pvr_types.h" +#include +#include + +namespace ADDON +{ + /** + * Represents a single stream. It extends the PODS to provide some operators + * overloads. + */ + class XbmcPvrStream : public PVR_STREAM_PROPERTIES::PVR_STREAM + { + public: + XbmcPvrStream() + { + Clear(); + } + + XbmcPvrStream(const XbmcPvrStream &other) + { + memcpy(this, &other, sizeof(PVR_STREAM_PROPERTIES::PVR_STREAM)); + } + + XbmcPvrStream& operator=(const XbmcPvrStream &other) + { + memcpy(this, &other, sizeof(PVR_STREAM_PROPERTIES::PVR_STREAM)); + return *this; + } + + /** + * Compares this stream based on another stream + * @param other + * @return + */ + inline bool operator==(const XbmcPvrStream &other) const + { + return iPhysicalId == other.iPhysicalId && iCodecId == other.iCodecId; + } + + /** + * Compares this stream with another one so that video streams are sorted + * before any other streams and the others are sorted by the physical ID + * @param other + * @return + */ + bool operator<(const XbmcPvrStream &other) const + { + if (iCodecType == XBMC_CODEC_TYPE_VIDEO) + return true; + else if (other.iCodecType != XBMC_CODEC_TYPE_VIDEO) + return iPhysicalId < other.iPhysicalId; + else + return false; + } + + /** + * Clears the stream + */ + void Clear() + { + memset(this, 0, sizeof(PVR_STREAM_PROPERTIES::PVR_STREAM)); + iCodecId = XBMC_INVALID_CODEC_ID; + iCodecType = XBMC_CODEC_TYPE_UNKNOWN; + } + + /** + * Checks whether the stream has been cleared + * @return + */ + inline bool IsCleared() const + { + return iCodecId == XBMC_INVALID_CODEC_ID && + iCodecType == XBMC_CODEC_TYPE_UNKNOWN; + } + }; + + class XbmcStreamProperties + { + public: + typedef std::vector stream_vector; + + XbmcStreamProperties(void) + { + // make sure the vector won't have to resize itself later + m_streamVector = new stream_vector(); + m_streamVector->reserve(PVR_STREAM_MAX_STREAMS); + } + + virtual ~XbmcStreamProperties(void) + { + delete m_streamVector; + } + + /** + * Resets the streams + */ + void Clear(void) + { + m_streamVector->clear(); + m_streamIndex.clear(); + } + + /** + * Returns the index of the stream with the specified physical ID, or -1 if + * there no stream is found. This method is called very often which is why + * we keep a separate map for this. + * @param iPhysicalId + * @return + */ + int GetStreamId(unsigned int iPhysicalId) const + { + std::map::const_iterator it = m_streamIndex.find(iPhysicalId); + if (it != m_streamIndex.end()) + return it->second; + + return -1; + } + + /** + * Returns the stream with the specified physical ID, or null if no such + * stream exists + * @param iPhysicalId + * @return + */ + XbmcPvrStream* GetStreamById(unsigned int iPhysicalId) const + { + int position = GetStreamId(iPhysicalId); + return position != -1 ? &m_streamVector->at(position) : NULL; + } + + /** + * Populates the specified stream with the stream having the specified + * physical ID. If the stream is not found only target stream's physical ID + * will be populated. + * @param iPhysicalId + * @param stream + */ + void GetStreamData(unsigned int iPhysicalId, XbmcPvrStream* stream) + { + XbmcPvrStream *foundStream = GetStreamById(iPhysicalId); + if (foundStream) + stream = foundStream; + else + { + stream->iIdentifier = -1; + stream->iPhysicalId = iPhysicalId; + } + } + + /** + * Populates props with the current streams and returns whether there are + * any streams at the moment or not. + * @param props + * @return + */ + bool GetProperties(PVR_STREAM_PROPERTIES* props) + { + unsigned int i = 0; + for (stream_vector::const_iterator it = m_streamVector->begin(); + it != m_streamVector->end(); ++it, ++i) + { + memcpy(&props->stream[i], &(*it), sizeof(PVR_STREAM_PROPERTIES::PVR_STREAM)); + } + + props->iStreamCount = m_streamVector->size(); + return (props->iStreamCount > 0); + } + + /** + * Merges new streams into the current list of streams. Identical streams + * will retain their respective indexes and new streams will replace unused + * indexes or be appended. + * @param newStreams + */ + void UpdateStreams(stream_vector &newStreams) + { + // sort the new streams + std::sort(newStreams.begin(), newStreams.end()); + + // ensure we never have more than PVR_STREAMS_MAX_STREAMS streams + if (newStreams.size() > PVR_STREAM_MAX_STREAMS) + { + while (newStreams.size() > PVR_STREAM_MAX_STREAMS) + newStreams.pop_back(); + + XBMC->Log(LOG_ERROR, "%s - max amount of streams reached", __FUNCTION__); + } + + stream_vector::iterator newStreamPosition; + for (stream_vector::iterator it = m_streamVector->begin(); it != m_streamVector->end(); ++it) + { + newStreamPosition = std::find(newStreams.begin(), newStreams.end(), *it); + + // if the current stream no longer exists we clear it, otherwise we + // copy it and remove it from newStreams + if (newStreamPosition == newStreams.end()) + it->Clear(); + else + { + *it = *newStreamPosition; + newStreams.erase(newStreamPosition); + } + } + + // replace cleared streams with new streams + for (stream_vector::iterator it = m_streamVector->begin(); + it != m_streamVector->end() && !newStreams.empty(); ++it) + { + if (it->IsCleared()) + { + *it = newStreams.front(); + newStreams.erase(newStreams.begin()); + } + } + + // append any remaining new streams + m_streamVector->insert(m_streamVector->end(), newStreams.begin(), newStreams.end()); + + // remove trailing cleared streams + while (m_streamVector->back().IsCleared()) + m_streamVector->pop_back(); + + // update the index + UpdateIndex(); + } + + private: + stream_vector *m_streamVector; + std::map m_streamIndex; + + /** + * Updates the stream index + */ + void UpdateIndex() + { + m_streamIndex.clear(); + + int i = 0; + for (stream_vector::const_iterator it = m_streamVector->begin(); it != m_streamVector->end(); ++it, ++i) + m_streamIndex[it->iPhysicalId] = i; + } + }; +} diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_vis_dll.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_vis_dll.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_vis_dll.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_vis_dll.h 2014-01-04 10:28:12.000000000 +0000 @@ -2,8 +2,8 @@ #define __XBMC_VIS_H__ /* - * Copyright (C) 2005-2012 Team XBMC - * http://www.xbmc.org + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_vis_types.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_vis_types.h --- xbmc-pvr-addons-1.0.0~git20131213.1417-e1c3fb1/xbmc/xbmc_vis_types.h 2013-12-13 13:17:18.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/xbmc_vis_types.h 2014-01-04 10:28:12.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Copyright (C) 2005-2012 Team XBMC - * http://www.xbmc.org + * Copyright (C) 2005-2013 Team XBMC + * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by