diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/addons/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/Makefile.am --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/addons/Makefile.am 2012-11-27 01:00:30.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/Makefile.am 2014-01-04 10:28:19.000000000 +0000 @@ -1,5 +1,8 @@ if ADDON_MYTHTV - ADDITIONAL_SUBDIRS = pvr.mythtv.cmyth + ADDON_MYTHTV_SUBDIRS = pvr.mythtv.cmyth +endif +if ADDON_IPTVSIMPLE + ADDON_IPTVSIMPLE_SUBDIRS = pvr.iptvsimple endif SUBDIRS = pvr.demo \ @@ -11,7 +14,10 @@ pvr.njoy \ pvr.vuplus \ pvr.argustv \ - $(ADDITIONAL_SUBDIRS) + pvr.dvblink \ + pvr.wmc \ + $(ADDON_MYTHTV_SUBDIRS) \ + $(ADDON_IPTVSIMPLE_SUBDIRS) clean: -rm -f *.zip diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/addons/Makefile.include.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/Makefile.include.am --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/addons/Makefile.include.am 2012-12-20 01:00:33.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@ diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/addon/addon.xml.in 2013-04-16 07:04:11.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/addon/changelog.txt 2013-04-16 07:04:11.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/Makefile.am 2012-11-27 01:00:30.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.argustv/Makefile.am 2014-03-04 10:06:12.000000000 +0000 @@ -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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/project/VS2010Express/pvr.argustv.vcxproj 2012-12-01 08:34:33.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/project/VS2010Express/pvr.argustv.vcxproj.filters 2012-11-27 01:00:30.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/src/argustvrpc.cpp 2013-04-16 07:04:11.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/src/argustvrpc.h 2012-11-27 01:00:30.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/src/channel.cpp 2012-11-27 01:00:30.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/src/channel.h 2012-11-27 01:00:30.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/src/client.cpp 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/src/client.h 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/src/epg.h 2013-02-16 21:46:32.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/src/lib/tsreader/MultiFileReader.cpp 2013-02-16 21:46:32.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/src/pvrclient-argustv.cpp 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/src/pvrclient-argustv.h 2012-11-27 01:00:30.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/src/recording.cpp 2012-11-27 01:00:30.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/src/recording.h 2012-11-27 01:00:30.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/src/recordingsummary.cpp 2012-11-27 01:00:30.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/src/recordingsummary.h 2012-11-27 01:00:30.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/src/upcomingrecording.cpp 2012-11-27 01:00:30.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/src/upcomingrecording.h 2012-11-27 01:00:30.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/src/utils.cpp 2012-11-27 01:00:30.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.argustv/src/utils.h 2012-11-27 01:00:30.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.demo/addon/addon.xml.in 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.demo/project/VS2010Express/pvrclient_demo.vcxproj 2012-12-01 08:34:33.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.demo/src/client.cpp 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.demo/src/client.h 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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/D8_vlzUcEW/xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/addons/pvr.dvblink/addon/icon.png and /tmp/HcFlFnG9Hq/xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.dvblink/addon/icon.png differ diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.dvbviewer/addon/addon.xml.in 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.dvbviewer/addon/changelog.txt 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.dvbviewer/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.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.dvbviewer/addon/resources/settings.xml 2012-11-15 21:18:18.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.dvbviewer/Makefile.am 2012-12-01 01:00:27.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.dvbviewer/project/VS2010Express/pvr.dvbviewer.vcxproj 2012-12-01 08:34:33.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.dvbviewer/project/VS2010Express/pvr.dvbviewer.vcxproj.filters 2012-11-15 21:18:18.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.dvbviewer/src/client.cpp 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.dvbviewer/src/client.h 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.dvbviewer/src/DvbData.cpp 2012-12-16 01:00:31.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.dvbviewer/src/DvbData.h 2012-12-11 01:00:24.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.hts/addon/addon.xml.in 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.hts/addon/changelog.txt 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.hts/addon/resources/settings.xml 2013-02-16 21:46:32.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.hts/project/VS2010Express/pvrclient_tvheadend.vcxproj 2013-02-16 21:46:32.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.hts/src/client.cpp 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.hts/src/client.h 2013-02-16 21:46:32.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.hts/src/GUIDialogTranscode.cpp 2013-02-16 21:46:32.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.hts/src/HTSPConnection.cpp 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.hts/src/HTSPData.cpp 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.hts/src/HTSPDemux.cpp 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.hts/src/HTSPDemux.h 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.hts/src/HTSPTypes.h 2013-02-16 21:46:32.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.iptvsimple/addon/addon.xml.in 1970-01-01 00:00:00.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 @@ -0,0 +1,28 @@ + + + + + + + + + XBMC PVR addon for IPTV support. https://github.com/afedchin/xbmc-addon-iptvsimple/wiki/IPTV-Simple-Home + XBMC PVR аддон для поддержки IPTV. https://github.com/afedchin/xbmc-addon-iptvsimple/wiki/IPTV-Simple-Home + IPTV Simple PVR Client support m3u playlists, streaming of Live TV for multicast/unicast sources, listening to Radio channels and EPG. + Интерфейс для IPTV. Поддерживает просмотр потокового ТВ для юникаст/мультикаст источников, прослушивание радиоканалов и работу с электронным телегидом. + This is unstable software! The authors are in no way responsible for failed playings, incorrect EPG times, wasted hours, or any other undesirable effects. + Это нестабильная программа! Авторы не несут ответственности за неудачные воспроизведение, неверные время EPG, потраченное время и прочие нежелательные эффекты. + @OS@ + + diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.iptvsimple/addon/changelog.txt 1970-01-01 00:00:00.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 @@ -0,0 +1,19 @@ +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 Binary files /tmp/D8_vlzUcEW/xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/addons/pvr.iptvsimple/addon/icon.png and /tmp/HcFlFnG9Hq/xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/addon/icon.png differ diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.iptvsimple/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.iptvsimple/addon/resources/language/English/strings.po 2014-01-28 20:43:50.000000000 +0000 @@ -0,0 +1,88 @@ +# XBMC Media Center language file +# Addon Name: PVR IP-TV Simple Client +# Addon id: pvr.iptvsimple +# Addon version: 0.1.0 +# Addon Provider: nightik +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 "Location" +msgstr "" + +msgctxt "#30001" +msgid "Local Path (include Local Network)" +msgstr "" + +msgctxt "#30002" +msgid "Remote Path (Internet address)" +msgstr "" + +msgctxt "#30010" +msgid "General" +msgstr "" + +msgctxt "#30011" +msgid "M3U Play List Path" +msgstr "" + +msgctxt "#30012" +msgid "M3U Play List URL" +msgstr "" + +msgctxt "#30013" +msgid "Numbering channels starts at" +msgstr "" + +msgctxt "#30020" +msgid "EPG Settings" +msgstr "" + +msgctxt "#30021" +msgid "XMLTV Path" +msgstr "" + +msgctxt "#30022" +msgid "XMLTV URL" +msgstr "" + +msgctxt "#30023" +msgid "Apply Time Shift To All Channels" +msgstr "" + +msgctxt "#30024" +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 "" + +msgctxt "#30031" +msgid "Channels Logos Folder" +msgstr "" + +msgctxt "#30032" +msgid "Channels Logos Base URL" +msgstr "" diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/addons/pvr.iptvsimple/addon/resources/language/French/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/addon/resources/language/French/strings.po --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/addons/pvr.iptvsimple/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.iptvsimple/addon/resources/language/French/strings.po 2013-10-31 06:59:44.000000000 +0000 @@ -0,0 +1,75 @@ +# XBMC Media Center language file +# Addon Name: PVR IP-TV Simple Client +# Addon id: pvr.iptvsimple +# Addon version: 0.1.2 +# Addon Provider: nightik +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: PVR-IPTV Simple\n" +"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: 2013-02-27 06:56+0000\n" +"Last-Translator: numa001 \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: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgctxt "#30000" +msgid "File Location" +msgstr "Emplacement du fichier" + +msgctxt "#30001" +msgid "Local Path (include Local Network)" +msgstr "Chemin local (inclue le réseau local)" + +msgctxt "#30002" +msgid "Remote Path (Internet address)" +msgstr "Chemin d'accès (adresse internet)" + +msgctxt "#30010" +msgid "General" +msgstr "General" + +msgctxt "#30011" +msgid "M3U Play List Path" +msgstr "Chemin de la Playlist M3U" + +msgctxt "#30012" +msgid "M3U Play List URL" +msgstr "URL de la playlist M3U" + +msgctxt "#30013" +msgid "Numbering channels starts at" +msgstr "Numbering channels starts at" + +msgctxt "#30020" +msgid "EPG Settings" +msgstr "Paramètres EPG" + +msgctxt "#30021" +msgid "XMLTV Path" +msgstr "Chemin du fichier XMLTV" + +msgctxt "#30022" +msgid "XMLTV URL" +msgstr "URL du fichier XMLTV" + +msgctxt "#30023" +msgid "Apply Time Shift To All Channels" +msgstr "Appliquer un décalage horaire sur toutes les chaînes" + +msgctxt "#30024" +msgid "EPG Time Shift (hours)" +msgstr "Décalage horaire de l'EPG (heures)" + +msgctxt "#30030" +msgid "Channels Logos" +msgstr "Logos des chaînes" + +msgctxt "#30031" +msgid "Channels Logos Folder" +msgstr "Répertoire des Logos de chaînes" diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/addons/pvr.iptvsimple/addon/resources/language/Russian/strings.po xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/addon/resources/language/Russian/strings.po --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/addons/pvr.iptvsimple/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.iptvsimple/addon/resources/language/Russian/strings.po 2013-10-31 06:59:44.000000000 +0000 @@ -0,0 +1,74 @@ +# XBMC Media Center language file +# Addon Name: PVR IP-TV Simple Client +# Addon id: pvr.iptvsimple +# Addon version: 0.1.0 +# Addon Provider: nightik +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: Russian (http://www.transifex.com/projects/p/XBMC-Main-Frodo/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 "File Location" +msgstr "Расположение файла" + +msgctxt "#30001" +msgid "Local Path (include Local Network)" +msgstr "Локальный путь (в т.ч. Локальная Сеть)" + +msgctxt "#30002" +msgid "Remote Path (Internet address)" +msgstr "Удалённый путь (сеть Интернет)" + +msgctxt "#30010" +msgid "General" +msgstr "Основные" + +msgctxt "#30011" +msgid "M3U Play List Path" +msgstr "Путь к M3U" + +msgctxt "#30012" +msgid "M3U Play List URL" +msgstr "Ссылка на M3U" + +msgctxt "#30013" +msgid "Numbering channels starts at" +msgstr "Начинать нумерацию каналов с" + +msgctxt "#30020" +msgid "EPG Settings" +msgstr "Установки EPG" + +msgctxt "#30021" +msgid "XMLTV Path" +msgstr "Путь к XMLTV" + +msgctxt "#30022" +msgid "XMLTV URL" +msgstr "Ссылка на XMLTV" + +msgctxt "#30023" +msgid "Apply Time Shift To All Channels" +msgstr "Применять сдвиг по времени для всех каналов" + +msgctxt "#30024" +msgid "EPG Time Shift (hours)" +msgstr "Сдвиг по времени для EPG (часов)" + +msgctxt "#30030" +msgid "Channels Logos" +msgstr "Логотипы каналов" + +msgctxt "#30031" +msgid "Channels Logos Folder" +msgstr "Папка с логотипами каналов" diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.iptvsimple/addon/resources/settings.xml 1970-01-01 00:00:00.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 @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/addons/pvr.iptvsimple/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/Makefile.am --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/addons/pvr.iptvsimple/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/Makefile.am 2013-10-31 06:59:44.000000000 +0000 @@ -0,0 +1,19 @@ +# +# Makefile for the PVR IPTV Simple add-on for XBMC PVR +# +# See the README for copyright information and +# how to reach the author. +# + +ADDONBINNAME = XBMC_IPTV_Simple +ADDONNAME = pvr.iptvsimple +LIBNAME = libpvriptvsimple-addon +lib_LTLIBRARIES = libpvriptvsimple-addon.la + +include ../Makefile.include.am + +libpvriptvsimple_addon_la_SOURCES = src/client.cpp \ + src/PVRIptvData.cpp +libpvriptvsimple_addon_la_LDFLAGS = $(ZLIB_LIBS) @TARGET_LDFLAGS@ + + diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/addons/pvr.iptvsimple/project/VS2010Express/pvr.iptvsimple.vcxproj xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/project/VS2010Express/pvr.iptvsimple.vcxproj --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/addons/pvr.iptvsimple/project/VS2010Express/pvr.iptvsimple.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/project/VS2010Express/pvr.iptvsimple.vcxproj 2013-10-31 06:59:44.000000000 +0000 @@ -0,0 +1,100 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {6C67B057-CE98-4732-AABF-0E374C718815} + pvr_iptvsimple + pvr.iptvsimple + + + + DynamicLibrary + true + MultiByte + + + DynamicLibrary + false + true + MultiByte + + + + + + + + + + + + + ..\..\addon\ + + + XBMC_IPTV_Simple_win32 + + + ..\..\addon\ + + + XBMC_IPTV_Simple_win32 + + + + Level3 + Disabled + ..\..\..\..\project\BuildDependencies\include;..\..\..\..\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;zlib.lib;%(AdditionalDependencies) + ..\..\..\..\project\BuildDependencies\lib + + + + + Level3 + MaxSpeed + true + true + ..\..\..\..\project\BuildDependencies\include;..\..\..\..\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;zlib.lib;%(AdditionalDependencies) + ..\..\..\..\project\BuildDependencies\lib + + + + + + + + + + + + + {fe4573f6-a794-4ad3-b37f-49e51f1140e6} + + + + + + \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/addons/pvr.iptvsimple/project/VS2010Express/pvr.iptvsimple.vcxproj.filters xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/project/VS2010Express/pvr.iptvsimple.vcxproj.filters --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/addons/pvr.iptvsimple/project/VS2010Express/pvr.iptvsimple.vcxproj.filters 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.iptvsimple/project/VS2010Express/pvr.iptvsimple.vcxproj.filters 2013-10-31 06:59:44.000000000 +0000 @@ -0,0 +1,33 @@ + + + + + {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 + + + + + Header Files + + + Header Files + + + \ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.iptvsimple/src/client.cpp 1970-01-01 00:00:00.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 @@ -0,0 +1,484 @@ +/* + * Copyright (C) 2013 Anton Fedchin + * http://github.com/afedchin/xbmc-addon-iptvsimple/ + * + * 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 "PVRIptvData.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; +PVRIptvData *m_data = NULL; +bool m_bIsPlaying = false; +PVRIptvChannel m_currentChannel; + +/* User adjustable settings are saved here. + * Default values are defined inside client.h + * and exported to the other source files. + */ +std::string g_strUserPath = ""; +std::string g_strClientPath = ""; + +CHelper_libXBMC_addon *XBMC = NULL; +CHelper_libXBMC_pvr *PVR = NULL; + +std::string g_strTvgPath = ""; +std::string g_strM3UPath = ""; +std::string g_strLogoPath = ""; +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) +{ + std::string strResult = strPath; + if (strResult.at(strResult.size() - 1) == '\\' || + strResult.at(strResult.size() - 1) == '/') + { + strResult.append(strFileName); + } + else + { + strResult.append("/"); + strResult.append(strFileName); + } + + return strResult; +} + +extern std::string GetClientFilePath(const std::string &strFileName) +{ + return PathCombine(g_strClientPath, strFileName); +} + +extern std::string GetUserFilePath(const std::string &strFileName) +{ + return PathCombine(g_strUserPath, strFileName); +} + +extern "C" { + +void ADDON_ReadSettings(void) +{ + char buffer[1024]; + int iPathType = 0; + if (!XBMC->GetSetting("m3uPathType", &iPathType)) + { + iPathType = 1; + } + if (iPathType) + { + 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 == "") + { + g_strM3UPath = GetClientFilePath(M3U_FILE_NAME); + } + if (!XBMC->GetSetting("startNum", &g_iStartNumber)) + { + g_iStartNumber = 1; + } + if (!XBMC->GetSetting("epgPathType", &iPathType)) + { + iPathType = 1; + } + if (iPathType) + { + if (XBMC->GetSetting("epgUrl", &buffer)) + { + g_strTvgPath = buffer; + } + if (!XBMC->GetSetting("epgCache", &g_bCacheEPG)) + { + g_bCacheEPG = true; + } + } + else + { + 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("logoPathType", &iPathType)) + { + iPathType = 1; + } + if (XBMC->GetSetting(iPathType ? "logoBaseUrl" : "logoPath", &buffer)) + { + g_strLogoPath = buffer; + } + if (g_strLogoPath == "") + { + g_strLogoPath = GetClientFilePath("icons/"); + } +} + +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 IPTV Simple add-on", __FUNCTION__); + + m_CurStatus = ADDON_STATUS_UNKNOWN; + g_strUserPath = pvrprops->strUserPath; + g_strClientPath = pvrprops->strClientPath; + + if (!XBMC->DirectoryExists(g_strUserPath.c_str())) + { +#ifdef TARGET_WINDOWS + CreateDirectory(g_strUserPath.c_str(), NULL); +#else + XBMC->CreateDirectory(g_strUserPath.c_str()); +#endif + } + + ADDON_ReadSettings(); + + m_data = new PVRIptvData; + m_CurStatus = ADDON_STATUS_OK; + m_bCreated = true; + + return m_CurStatus; +} + +ADDON_STATUS ADDON_GetStatus() +{ + return m_CurStatus; +} + +void ADDON_Destroy() +{ + delete m_data; + 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) +{ + // reset cache and restart addon + + string strFile = GetUserFilePath(M3U_FILE_NAME); + if (XBMC->FileExists(strFile.c_str(), false)) + { +#ifdef TARGET_WINDOWS + DeleteFile(strFile.c_str()); +#else + XBMC->DeleteFile(strFile.c_str()); +#endif + } + + strFile = GetUserFilePath(TVG_FILE_NAME); + if (XBMC->FileExists(strFile.c_str(), false)) + { +#ifdef TARGET_WINDOWS + DeleteFile(strFile.c_str()); +#else + XBMC->DeleteFile(strFile.c_str()); +#endif + } + + return ADDON_STATUS_NEED_RESTART; +} + +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->bSupportsTV = true; + pCapabilities->bSupportsRadio = true; + pCapabilities->bSupportsChannelGroups = true; + pCapabilities->bSupportsRecordings = false; + + return PVR_ERROR_NO_ERROR; +} + +const char *GetBackendName(void) +{ + static const char *strBackendName = "IPTV Simple PVR Add-on"; + return strBackendName; +} + +const char *GetBackendVersion(void) +{ + static CStdString strBackendVersion = PVR_CLIENT_VERSION; + return strBackendVersion.c_str(); +} + +const char *GetConnectionString(void) +{ + static CStdString strConnectionString = "connected"; + return strConnectionString.c_str(); +} + +PVR_ERROR GetDriveSpace(long long *iTotal, long long *iUsed) +{ + *iTotal = 0; + *iUsed = 0; + return PVR_ERROR_NO_ERROR; +} + +PVR_ERROR GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart, time_t iEnd) +{ + if (m_data) + return m_data->GetEPGForChannel(handle, channel, iStart, iEnd); + + return PVR_ERROR_SERVER_ERROR; +} + +int GetChannelsAmount(void) +{ + if (m_data) + return m_data->GetChannelsAmount(); + + return -1; +} + +PVR_ERROR GetChannels(ADDON_HANDLE handle, bool bRadio) +{ + if (m_data) + return m_data->GetChannels(handle, bRadio); + + return PVR_ERROR_SERVER_ERROR; +} + +bool OpenLiveStream(const PVR_CHANNEL &channel) +{ + if (m_data) + { + CloseLiveStream(); + + if (m_data->GetChannel(channel, m_currentChannel)) + { + m_bIsPlaying = true; + return true; + } + } + + return false; +} + +void CloseLiveStream(void) +{ + m_bIsPlaying = false; +} + +int GetCurrentClientChannel(void) +{ + return m_currentChannel.iUniqueId; +} + +bool SwitchChannel(const PVR_CHANNEL &channel) +{ + CloseLiveStream(); + + return OpenLiveStream(channel); +} + +PVR_ERROR GetStreamProperties(PVR_STREAM_PROPERTIES* pProperties) +{ + return PVR_ERROR_NOT_IMPLEMENTED; +} + +int GetChannelGroupsAmount(void) +{ + if (m_data) + return m_data->GetChannelGroupsAmount(); + + return -1; +} + +PVR_ERROR GetChannelGroups(ADDON_HANDLE handle, bool bRadio) +{ + if (m_data) + return m_data->GetChannelGroups(handle, bRadio); + + return PVR_ERROR_SERVER_ERROR; +} + +PVR_ERROR GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group) +{ + if (m_data) + return m_data->GetChannelGroupMembers(handle, group); + + return PVR_ERROR_SERVER_ERROR; +} + +PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS &signalStatus) +{ + snprintf(signalStatus.strAdapterName, sizeof(signalStatus.strAdapterName), "IPTV Simple Adapter 1"); + snprintf(signalStatus.strAdapterStatus, sizeof(signalStatus.strAdapterStatus), "OK"); + + return PVR_ERROR_NO_ERROR; +} + +/** UNUSED API FUNCTIONS */ +const char * GetLiveStreamURL(const PVR_CHANNEL &channel) { return ""; } +bool CanPauseStream(void) { return false; } +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, 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; } +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) {} +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 DeleteRecording(const PVR_RECORDING &recording) { return PVR_ERROR_NOT_IMPLEMENTED; } +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; } +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; } +PVR_ERROR DeleteTimer(const PVR_TIMER &timer, bool bForceDelete) { return PVR_ERROR_NOT_IMPLEMENTED; } +PVR_ERROR UpdateTimer(const PVR_TIMER &timer) { return PVR_ERROR_NOT_IMPLEMENTED; } +void DemuxAbort(void) {} +DemuxPacket* DemuxRead(void) { return NULL; } +unsigned int GetChannelSwitchDelay(void) { return 0; } +void PauseStream(bool bPaused) {} +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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.iptvsimple/src/client.h 1970-01-01 00:00:00.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 @@ -0,0 +1,57 @@ +#pragma once +/* + * Copyright (C) 2013 Anton Fedchin + * http://github.com/afedchin/xbmc-addon-iptvsimple/ + * + * 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" + +#define PVR_CLIENT_VERSION "1.9.3" +#define M3U_FILE_NAME "iptv.m3u.cache" +#define TVG_FILE_NAME "xmltv.xml.cache" + +/*! + * @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)) + +extern bool m_bCreated; +extern std::string g_strUserPath; +extern std::string g_strClientPath; +extern ADDON::CHelper_libXBMC_addon *XBMC; +extern CHelper_libXBMC_pvr *PVR; + +extern std::string g_strM3UPath; +extern std::string g_strTvgPath; +extern std::string g_strLogoPath; +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); +extern std::string GetUserFilePath(const std::string &strFileName); diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.iptvsimple/src/PVRIptvData.cpp 1970-01-01 00:00:00.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 @@ -0,0 +1,1007 @@ +/* + * Copyright (C) 2013 Anton Fedchin + * http://github.com/afedchin/xbmc-addon-iptvsimple/ + * + * 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 +#include +#include +#include "zlib.h" +#include "rapidxml/rapidxml.hpp" +#include "PVRIptvData.h" + +#define M3U_START_MARKER "#EXTM3U" +#define M3U_INFO_MARKER "#EXTINF" +#define TVG_INFO_ID_MARKER "tvg-id=" +#define TVG_INFO_NAME_MARKER "tvg-name=" +#define TVG_INFO_LOGO_MARKER "tvg-logo=" +#define TVG_INFO_SHIFT_MARKER "tvg-shift=" +#define GROUP_NAME_MARKER "group-title=" +#define RADIO_MARKER "radio=" +#define CHANNEL_LOGO_EXTENSION ".png" +#define SECONDS_IN_DAY 86400 + +using namespace std; +using namespace ADDON; +using namespace rapidxml; + +template +inline bool GetNodeValue(const xml_node * pRootNode, const char* strTag, CStdString& strStringValue) +{ + xml_node *pChildNode = pRootNode->first_node(strTag); + if (pChildNode == NULL) + { + return false; + } + strStringValue = pChildNode->value(); + return true; +} + +template +inline bool GetAttributeValue(const xml_node * pNode, const char* strAttributeName, CStdString& strStringValue) +{ + xml_attribute *pAttribute = pNode->first_attribute(strAttributeName); + if (pAttribute == NULL) + { + return false; + } + strStringValue = pAttribute->value(); + return true; +} + +PVRIptvData::PVRIptvData(void) +{ + m_strXMLTVUrl = g_strTvgPath; + m_strM3uUrl = g_strM3UPath; + m_strLogoPath = g_strLogoPath; + m_iEPGTimeShift = g_iEPGTimeShift; + m_bTSOverride = g_bTSOverride; + m_iLastStart = 0; + m_iLastEnd = 0; + + m_bEGPLoaded = false; + + if (LoadPlayList()) + { + XBMC->QueueNotification(QUEUE_INFO, "%d channels loaded.", m_channels.size()); + } +} + +void *PVRIptvData::Process(void) +{ + return NULL; +} + +PVRIptvData::~PVRIptvData(void) +{ + m_channels.clear(); + m_groups.clear(); + m_epg.clear(); +} + +bool PVRIptvData::LoadEPG(time_t iStart, time_t iEnd) +{ + if (m_strXMLTVUrl.IsEmpty()) + { + XBMC->Log(LOG_NOTICE, "EPG file path is not configured. EPG not loaded."); + m_bEGPLoaded = true; + return false; + } + + std::string data; + std::string decompressed; + int iReaded = 0; + + int iCount = 0; + while(iCount < 3) // max 3 tries + { + 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(2 * 1000 * 1000); // sleep 2 sec before next try. + } + } + + if (iReaded == 0) + { + 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; + } + + char * buffer; + + // gzip packed + if (data[0] == '\x1F' && data[1] == '\x8B' && data[2] == '\x08') + { + if (!GzipInflate(data, decompressed)) + { + XBMC->Log(LOG_ERROR, "Invalid EPG file '%s': unable to decompress file.", m_strXMLTVUrl.c_str()); + m_bEGPLoaded = true; + return false; + } + buffer = &(decompressed[0]); + } + else + { + buffer = &(data[0]); + } + + // xml should starts with 'Log(LOG_ERROR, "Invalid EPG file '%s': unable to parse file.", m_strXMLTVUrl.c_str()); + m_bEGPLoaded = true; + return false; + } + } + } + + xml_document<> xmlDoc; + try + { + xmlDoc.parse<0>(buffer); + } + catch(parse_error p) + { + XBMC->Log(LOG_ERROR, "Unable parse EPG XML: %s", p.what()); + m_bEGPLoaded = true; + return false; + } + + xml_node<> *pRootElement = xmlDoc.first_node("tv"); + if (!pRootElement) + { + XBMC->Log(LOG_ERROR, "Invalid EPG XML: no tag found"); + m_bEGPLoaded = true; + return false; + } + + // clear previously loaded epg + if (m_epg.size() > 0) + { + m_epg.clear(); + } + + int iBroadCastId = 0; + xml_node<> *pChannelNode = NULL; + for(pChannelNode = pRootElement->first_node("channel"); pChannelNode; pChannelNode = pChannelNode->next_sibling("channel")) + { + CStdString strName; + CStdString strId; + if(!GetAttributeValue(pChannelNode, "id", strId)) + { + continue; + } + GetNodeValue(pChannelNode, "display-name", strName); + + if (FindChannel(strId, strName) == NULL) + { + continue; + } + + PVRIptvEpgChannel epgChannel; + epgChannel.strId = strId; + epgChannel.strName = strName; + + m_epg.push_back(epgChannel); + } + + if (m_epg.size() == 0) + { + XBMC->Log(LOG_ERROR, "EPG channels not found."); + return false; + } + + int iMinShiftTime = m_iEPGTimeShift; + int iMaxShiftTime = m_iEPGTimeShift; + if (!m_bTSOverride) + { + iMinShiftTime = SECONDS_IN_DAY; + iMaxShiftTime = -SECONDS_IN_DAY; + + vector::iterator it; + for (it = m_channels.begin(); it < m_channels.end(); it++) + { + if (it->iTvgShift + m_iEPGTimeShift < iMinShiftTime) + iMinShiftTime = it->iTvgShift + m_iEPGTimeShift; + if (it->iTvgShift + m_iEPGTimeShift > iMaxShiftTime) + iMaxShiftTime = it->iTvgShift + m_iEPGTimeShift; + } + } + + CStdString strEmpty = ""; + PVRIptvEpgChannel *epg = NULL; + for(pChannelNode = pRootElement->first_node("programme"); pChannelNode; pChannelNode = pChannelNode->next_sibling("programme")) + { + CStdString strId; + if (!GetAttributeValue(pChannelNode, "channel", strId)) + continue; + + if (epg == NULL || epg->strId != strId) + { + if ((epg = FindEpg(strId)) == NULL) + continue; + } + + CStdString strStart; + CStdString strStop; + + if (!GetAttributeValue(pChannelNode, "start", strStart) || !GetAttributeValue(pChannelNode, "stop", strStop)) + { + continue; + } + + int iTmpStart = ParseDateTime(strStart); + int iTmpEnd = ParseDateTime(strStop); + + if ((iTmpEnd + iMaxShiftTime < iStart) || (iTmpStart + iMinShiftTime > iEnd)) + { + continue; + } + + CStdString strTitle; + CStdString strCategory; + CStdString strDesc; + + GetNodeValue(pChannelNode, "title", strTitle); + 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; + entry.iGenreSubType = 0; + entry.strTitle = strTitle; + entry.strPlot = strDesc; + entry.strPlotOutline = ""; + entry.strIconPath = strIconPath; + entry.startTime = iTmpStart; + entry.endTime = iTmpEnd; + entry.strGenreString = strCategory; + + epg->epg.push_back(entry); + } + + xmlDoc.clear(); + m_bEGPLoaded = true; + + XBMC->Log(LOG_NOTICE, "EPG Loaded."); + + return true; +} + +bool PVRIptvData::LoadPlayList(void) +{ + if (m_strM3uUrl.IsEmpty()) + { + XBMC->Log(LOG_NOTICE, "Playlist file path is not configured. Channels not loaded."); + return false; + } + + CStdString 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; + } + + std::stringstream stream(strPlaylistContent); + + /* load channels */ + bool bFirst = true; + + int iChannelIndex = 0; + int iUniqueGroupId = 0; + int iCurrentGroupId = 0; + int iChannelNum = g_iStartNumber; + int iEPGTimeShift = 0; + + PVRIptvChannel tmpChannel; + tmpChannel.strTvgId = ""; + tmpChannel.strChannelName = ""; + tmpChannel.strTvgName = ""; + tmpChannel.strTvgLogo = ""; + tmpChannel.iTvgShift = 0; + + char szLine[1024]; + while(stream.getline(szLine, 1024)) + { + + CStdString strLine = ""; + strLine.append(szLine); + strLine.TrimRight(" \t\r\n"); + strLine.TrimLeft(" \t"); + + if (strLine.IsEmpty()) + { + continue; + } + + if (bFirst) + { + bFirst = false; + if (strLine.Left(3) == "\xEF\xBB\xBF") + { + strLine.Delete(0, 3); + } + if (strLine.Left((int)strlen(M3U_START_MARKER)) == M3U_START_MARKER) + { + double fTvgShift = atof(ReadMarkerValue(strLine, TVG_INFO_SHIFT_MARKER)); + iEPGTimeShift = (int) (fTvgShift * 3600.0); + continue; + } + else + { + break; + } + } + + if (strLine.Left((int)strlen(M3U_INFO_MARKER)) == M3U_INFO_MARKER) + { + bool bRadio = false; + double fTvgShift = 0; + CStdString strChnlName = ""; + CStdString strTvgId = ""; + CStdString strTvgName = ""; + CStdString strTvgLogo = ""; + CStdString strGroupName = ""; + CStdString strRadio = ""; + + // parse line + int iColon = (int)strLine.Find(':'); + int iComma = (int)strLine.ReverseFind(','); + if (iColon >= 0 && iComma >= 0 && iComma > iColon) + { + // parse name + iComma++; + strChnlName = strLine.Right((int)strLine.size() - iComma).Trim(); + tmpChannel.strChannelName = XBMC->UnknownToUTF8(strChnlName); + + // parse info + CStdString strInfoLine = strLine.Mid(++iColon, --iComma - iColon); + + strTvgId = ReadMarkerValue(strInfoLine, TVG_INFO_ID_MARKER); + strTvgName = ReadMarkerValue(strInfoLine, TVG_INFO_NAME_MARKER); + strTvgLogo = ReadMarkerValue(strInfoLine, TVG_INFO_LOGO_MARKER); + strGroupName = ReadMarkerValue(strInfoLine, GROUP_NAME_MARKER); + strRadio = ReadMarkerValue(strInfoLine, RADIO_MARKER); + fTvgShift = atof(ReadMarkerValue(strInfoLine, TVG_INFO_SHIFT_MARKER)); + + if (strTvgId.IsEmpty()) + { + char buff[255]; + sprintf(buff, "%d", atoi(strInfoLine)); + strTvgId.append(buff); + } + if (strTvgLogo.IsEmpty()) + { + strTvgLogo = strChnlName; + } + + bRadio = !strRadio.CompareNoCase("true"); + tmpChannel.strTvgId = strTvgId; + tmpChannel.strTvgName = XBMC->UnknownToUTF8(strTvgName); + tmpChannel.strTvgLogo = XBMC->UnknownToUTF8(strTvgLogo); + tmpChannel.iTvgShift = (int)(fTvgShift * 3600.0); + tmpChannel.bRadio = bRadio; + + if (tmpChannel.iTvgShift == 0 && iEPGTimeShift != 0) + { + tmpChannel.iTvgShift = iEPGTimeShift; + } + + if (!strGroupName.IsEmpty()) + { + strGroupName = XBMC->UnknownToUTF8(strGroupName); + + PVRIptvChannelGroup * pGroup; + if ((pGroup = FindGroup(strGroupName)) == NULL) + { + PVRIptvChannelGroup group; + group.strGroupName = strGroupName; + group.iGroupId = ++iUniqueGroupId; + group.bRadio = bRadio; + + m_groups.push_back(group); + iCurrentGroupId = iUniqueGroupId; + } + else + { + iCurrentGroupId = pGroup->iGroupId; + } + } + } + } + else if (strLine[0] != '#') + { + PVRIptvChannel channel; + channel.iUniqueId = GetChannelId(tmpChannel.strChannelName.c_str(), strLine); + channel.iChannelNumber = iChannelNum++; + channel.strTvgId = tmpChannel.strTvgId; + channel.strChannelName = tmpChannel.strChannelName; + channel.strTvgName = tmpChannel.strTvgName; + channel.strTvgLogo = tmpChannel.strTvgLogo; + channel.iTvgShift = tmpChannel.iTvgShift; + channel.bRadio = tmpChannel.bRadio; + channel.strStreamURL = strLine; + channel.iEncryptionSystem = 0; + + if (iCurrentGroupId > 0) + { + channel.bRadio = m_groups.at(iCurrentGroupId - 1).bRadio; + m_groups.at(iCurrentGroupId - 1).members.push_back(iChannelIndex); + } + + m_channels.push_back(channel); + iChannelIndex++; + + tmpChannel.strTvgId = ""; + tmpChannel.strChannelName = ""; + tmpChannel.strTvgName = ""; + tmpChannel.strTvgLogo = ""; + tmpChannel.iTvgShift = 0; + tmpChannel.bRadio = false; + } + } + + stream.clear(); + + if (m_channels.size() == 0) + { + XBMC->Log(LOG_ERROR, "Unable to load channels from file '%s': file is corrupted.", m_strM3uUrl.c_str()); + return false; + } + + ApplyChannelsLogos(); + + XBMC->Log(LOG_NOTICE, "Loaded %d channels.", m_channels.size()); + return true; +} + +int PVRIptvData::GetChannelsAmount(void) +{ + return m_channels.size(); +} + +PVR_ERROR PVRIptvData::GetChannels(ADDON_HANDLE handle, bool bRadio) +{ + for (unsigned int iChannelPtr = 0; iChannelPtr < m_channels.size(); iChannelPtr++) + { + PVRIptvChannel &channel = m_channels.at(iChannelPtr); + if (channel.bRadio == bRadio) + { + PVR_CHANNEL xbmcChannel; + memset(&xbmcChannel, 0, sizeof(PVR_CHANNEL)); + + xbmcChannel.iUniqueId = channel.iUniqueId; + xbmcChannel.bIsRadio = channel.bRadio; + xbmcChannel.iChannelNumber = channel.iChannelNumber; + strncpy(xbmcChannel.strChannelName, channel.strChannelName.c_str(), sizeof(xbmcChannel.strChannelName) - 1); + strncpy(xbmcChannel.strStreamURL, channel.strStreamURL.c_str(), sizeof(xbmcChannel.strStreamURL) - 1); + xbmcChannel.iEncryptionSystem = channel.iEncryptionSystem; + strncpy(xbmcChannel.strIconPath, channel.strLogoPath.c_str(), sizeof(xbmcChannel.strIconPath) - 1); + xbmcChannel.bIsHidden = false; + + PVR->TransferChannelEntry(handle, &xbmcChannel); + } + } + + return PVR_ERROR_NO_ERROR; +} + +bool PVRIptvData::GetChannel(const PVR_CHANNEL &channel, PVRIptvChannel &myChannel) +{ + for (unsigned int iChannelPtr = 0; iChannelPtr < m_channels.size(); iChannelPtr++) + { + PVRIptvChannel &thisChannel = m_channels.at(iChannelPtr); + if (thisChannel.iUniqueId == (int) channel.iUniqueId) + { + myChannel.iUniqueId = thisChannel.iUniqueId; + myChannel.bRadio = thisChannel.bRadio; + myChannel.iChannelNumber = thisChannel.iChannelNumber; + myChannel.iEncryptionSystem = thisChannel.iEncryptionSystem; + myChannel.strChannelName = thisChannel.strChannelName; + myChannel.strLogoPath = thisChannel.strLogoPath; + myChannel.strStreamURL = thisChannel.strStreamURL; + + return true; + } + } + + return false; +} + +int PVRIptvData::GetChannelGroupsAmount(void) +{ + return m_groups.size(); +} + +PVR_ERROR PVRIptvData::GetChannelGroups(ADDON_HANDLE handle, bool bRadio) +{ + for (unsigned int iGroupPtr = 0; iGroupPtr < m_groups.size(); iGroupPtr++) + { + PVRIptvChannelGroup &group = m_groups.at(iGroupPtr); + if (group.bRadio == bRadio) + { + PVR_CHANNEL_GROUP xbmcGroup; + memset(&xbmcGroup, 0, sizeof(PVR_CHANNEL_GROUP)); + + xbmcGroup.bIsRadio = bRadio; + strncpy(xbmcGroup.strGroupName, group.strGroupName.c_str(), sizeof(xbmcGroup.strGroupName) - 1); + + PVR->TransferChannelGroup(handle, &xbmcGroup); + } + } + + return PVR_ERROR_NO_ERROR; +} + +PVR_ERROR PVRIptvData::GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group) +{ + PVRIptvChannelGroup *myGroup; + if ((myGroup = FindGroup(group.strGroupName)) != NULL) + { + for (unsigned int iPtr = 0; iPtr < myGroup->members.size(); iPtr++) + { + int iIndex = myGroup->members.at(iPtr); + if (iIndex < 0 || iIndex >= (int) m_channels.size()) + continue; + + PVRIptvChannel &channel = m_channels.at(iIndex); + PVR_CHANNEL_GROUP_MEMBER xbmcGroupMember; + memset(&xbmcGroupMember, 0, sizeof(PVR_CHANNEL_GROUP_MEMBER)); + + strncpy(xbmcGroupMember.strGroupName, group.strGroupName, sizeof(xbmcGroupMember.strGroupName) - 1); + xbmcGroupMember.iChannelUniqueId = channel.iUniqueId; + xbmcGroupMember.iChannelNumber = channel.iChannelNumber; + + PVR->TransferChannelGroupMember(handle, &xbmcGroupMember); + } + } + + return PVR_ERROR_NO_ERROR; +} + +PVR_ERROR PVRIptvData::GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart, time_t iEnd) +{ + vector::iterator myChannel; + for (myChannel = m_channels.begin(); myChannel < m_channels.end(); myChannel++) + { + if (myChannel->iUniqueId != (int) channel.iUniqueId) + { + continue; + } + + if (!m_bEGPLoaded || iStart > m_iLastStart || iEnd > m_iLastEnd) + { + if (LoadEPG(iStart, iEnd)) + { + m_iLastStart = iStart; + m_iLastEnd = iEnd; + } + } + + PVRIptvEpgChannel *epg; + if ((epg = FindEpgForChannel(*myChannel)) == NULL || epg->epg.size() == 0) + { + return PVR_ERROR_NO_ERROR; + } + + int iShift = m_bTSOverride ? m_iEPGTimeShift : myChannel->iTvgShift + m_iEPGTimeShift; + + vector::iterator myTag; + for (myTag = epg->epg.begin(); myTag < epg->epg.end(); myTag++) + { + if ((myTag->endTime + iShift) < iStart) + continue; + + EPG_TAG tag; + memset(&tag, 0, sizeof(EPG_TAG)); + + tag.iUniqueBroadcastId = myTag->iBroadcastId; + tag.strTitle = myTag->strTitle.c_str(); + tag.iChannelNumber = myTag->iChannelId; + tag.startTime = myTag->startTime + iShift; + tag.endTime = myTag->endTime + iShift; + tag.strPlotOutline = myTag->strPlotOutline.c_str(); + tag.strPlot = myTag->strPlot.c_str(); + tag.strIconPath = myTag->strIconPath.c_str(); + tag.iGenreType = EPG_GENRE_USE_STRING; //myTag.iGenreType; + tag.iGenreSubType = 0; //myTag.iGenreSubType; + tag.strGenreDescription = myTag->strGenreString.c_str(); + + PVR->TransferEpgEntry(handle, &tag); + + if ((myTag->startTime + iShift) > iEnd) + break; + } + + return PVR_ERROR_NO_ERROR; + } + + return PVR_ERROR_NO_ERROR; +} + +int PVRIptvData::GetFileContents(CStdString& url, std::string &strContent) +{ + strContent.clear(); + void* fileHandle = XBMC->OpenFile(url.c_str(), 0); + if (fileHandle) + { + char buffer[1024]; + while (int bytesRead = XBMC->ReadFile(fileHandle, buffer, 1024)) + strContent.append(buffer, bytesRead); + XBMC->CloseFile(fileHandle); + } + + return strContent.length(); +} + +int PVRIptvData::ParseDateTime(CStdString strDate, bool iDateFormat) +{ + struct tm timeinfo; + 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); +} + +PVRIptvChannel * PVRIptvData::FindChannel(const std::string &strId, const std::string &strName) +{ + CStdString strTvgName = strName; + strTvgName.Replace(' ', '_'); + + vector::iterator it; + for(it = m_channels.begin(); it < m_channels.end(); it++) + { + if (it->strTvgId == strId) + { + return &*it; + } + if (strTvgName == "") + { + continue; + } + if (it->strTvgName == strTvgName) + { + return &*it; + } + if (it->strChannelName == strName) + { + return &*it; + } + } + + return NULL; +} + +PVRIptvChannelGroup * PVRIptvData::FindGroup(const std::string &strName) +{ + vector::iterator it; + for(it = m_groups.begin(); it < m_groups.end(); it++) + { + if (it->strGroupName == strName) + { + return &*it; + } + } + + return NULL; +} + +PVRIptvEpgChannel * PVRIptvData::FindEpg(const std::string &strId) +{ + vector::iterator it; + for(it = m_epg.begin(); it < m_epg.end(); it++) + { + if (it->strId == strId) + { + return &*it; + } + } + + return NULL; +} + +PVRIptvEpgChannel * PVRIptvData::FindEpgForChannel(PVRIptvChannel &channel) +{ + vector::iterator it; + for(it = m_epg.begin(); it < m_epg.end(); it++) + { + if (it->strId == channel.strTvgId) + { + return &*it; + } + CStdString strName = it->strName; + strName.Replace(' ', '_'); + if (strName == channel.strTvgName + || it->strName == channel.strTvgName) + { + return &*it; + } + if (it->strName == channel.strChannelName) + { + return &*it; + } + } + + return NULL; +} + +/* + * This method uses zlib to decompress a gzipped file in memory. + * Author: Andrew Lim Chong Liang + * http://windrealm.org + */ +bool PVRIptvData::GzipInflate( const std::string& compressedBytes, std::string& uncompressedBytes ) { + +#define HANDLE_CALL_ZLIB(status) { \ + if(status != Z_OK) { \ + free(uncomp); \ + return false; \ + } \ +} + + if ( compressedBytes.size() == 0 ) + { + uncompressedBytes = compressedBytes ; + return true ; + } + + uncompressedBytes.clear() ; + + unsigned full_length = compressedBytes.size() ; + unsigned half_length = compressedBytes.size() / 2; + + unsigned uncompLength = full_length ; + char* uncomp = (char*) calloc( sizeof(char), uncompLength ); + + z_stream strm; + strm.next_in = (Bytef *) compressedBytes.c_str(); + strm.avail_in = compressedBytes.size() ; + strm.total_out = 0; + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + + bool done = false ; + + HANDLE_CALL_ZLIB(inflateInit2(&strm, (16+MAX_WBITS))); + + while (!done) + { + // If our output buffer is too small + if (strm.total_out >= uncompLength ) + { + // Increase size of output buffer + uncomp = (char *) realloc(uncomp, uncompLength + half_length); + if (uncomp == NULL) + return false; + uncompLength += half_length ; + } + + strm.next_out = (Bytef *) (uncomp + strm.total_out); + strm.avail_out = uncompLength - strm.total_out; + + // Inflate another chunk. + int err = inflate (&strm, Z_SYNC_FLUSH); + if (err == Z_STREAM_END) + done = true; + else if (err != Z_OK) + { + break; + } + } + + HANDLE_CALL_ZLIB(inflateEnd (&strm)); + + for ( size_t i=0; iFileExists(strCachedPath, false)) + { + struct __stat64 statCached; + struct __stat64 statOrig; + + XBMC->StatFile(strCachedPath, &statCached); + XBMC->StatFile(strFilePath, &statOrig); + + bNeedReload = statCached.st_mtime < statOrig.st_mtime || statOrig.st_mtime == 0; + } + else + { + bNeedReload = true; + } + + if (bNeedReload) + { + GetFileContents(strFilePath, strContents); + + // write to cache + if (bUseCache && strContents.length() > 0) + { + void* fileHandle = XBMC->OpenFileForWrite(strCachedPath, true); + if (fileHandle) + { + XBMC->WriteFile(fileHandle, strContents.c_str(), strContents.length()); + XBMC->CloseFile(fileHandle); + } + } + return strContents.length(); + } + + return GetFileContents(strCachedPath, strContents); +} + +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); + } +} + +void PVRIptvData::ReaplyChannelsLogos(const char * strNewPath) +{ + if (strlen(strNewPath) > 0) + { + m_strLogoPath = strNewPath; + ApplyChannelsLogos(); + + PVR->TriggerChannelUpdate(); + PVR->TriggerChannelGroupsUpdate(); + } +} + +void PVRIptvData::ReloadEPG(const char * strNewPath) +{ + if (strNewPath != m_strXMLTVUrl) + { + m_strXMLTVUrl = strNewPath; + m_bEGPLoaded = false; + // TODO clear epg for all channels + + if (LoadEPG(m_iLastStart, m_iLastEnd)) + { + for(unsigned int iChannelPtr = 0, max = m_channels.size(); iChannelPtr < max; iChannelPtr++) + { + PVRIptvChannel &myChannel = m_channels.at(iChannelPtr); + PVR->TriggerEpgUpdate(myChannel.iUniqueId); + } + } + } +} + +void PVRIptvData::ReloadPlayList(const char * strNewPath) +{ + if (strNewPath != m_strM3uUrl) + { + m_strM3uUrl = strNewPath; + m_channels.clear(); + + if (LoadPlayList()) + { + PVR->TriggerChannelUpdate(); + PVR->TriggerChannelGroupsUpdate(); + } + } +} + +CStdString PVRIptvData::ReadMarkerValue(std::string &strLine, const char* strMarkerName) +{ + int iMarkerStart = (int) strLine.find(strMarkerName); + if (iMarkerStart >= 0) + { + std::string strMarker = strMarkerName; + iMarkerStart += strMarker.length(); + if (iMarkerStart < (int)strLine.length()) + { + char cFind = ' '; + if (strLine[iMarkerStart] == '"') + { + cFind = '"'; + iMarkerStart++; + } + int iMarkerEnd = (int)strLine.find(cFind, iMarkerStart); + if (iMarkerEnd < 0) + { + iMarkerEnd = strLine.length(); + } + return strLine.substr(iMarkerStart, iMarkerEnd - iMarkerStart); + } + } + + return std::string(""); +} + +int PVRIptvData::GetChannelId(const char * strChannelName, const char * strStreamUrl) +{ + std::string concat(strChannelName); + concat.append(strStreamUrl); + + const char* strString = concat.c_str(); + int iId = 0; + int c; + while (c = *strString++) + 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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.iptvsimple/src/PVRIptvData.h 1970-01-01 00:00:00.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 @@ -0,0 +1,124 @@ +#pragma once +/* + * Copyright (C) 2013 Anton Fedchin + * http://github.com/afedchin/xbmc-addon-iptvsimple/ + * + * 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 "platform/threads/threads.h" + +struct PVRIptvEpgEntry +{ + int iBroadcastId; + int iChannelId; + int iGenreType; + int iGenreSubType; + time_t startTime; + time_t endTime; + std::string strTitle; + std::string strPlotOutline; + std::string strPlot; + std::string strIconPath; + std::string strGenreString; +}; + +struct PVRIptvEpgChannel +{ + std::string strId; + std::string strName; + std::vector epg; +}; + +struct PVRIptvChannel +{ + bool bRadio; + int iUniqueId; + int iChannelNumber; + int iEncryptionSystem; + int iTvgShift; + std::string strChannelName; + std::string strLogoPath; + std::string strStreamURL; + std::string strTvgId; + std::string strTvgName; + std::string strTvgLogo; +}; + +struct PVRIptvChannelGroup +{ + bool bRadio; + int iGroupId; + std::string strGroupName; + std::vector members; +}; + +class PVRIptvData : public PLATFORM::CThread +{ +public: + PVRIptvData(void); + virtual ~PVRIptvData(void); + + virtual int GetChannelsAmount(void); + virtual PVR_ERROR GetChannels(ADDON_HANDLE handle, bool bRadio); + virtual bool GetChannel(const PVR_CHANNEL &channel, PVRIptvChannel &myChannel); + 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); + virtual PVR_ERROR GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart, time_t iEnd); + virtual void ReaplyChannelsLogos(const char * strNewPath); + virtual void ReloadPlayList(const char * strNewPath); + virtual void ReloadEPG(const char * strNewPath); + +protected: + virtual bool LoadPlayList(void); + virtual bool LoadEPG(time_t iStart, time_t iEnd); + virtual int GetFileContents(CStdString& url, std::string &strContent); + virtual PVRIptvChannel *FindChannel(const std::string &strId, const std::string &strName); + virtual PVRIptvChannelGroup *FindGroup(const std::string &strName); + virtual PVRIptvEpgChannel *FindEpg(const std::string &strId); + 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, 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); + +protected: + virtual void *Process(void); + +private: + bool m_bTSOverride; + bool m_bEGPLoaded; + int m_iEPGTimeShift; + int m_iLastStart; + int m_iLastEnd; + CStdString m_strXMLTVUrl; + CStdString m_strM3uUrl; + CStdString m_strLogoPath; + std::vector m_groups; + std::vector m_channels; + std::vector m_epg; +}; diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.mediaportal.tvserver/addon/addon.xml.in 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.mediaportal.tvserver/addon/changelog.txt 2013-03-12 10:51:22.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,3 +1,42 @@ +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 + +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) - Channelgroups: Don't import other channel groups when the user selected to import channels from a single group. @@ -18,7 +57,7 @@ - Updated language files from Transifex v1.6.4 --New version number by Team XBMC +- New version number by Team XBMC v1.2.3.117 - Added: timeshift support for XBMC Frodo @@ -128,4 +167,4 @@ - PVR client should abort connection when the TVServerXBMC version is too old v1.1.0.60 -- Fix PVR client destroy \ No newline at end of file +- Fix PVR client destroy diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/addons/pvr.mediaportal.tvserver/addon/resources/genre_translation.xml xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/genre_translation.xml --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/addons/pvr.mediaportal.tvserver/addon/resources/genre_translation.xml 2012-11-15 21:18:19.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.mediaportal.tvserver/addon/resources/genre_translation.xml 2013-12-13 13:17:21.000000000 +0000 @@ -2,25 +2,96 @@ - + movie/drama (general) detective/thriller + adventure/western/war + science fiction/fantasy/horror comedy soap/melodram/folkloric + romance + serious/classical/religious/historical movie/drama adult movie/drama + news/current affairs (general) + news/weather report + news magazine documentary + discussion/interview/debate + show/game show (general) + game show/quiz/contest + variety show + talk show + sports (general) + special events + sports magazine + football/soccer + tennis/squash + team sports + athletics + motor sport + water sport + winter sport + equestrian + martial sports + childrens's/youth program (general) + pre-school children's program + entertainment (6-14 year old) + entertainment (10-16 year old) + information/education/school program cartoon/puppets + music/ballet/dance (general) + rock/pop + serious music/classic music + folk/traditional music + jazz + musical/opera + ballet + arts/culture (without music, general) + performing arts + fine arts religion + popular culture/traditional arts + literature + film/cinema + experimental film/video + broadcasting/press + new media + arts/culture magazine + fashion + + social/political issues/economics (general) magazines/reports/documentary + + + education/science/factual topics (general) nature/animals/environment + technology/natural science + medicine/physiology/psychology + foreign countries/expeditions + social/spiritual science + further education + languages + + leisure hobbies (general) + tourism/travel + handicraft + motoring + fitness & health + cooking + advertisement/shopping + gardening + original language + black & white + unpublished + live broadcast + 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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.nextpvr/Makefile.am 2012-12-01 01:00:27.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.nextpvr/Makefile.am 2014-01-04 10:28:12.000000000 +0000 @@ -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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.nextpvr/project/VS2010Express/XBMC_NextPVR.vcxproj 2012-12-01 08:34:33.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.nextpvr/project/VS2010Express/XBMC_NextPVR.vcxproj.filters 2012-12-01 01:00:27.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.nextpvr/src/client.cpp 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.nextpvr/src/client.h 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.nextpvr/src/pvrclient-nextpvr.cpp 2013-04-16 07:04:11.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)); @@ -347,6 +363,10 @@ { PVR_STRCPY(description, pListingNode->FirstChildElement("description")->FirstChild()->Value()); } + else + { + description[0] = '\0'; + } char start[32]; strncpy(start, pListingNode->FirstChildElement("start")->FirstChild()->Value(), sizeof start); @@ -364,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; @@ -405,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++; } @@ -509,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()); @@ -566,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++; } @@ -593,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; @@ -629,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)); @@ -662,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++; } @@ -686,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)); @@ -709,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)); @@ -728,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)); @@ -794,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 */ @@ -802,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; @@ -810,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++; } @@ -825,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; @@ -833,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)); @@ -896,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; } } @@ -925,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) { @@ -982,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); @@ -1055,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) @@ -1068,6 +1298,7 @@ static int total = 0; total += rc; + //XBMC->Log(LOG_DEBUG, "ReadLiveStream read %d bytes. (total %d)", rc, total); return rc; } @@ -1086,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); } @@ -1131,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; } @@ -1260,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; @@ -1335,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; @@ -1361,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]; @@ -1378,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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.nextpvr/src/pvrclient-nextpvr.h 2012-12-01 01:00:27.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.nextpvr/src/README 2012-11-15 21:18:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.njoy/addon/addon.xml.in 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.njoy/project/VS2010Express/pvrclient_njoy.vcxproj 2012-12-01 08:34:33.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.njoy/src/client.cpp 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.njoy/src/client.h 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/addon/addon.xml.in 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/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.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/addon/resources/settings.xml 2012-11-15 21:18:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/addon/resources/skins/Confluence/720p/ChannelScan.xml 2012-11-15 21:18:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/Makefile.am 2012-11-15 21:18:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/project/VS2010Express/pvrclient_vdr_vnsi.vcxproj 2012-12-01 08:34:33.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/project/VS2010Express/pvrclient_vdr_vnsi.vcxproj.filters 2012-11-15 21:18:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/src/client.cpp 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/src/client.h 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/src/requestpacket.cpp 2012-11-15 21:18:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/src/requestpacket.h 2012-11-15 21:18:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/src/responsepacket.cpp 2012-12-11 17:45:50.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/src/responsepacket.h 2012-11-15 21:18:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/src/tools.h 2012-11-15 21:18:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/src/vnsicommand.h 2012-11-16 14:47:13.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/src/VNSIData.cpp 2012-11-15 21:18:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/src/VNSIData.h 2012-11-15 21:18:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/src/VNSIDemux.cpp 2012-12-11 17:45:50.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/src/VNSIDemux.h 2012-11-16 14:47:13.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/src/VNSISession.cpp 2012-11-16 14:47:13.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/config.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/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/cxsocket.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/cxsocket.h 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/demuxer.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/demuxer.h 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/HISTORY 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/Makefile 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_AAC.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_AAC.h 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_AC3.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_AC3.h 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_DTS.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_DTS.h 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser.h 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_h264.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_h264.h 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_MPEGAudio.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_MPEGAudio.h 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_MPEGVideo.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_MPEGVideo.h 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_Subtitle.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_Subtitle.h 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_Teletext.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/parser_Teletext.h 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/recplayer.c 2013-02-16 21:46:33.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/recplayer.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/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/requestpacket.c 2012-11-15 21:18:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/requestpacket.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/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/responsepacket.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/responsepacket.h 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/setup.c 2013-02-16 21:46:33.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/setup.h 2013-02-16 21:46:33.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/streamer.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/streamer.h 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/videobuffer.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/videobuffer.h 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/videoinput.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/videoinput.h 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsi.c 2012-12-11 01:00:24.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsiclient.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsiclient.h 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsicommand.h 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsi.h 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/vnsiserver.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vuplus/addon/addon.xml.in 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vuplus/addon/changelog.txt 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vuplus/addon/resources/language/English/strings.po 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vuplus/addon/resources/language/German/strings.po 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vuplus/addon/resources/settings.xml 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vuplus/src/client.cpp 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.vuplus/src/client.h 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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/D8_vlzUcEW/xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/addons/pvr.wmc/addon/icon.png and /tmp/HcFlFnG9Hq/xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/addon/icon.png differ diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/addons/pvr.wmc/.gitignore xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/addons/pvr.wmc/.gitignore --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/configure.ac xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/configure.ac --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/configure.ac 2013-03-12 10:51:19.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 @@ -167,10 +168,19 @@ AC_DEFINE([HAVE_BOOST],[1],["Define to 1 if we have the `boost' headers"]) fi echo "Boost: $use_boost" + + AC_CHECK_LIB([z],[inflate], use_zlib=yes, use_zlib=no) + if test "$use_zlib" = "yes"; then + AC_DEFINE([HAVE_ZLIB],[1],["Define to 1 if we have the zlib library"]) + ZLIB_LIBS='-lz' + AC_SUBST(ZLIB_LIBS) + fi + echo "Zlib: $use_zlib" fi ### Addons with dependencies AM_CONDITIONAL([ADDON_MYTHTV], [test "$build_addons_with_dependencies" = "yes" -a "$use_mysql" = "yes" -a "$use_boost" = "yes"]) +AM_CONDITIONAL([ADDON_IPTVSIMPLE], [test "$build_addons_with_dependencies" = "yes" -a "$use_zlib" = "yes"]) ### Check for Intree building if test "x${cross_compiling}" = "xyes" || test "x${cross_compiling}" = "xmaybe"; then @@ -261,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 \ @@ -272,6 +284,9 @@ 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 addons/pvr.dvbviewer/addon/addon.xml @@ -281,6 +296,9 @@ addons/pvr.nextpvr/addon/addon.xml addons/pvr.njoy/addon/addon.xml addons/pvr.vdr.vnsi/addon/addon.xml - addons/pvr.vuplus/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~git20130416.0904-d37ec1d/debian/changelog xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/changelog --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/debian/changelog 2013-11-09 16:57:14.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/changelog 2014-05-04 07:05:20.000000000 +0000 @@ -1,126 +1,1019 @@ -xbmc-pvr-addons (1.0.0~git20130416.0904-d37ec1d-1.1~saucy) saucy; urgency=low +xbmc-pvr-addons (1.0.0~git20140504.0903-2955e1d-0~saucy) saucy; urgency=high - * Update versions in debian/*.{version,changelog} + [manuel] + * [dvbviewer] pump version to 1.9.14 - -- Nathan Rennie-Waldock Sat, 09 Nov 2013 16:56:41 +0000 + [manuel] + * [dvbviewer] don't use timezone offset for timers -xbmc-pvr-addons (1.0.0~git20130416.0904-d37ec1d-1~saucy) saucy; urgency=low + [manuel] + * [dvbviewer] tsbuffer: remove hungarian notations - * Fix VDR Makefile - - Drop VDRDIR from debian/rules - - Correct some paths: - - config.h (was /usr/include) - - vdr.pc (was /usr/include) + [manuel] + * [dvbviewer] reduce implicit calls to SwitchChannel - -- Nathan Rennie-Waldock Sat, 09 Nov 2013 12:59:02 +0000 + [manuel] + * [dvbviewer] remove even more of the hungarian notations -xbmc-pvr-addons (1.0.0~git20130416.0904-d37ec1d-0~saucy) saucy; urgency=low + [manuel] + * [dvbviewer] remove more of the hungarian notations - * Upload to PPA for saucy + [manuel] + * [dvbviewer] implement low performance mode - -- Nathan Rennie-Waldock Sat, 09 Nov 2013 10:06:42 +0000 + [manuel] + * [dvbviewer] don't fetch epg language any more -xbmc-pvr-addons (1.0.0~git20130416.0904-d37ec1d-0~raring) raring; urgency=high + [manuel] + * [dvbviewer] get rid of external XML parser library - [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: 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 - [Fred Hoogduin] - * [argustv-fix] fixed error that occurred when adding a Timer with " in the title + + [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] - * updated README for windows + * [pvr.hts] bump add-on version - [Adam Sutton] - * [tvheadend] fix return PTS when skipping + [Marcel Groothuis] + * [MediaPortal] Fixed: recording playback over rtsp in ffmpeg mode - [Adam Sutton] - * [tvheadend] update addon version info + [Marcel Groothuis] + * [MediaPortal] Update Changelog and version number to v1.9.13 - [Adam Sutton] - * [tvheadend] correct previous mistaken fix to webroot processing + [Marcel Groothuis] + * [MediaPortal] Recordings: Check for in progress recordings and use play them always via the PVR addon - [Adam Sutton] - * [tvheadend] update subscriptionSeek call to use abs PTS + [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.9 + * [mythtv-cmyth] Release v1.9.14 - [Adam Sutton] - * [tvheadend] ensure timeshiftStatus does not spam logs + [WiSo] + * [WIN32] fixed linking of pvr.dvblink - [Adam Sutton] - * [tvheadend] added working seek support. + [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] + * [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] 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] Fix crash when starting Live TV after a failed attempt + * [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 + + + - [Jörg Dembski] - * [vuplus]: increment version number in addon.xml.in - [Jörg Dembski] - * [vuplus]: Add several new features + + + + + [Rainer Hochecker] + * vnsi: fix loading on android by linking GLESv2 [Rainer Hochecker] - * vdr-plugin-vnsiserver: bump version + * vnsi: bump version to 1.8.4 - [Lucian Muresan] - * vdr-vnsiserver Makefile vdr-1.7.36 + [Rainer Hochecker] + * vnsi: add guilib as required addon xml [Rainer Hochecker] - * vdr-plugin-vnsiserver: redesign for timeshift, revised parsers + * vnsi: fix wrong format specifier in error log [Rainer Hochecker] - * vdr-plugin-vnsiserver: revised socket + * vdr-plugin-vnsiserver: fix seeking, only consider audio and video streams for searching [Rainer Hochecker] - * vdr-plugin-vnsiserver: osd - increase memory + * vdr-plugin-vnsiserver: FreeBSD patches, credits to Juergen Lock [Rainer Hochecker] - * vdr-plugin-vnsiserver: trigger epg update + * 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] - * vdr-plugin-vnsiserver: vdr osd + * 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~git20130416.0904-d37ec1d/debian/changelog.in xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/changelog.in --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/debian/changelog.in 2013-04-16 07:04:23.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/changelog.in 2014-05-04 07:03:28.000000000 +0000 @@ -1,104 +1,1019 @@ -xbmc-pvr-addons (1.0.0~git20130416.0904-d37ec1d-0~#DIST#) #DIST#; urgency=high +xbmc-pvr-addons (1.0.0~git20140504.0903-2955e1d-0~#DIST#) #DIST#; urgency=high - [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. + [manuel] + * [dvbviewer] pump version to 1.9.14 - [Fred Hoogduin] - * [argustv-fix] fixed error that occurred when adding a Timer with " in the title + [manuel] + * [dvbviewer] don't use timezone offset for timers + [manuel] + * [dvbviewer] tsbuffer: remove hungarian notations - [Lars Op den Kamp] - * updated README for windows + [manuel] + * [dvbviewer] reduce implicit calls to SwitchChannel - [Adam Sutton] - * [tvheadend] fix return PTS when skipping + [manuel] + * [dvbviewer] remove even more of the hungarian notations - [Adam Sutton] - * [tvheadend] update addon version info + [manuel] + * [dvbviewer] remove more of the hungarian notations - [Adam Sutton] - * [tvheadend] correct previous mistaken fix to webroot processing + [manuel] + * [dvbviewer] implement low performance mode - [Adam Sutton] - * [tvheadend] update subscriptionSeek call to use abs PTS + [manuel] + * [dvbviewer] don't fetch epg language any more - [Christian Fetzer] - * [mythtv-cmyth] Release v1.6.9 + [manuel] + * [dvbviewer] get rid of external XML parser library - [Adam Sutton] - * [tvheadend] ensure timeshiftStatus does not spam logs + [Rainer Hochecker] + * vdr-plugin-vnsiserver: move to own repo https://github.com/FernetMenta/vdr-plugin-vnsiserver - [Adam Sutton] - * [tvheadend] added working seek support. - [Christian Fetzer] - * [mythtv-cmyth] Fix crash when starting Live TV after a failed attempt + [manuel] + * [dvbviewer] pump version to 1.9.14 - [Jörg Dembski] - * [vuplus]: increment version number in addon.xml.in + [manuel] + * [dvbviewer] don't use timezone offset for timers - [Jörg Dembski] - * [vuplus]: Add several new features + [manuel] + * [dvbviewer] tsbuffer: remove hungarian notations - [Rainer Hochecker] - * vdr-plugin-vnsiserver: bump version + [manuel] + * [dvbviewer] reduce implicit calls to SwitchChannel - [Lucian Muresan] - * vdr-vnsiserver Makefile vdr-1.7.36 + [manuel] + * [dvbviewer] remove even more of the hungarian notations - [Rainer Hochecker] - * vdr-plugin-vnsiserver: redesign for timeshift, revised parsers + [manuel] + * [dvbviewer] remove more of the hungarian notations - [Rainer Hochecker] - * vdr-plugin-vnsiserver: revised socket + [manuel] + * [dvbviewer] implement low performance mode - [Rainer Hochecker] - * vdr-plugin-vnsiserver: osd - increase memory + [manuel] + * [dvbviewer] don't fetch epg language any more + + [manuel] + * [dvbviewer] get rid of external XML parser library [Rainer Hochecker] - * vdr-plugin-vnsiserver: trigger epg update + * 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: vdr osd + * vdr-plugin-vnsiserver: move to own repo https://github.com/FernetMenta/vdr-plugin-vnsiserver - [Christian Fetzer] - * [mythtv-cmyth] Release 1.6.8 + + [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] Update version number and changelog + * [MediaPortal] Check for command execution errors [Marcel Groothuis] - * [MediaPortal] Solve CppCheck warning about missing copy constructor + * [MediaPortal] Allow empty username and password for SMB share access [Marcel Groothuis] - * [MediaPortal] Cleanup unused NoSignalStream related variables + * [MediaPortal] TSReader: Don't replace \ by smb:// when not at the start of the path [Marcel Groothuis] - * [MediaPortal] Added: Extra debug info on errors + * [MediaPortal] Channel thumbnails: replace more invalid file name characters in the channel name by a _ [Marcel Groothuis] - * [MediaPortal] Setting recording play count is only supported since TVServerXBMC build 117 + * [MediaPortal] Fix gcc compiler and CPPcheck warnings [Marcel Groothuis] - * MediaPortal: refactor: move loading card settings to separate function + * [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.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] MultiFileReader: continue as soon as the buffer file has a non-zero length + * [pvr.wmc] win32: Fix PVR addon DLL name in release build and remove unneeded build events [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 + * [pvr.wmc] Windows: Fix @ARCHITECTURE@ replacement in addon.xml.in [Marcel Groothuis] - * MediaPortal: channel icons: search also for these extensions: .jpg .jpeg .bmp .gif (Still Windows only) + * [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] Channels: Use MediaPortal VisibleInGuide property as inverted IsHidden flag in XBMC. (requires TVServerXBMC build 120) + * [MediaPortal] Update TVServer enums and put them in the TvDatabase namespace [Marcel Groothuis] - * [MediaPortal] Don't load other channel groups when the user selected to import channels from a single group. + * [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] 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] 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] 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] changed CCards::ParseLines code a bit. One user experienced a crash inside this function. + + [Marcel Groothuis] + * [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] simplify and cleanup receive code + + [Marcel Groothuis] + * [MediaPortal] Update addon version number and changelog to 1.8.9 + + [Marcel Groothuis] + * [MediaPortal] TSReader: OnZap: Enable PAT change detection also on non-Windows systems + + [Marcel Groothuis] + * [MediaPortal] TSReader: fix channel switching behavior when switching across tsbuffer files + + [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 + + [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. + + + + + [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] 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~git20130416.0904-d37ec1d/debian/changelog.in.old xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/changelog.in.old --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/debian/changelog.in.old 2013-04-16 07:04:12.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/changelog.in.old 2014-05-04 07:03:12.000000000 +0000 @@ -1,97 +1,988 @@ xbmc-pvr-addons (#PACKAGEVERSION#-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 + + [Lars Op den Kamp] - * updated README for windows + * [pvr.hts] bump add-on version - [Adam Sutton] - * [tvheadend] fix return PTS when skipping + [Marcel Groothuis] + * [MediaPortal] Fixed: recording playback over rtsp in ffmpeg mode - [Adam Sutton] - * [tvheadend] update addon version info + [Marcel Groothuis] + * [MediaPortal] Update Changelog and version number to v1.9.13 - [Adam Sutton] - * [tvheadend] correct previous mistaken fix to webroot processing + [Marcel Groothuis] + * [MediaPortal] Recordings: Check for in progress recordings and use play them always via the PVR addon - [Adam Sutton] - * [tvheadend] update subscriptionSeek call to use abs PTS + [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.9 + * [mythtv-cmyth] Release v1.9.14 - [Adam Sutton] - * [tvheadend] ensure timeshiftStatus does not spam logs + [WiSo] + * [WIN32] fixed linking of pvr.dvblink - [Adam Sutton] - * [tvheadend] added working seek support. + [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] + * [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] 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] Fix crash when starting Live TV after a failed attempt + * [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 + + + + + - [Jörg Dembski] - * [vuplus]: increment version number in addon.xml.in - [Jörg Dembski] - * [vuplus]: Add several new features + + + [Rainer Hochecker] + * vnsi: fix loading on android by linking GLESv2 + + [Rainer Hochecker] + * vnsi: bump version to 1.8.4 [Rainer Hochecker] - * vdr-plugin-vnsiserver: bump version + * vnsi: add guilib as required addon xml - [Lucian Muresan] - * vdr-vnsiserver Makefile vdr-1.7.36 + [Rainer Hochecker] + * vnsi: fix wrong format specifier in error log [Rainer Hochecker] - * vdr-plugin-vnsiserver: redesign for timeshift, revised parsers + * vdr-plugin-vnsiserver: fix seeking, only consider audio and video streams for searching [Rainer Hochecker] - * vdr-plugin-vnsiserver: revised socket + * vdr-plugin-vnsiserver: FreeBSD patches, credits to Juergen Lock [Rainer Hochecker] - * vdr-plugin-vnsiserver: osd - increase memory + * 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] - * vdr-plugin-vnsiserver: trigger epg update + * fix potential wrong error code in posix socket [Rainer Hochecker] - * vdr-plugin-vnsiserver: vdr osd + * 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] Update version number and changelog + * [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] Solve CppCheck warning about missing copy constructor + * [MediaPortal] use ADDON_STATUS return value in Connect() [Marcel Groothuis] - * [MediaPortal] Cleanup unused NoSignalStream related variables + * [MediaPortal] Fix possible out-of-bounds access on the m_cCards array [Marcel Groothuis] - * [MediaPortal] Added: Extra debug info on errors + * [MediaPortal] changed CCards::ParseLines code a bit. One user experienced a crash inside this function. [Marcel Groothuis] - * [MediaPortal] Setting recording play count is only supported since TVServerXBMC build 117 + * [MediaPortal] Trigger a recording list update when the backend couldn't find the selected recording [Marcel Groothuis] - * MediaPortal: refactor: move loading card settings to separate function + * [MediaPortal] Recordings: Add support for LastPlayedPosition (requires TVServerXBMC build 121 or higher) [Marcel Groothuis] - * [MediaPortal] MultiFileReader: continue as soon as the buffer file has a non-zero length + * [MediaPortal] simplify and cleanup receive code [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] Update addon version number and changelog to 1.8.9 [Marcel Groothuis] - * MediaPortal: channel icons: search also for these extensions: .jpg .jpeg .bmp .gif (Still Windows only) + * [MediaPortal] TSReader: OnZap: Enable PAT change detection also on non-Windows systems [Marcel Groothuis] - * [MediaPortal] Channels: Use MediaPortal VisibleInGuide property as inverted IsHidden flag in XBMC. (requires TVServerXBMC build 120) + * [MediaPortal] TSReader: fix channel switching behavior when switching across tsbuffer files [Marcel Groothuis] - * [MediaPortal] Don't load other channel groups when the user selected to import channels from a single group. + * [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 + + [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. + + + + + [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~git20130416.0904-d37ec1d/debian/control xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/control --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/debian/control 2013-04-16 07:04:23.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/control 2014-05-04 07:05:20.000000000 +0000 @@ -2,7 +2,7 @@ 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 +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, gawk Standards-Version: 3.9.3 Homepage: http://xbmc.org Vcs-Git: git://github.com/opdenkamp/xbmc-pvr-addons.git @@ -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,8 +89,16 @@ 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 +Package: xbmc-pvr-iptvsimple +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +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~git20130416.0904-d37ec1d/debian/control.in xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/control.in --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/debian/control.in 2013-04-16 07:04:12.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/control.in 2014-05-04 07:03:12.000000000 +0000 @@ -2,7 +2,7 @@ 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 +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, gawk Standards-Version: 3.9.3 Homepage: http://xbmc.org Vcs-Git: git://github.com/opdenkamp/xbmc-pvr-addons.git @@ -94,3 +94,11 @@ the award winning free and open source software media-player and entertainment hub for all your digital media +Package: xbmc-pvr-iptvsimple +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: XBMC PVR Iptv Addon - PVR API:#APIVERSION# + 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~git20130416.0904-d37ec1d/debian/patches/series xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/patches/series --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/debian/patches/series 2013-11-09 11:37:35.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/patches/series 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -vdr-Makefile-fixes.patch diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/debian/patches/vdr-Makefile-fixes.patch xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/patches/vdr-Makefile-fixes.patch --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/debian/patches/vdr-Makefile-fixes.patch 2013-11-09 12:58:48.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/patches/vdr-Makefile-fixes.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ ---- a/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/Makefile -+++ b/addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver/Makefile -@@ -16,7 +16,7 @@ - ### The directory environment: - - # Use package data if installed...otherwise assume we're under the VDR source directory: --PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell pkg-config --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc)) -+PKGCFG = $(shell pkg-config --variable=$(1) vdr) - LIBDIR ?= $(call PKGCFG,libdir) - LOCDIR = $(call PKGCFG,locdir) - PLGCFG = $(call PKGCFG,plgcfg) -@@ -32,7 +32,7 @@ - - APIVERSION = $(call PKGCFG,apiversion) - ifeq ($(strip $(APIVERSION)),) --APIVERSION = $(shell grep 'define APIVERSION ' $(VDRDIR)/config.h | awk '{ print $$3 }' | sed -e 's/"//g') -+APIVERSION = $(shell grep 'define APIVERSION ' /usr/include/vdr/config.h | awk '{ print $$3 }' | sed -e 's/"//g') - NOCONFIG := 1 - endif - diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/debian/prepare-build.sh xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/prepare-build.sh --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/debian/prepare-build.sh 2013-04-16 07:04:12.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/prepare-build.sh 2014-05-04 07:03:12.000000000 +0000 @@ -44,6 +44,7 @@ ["pvr.nextpvr"]="xbmc-pvr-nextpvr" ["pvr.demo"]="xbmc-pvr-demo" ["pvr.njoy"]="xbmc-pvr-njoy" + ["pvr.iptvsimple"]="xbmc-pvr-iptvsimple" ) ### diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/debian/rules xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/rules --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/debian/rules 2013-11-09 12:59:32.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/rules 2014-05-04 07:03:12.000000000 +0000 @@ -3,11 +3,12 @@ # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 +SHELL=/bin/bash +VDRVER = $(shell dpkg -s vdr-dev | awk '/Version/ { print $$2 }') # This has to be exported to make some magic below work. export DH_OPTIONS -SHELL=/bin/bash %: dh $@ --parallel @@ -30,11 +31,21 @@ dh_gencontrol override_dh_auto_build: - LIBDIR=$(CURDIR)/debian/vdr-plugin-vnsiserver/usr/lib/vdr/plugins LOCALEDIR=locale $(MAKE) compile -C addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver +ifeq ($(shell dpkg --compare-versions $(VDRVER) ge 2.0 ; echo $$?),0) + @echo "DETECTED VDR v2: $(VERVER)" + $(MAKE) -C addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver +else + @echo "OLD VDR: $(VDRVER)" + 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 +endif dh_auto_build override_dh_auto_install: +ifeq ($(shell dpkg --compare-versions $(VDRVER) ge 2.0 ; echo $$?),0) + DESTDIR=$(CURDIR)/debian/vdr-plugin-vnsiserver $(MAKE) install -C addons/pvr.vdr.vnsi/vdr-plugin-vnsiserver +else 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 +endif dh_auto_install override_dh_gencontrol: diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/vdr-plugin-vnsiserver.changelog 2013-11-09 16:55:40.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,11 +1,5 @@ -xbmc-pvr-addons (1:0.9.1-0saucy) saucy; urgency=low - - * Upload to PPA for saucy - - -- Nathan Rennie-Waldock Sat, 09 Nov 2013 16:55:40 +0000 - -xbmc-pvr-addons (1:0.9.1-0raring) raring; urgency=low +xbmc-pvr-addons (1:0.9.4-14saucy) saucy; urgency=low * no upstream changelog available - -- wsnipex Tue, 16 Apr 2013 09:04:54 +0200 + -- wsnipex Sun, 04 May 2014 09:05:54 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/vdr-plugin-vnsiserver.version 2013-11-09 16:55:39.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-0saucy +1:0.9.4-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/debian/versiontag xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/versiontag --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/debian/versiontag 2013-04-16 07:04:12.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/versiontag 2014-05-04 07:03:12.000000000 +0000 @@ -1 +1 @@ -0 +14 diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-argustv.changelog 2013-11-09 16:55:40.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,10 +1,4 @@ -xbmc-pvr-addons (1.6.166-0saucy) saucy; urgency=low - - * Upload to PPA for saucy - - -- Nathan Rennie-Waldock Sat, 09 Nov 2013 16:55:40 +0000 - -xbmc-pvr-addons (1.6.166-0raring) raring; 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 @@ -65,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 Tue, 16 Apr 2013 09:04:35 +0200 + -- wsnipex Sun, 04 May 2014 09:05:31 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-argustv.version 2013-11-09 16:55:40.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-0saucy +1.9.176-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-demo.changelog 2013-11-09 16:55:40.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,11 +1,5 @@ -xbmc-pvr-addons (1.6.1-0saucy) saucy; urgency=low - - * Upload to PPA for saucy - - -- Nathan Rennie-Waldock Sat, 09 Nov 2013 16:55:40 +0000 - -xbmc-pvr-addons (1.6.1-0raring) raring; urgency=low +xbmc-pvr-addons (1.9.4-14saucy) saucy; urgency=low * no upstream changelog available - -- wsnipex Tue, 16 Apr 2013 09:04:51 +0200 + -- wsnipex Sun, 04 May 2014 09:05:52 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-demo.version 2013-11-09 16:55:40.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-0saucy +1.9.4-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-dvbviewer.changelog 2013-11-09 16:55:41.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,43 +1,48 @@ -xbmc-pvr-addons (1.6.5-0saucy) saucy; urgency=low +xbmc-pvr-addons (1.9.13-14saucy) saucy; urgency=low - * Upload to PPA for saucy + * [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. - -- Nathan Rennie-Waldock Sat, 09 Nov 2013 16:55:41 +0000 - -xbmc-pvr-addons (1.6.5-0raring) raring; 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. - - -- wsnipex Tue, 16 Apr 2013 09:04:49 +0200 + -- wsnipex Sun, 04 May 2014 09:05:49 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-dvbviewer.version 2013-11-09 16:55:40.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-0saucy +1.9.13-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-iptvsimple.changelog 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-iptvsimple.changelog 2014-05-04 07:05:43.000000000 +0000 @@ -0,0 +1,14 @@ +xbmc-pvr-addons (1.9.3-14saucy) saucy; 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:05:43 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-iptvsimple.install xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-iptvsimple.install --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/debian/xbmc-pvr-iptvsimple.install 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-iptvsimple.install 2014-05-04 07:03:12.000000000 +0000 @@ -0,0 +1,2 @@ +usr/lib/xbmc/addons/pvr.iptvsimple/XBMC_IPTV_Simple.pvr +usr/share/xbmc/addons/pvr.iptvsimple diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-iptvsimple.version 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/debian/xbmc-pvr-iptvsimple.version 2014-05-04 07:05:40.000000000 +0000 @@ -0,0 +1 @@ +1.9.3-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-mediaportal-tvserver.changelog 2013-11-09 16:55:41.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,10 +1,4 @@ -xbmc-pvr-addons (1.6.8-0saucy) saucy; urgency=low - - * Upload to PPA for saucy - - -- Nathan Rennie-Waldock Sat, 09 Nov 2013 16:55:41 +0000 - -xbmc-pvr-addons (1.6.8-0raring) raring; 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 @@ -57,4 +51,4 @@ client should abort connection when the TVServerXBMC version is too old v1.1.0.60 - Fix PVR client destroy - -- wsnipex Tue, 16 Apr 2013 09:04:37 +0200 + -- wsnipex Sun, 04 May 2014 09:05:34 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-mediaportal-tvserver.version 2013-11-09 16:55:41.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.8-0saucy +1.9.13-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-mythtv-cmyth.changelog 2013-11-09 16:55:41.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,46 +1,47 @@ -xbmc-pvr-addons (1.6.9-0saucy) saucy; urgency=low +xbmc-pvr-addons (1.9.16-14saucy) saucy; urgency=low - * Upload to PPA for saucy - - -- Nathan Rennie-Waldock Sat, 09 Nov 2013 16:55:41 +0000 - -xbmc-pvr-addons (1.6.9-0raring) raring; urgency=low - - * 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 + * - 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 Tue, 16 Apr 2013 09:04:46 +0200 + -- wsnipex Sun, 04 May 2014 09:05:46 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-mythtv-cmyth.version 2013-11-09 16:55:41.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.9-0saucy +1.9.16-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-nextpvr.changelog 2013-11-09 16:55:41.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,26 +1,26 @@ -xbmc-pvr-addons (1.6.5-0saucy) saucy; urgency=low +xbmc-pvr-addons (1.9.7-14saucy) saucy; urgency=low - * Upload to PPA for saucy + * 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 - -- Nathan Rennie-Waldock Sat, 09 Nov 2013 16:55:41 +0000 - -xbmc-pvr-addons (1.6.5-0raring) raring; 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 - - -- wsnipex Tue, 16 Apr 2013 09:04:32 +0200 + -- wsnipex Sun, 04 May 2014 09:05:28 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-nextpvr.version 2013-11-09 16:55:41.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-0saucy +1.9.7-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-njoy.changelog 2013-11-09 16:55:42.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,11 +1,5 @@ -xbmc-pvr-addons (1.6.2-0saucy) saucy; urgency=low - - * Upload to PPA for saucy - - -- Nathan Rennie-Waldock Sat, 09 Nov 2013 16:55:42 +0000 - -xbmc-pvr-addons (1.6.2-0raring) raring; urgency=low +xbmc-pvr-addons (1.9.5-14saucy) saucy; urgency=low * no upstream changelog available - -- wsnipex Tue, 16 Apr 2013 09:04:43 +0200 + -- wsnipex Sun, 04 May 2014 09:05:40 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-njoy.version 2013-11-09 16:55:41.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-0saucy +1.9.5-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-tvheadend-hts.changelog 2013-11-09 16:55:42.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,10 +1,4 @@ -xbmc-pvr-addons (1.6.19-0saucy) saucy; urgency=low - - * Upload to PPA for saucy - - -- Nathan Rennie-Waldock Sat, 09 Nov 2013 16:55:42 +0000 - -xbmc-pvr-addons (1.6.19-0raring) raring; 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 @@ -38,4 +32,4 @@ removed unneeded member in CHTSPDemux - better handling of disconnect and reconnects 1.6.4 - initial release - -- wsnipex Tue, 16 Apr 2013 09:04:29 +0200 + -- wsnipex Sun, 04 May 2014 09:05:25 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-tvheadend-hts.version 2013-11-09 16:55:42.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-0saucy +1.9.27-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-vdr-vnsi.changelog 2013-11-09 16:55:42.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,11 +1,5 @@ -xbmc-pvr-addons (1.6.4-0saucy) saucy; urgency=low - - * Upload to PPA for saucy - - -- Nathan Rennie-Waldock Sat, 09 Nov 2013 16:55:42 +0000 - -xbmc-pvr-addons (1.6.4-0raring) raring; urgency=low +xbmc-pvr-addons (1.9.8-14saucy) saucy; urgency=low * no upstream changelog available - -- wsnipex Tue, 16 Apr 2013 09:04:26 +0200 + -- wsnipex Sun, 04 May 2014 09:05:23 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-vdr-vnsi.version 2013-11-09 16:55:42.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-0saucy +1.9.8-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-vuplus.changelog 2013-11-09 16:55:43.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,10 +1,4 @@ -xbmc-pvr-addons (1.6.7-0saucy) saucy; urgency=low - - * Upload to PPA for saucy - - -- Nathan Rennie-Waldock Sat, 09 Nov 2013 16:55:43 +0000 - -xbmc-pvr-addons (1.6.7-0raring) raring; 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 @@ -54,4 +48,4 @@ 0.1.1 - fix: URLEncode the service reference when fetching EPG 0.1.0 - Iniital Version - -- wsnipex Tue, 16 Apr 2013 09:04:40 +0200 + -- wsnipex Sun, 04 May 2014 09:05:37 +0200 diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/debian/xbmc-pvr-vuplus.version 2013-11-09 16:55:42.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-0saucy +1.9.11-14saucy diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/.gitignore xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/.gitignore --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/include/cmyth/cmyth.h 2013-03-12 10:51:22.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); @@ -630,9 +671,15 @@ char ** err, char * channame); extern cmyth_recorder_t cmyth_livetv_chain_setup(cmyth_recorder_t old_rec, - int32_t tcp_rcvbuf, + 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); @@ -730,7 +785,7 @@ extern int cmyth_datetime_to_string(char *str, cmyth_timestamp_t ts); -extern cmyth_timestamp_t cmyth_datetime_from_string(char *str); +extern int cmyth_timestamp_to_numstring(char *str, cmyth_timestamp_t ts); extern int cmyth_timestamp_compare(cmyth_timestamp_t ts1, cmyth_timestamp_t ts2); @@ -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. @@ -837,7 +902,7 @@ */ extern cmyth_proginfo_t cmyth_proginfo_get_from_timeslot(cmyth_conn_t control, uint32_t chanid, - time_t recstartts); + const cmyth_timestamp_t recstartts); /** * Retrieve the title of a program. @@ -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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/libcmyth/bookmark.c 2013-03-12 10:51:22.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/bookmark.c 2014-01-04 10:28:12.000000000 +0000 @@ -41,12 +41,12 @@ } sprintf(buf,"%s %"PRIu32" %s","QUERY_BOOKMARK",prog->proginfo_chanId, start_ts_dt); - pthread_mutex_lock(&mutex); - if ((err = cmyth_send_message(conn,buf)) < 0) { + pthread_mutex_lock(&conn->conn_mutex);; + 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); @@ -66,7 +66,7 @@ } out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&conn->conn_mutex); return ret; } @@ -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 @@ -94,7 +102,7 @@ sprintf(buf, "SET_BOOKMARK %"PRIu32" %s %"PRId32" %"PRId32, prog->proginfo_chanId, start_ts_dt, (int32_t)(bookmark >> 32), (int32_t)(bookmark & 0xffffffff)); } - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&conn->conn_mutex);; if ((ret = cmyth_send_message(conn,buf)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", @@ -106,6 +114,6 @@ __FUNCTION__); } out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&conn->conn_mutex); return ret; } diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/libcmyth/channel.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/libcmyth/cmyth_local.h 2013-03-12 10:51:22.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 @@ -40,10 +40,6 @@ #if defined(_MSC_VER) #include "cmyth_msc.h" -//#define PTHREAD_MUTEX_INITIALIZER NULL; -#define PTHREAD_MUTEX_INITIALIZER InitializeCriticalSection(&mutex); -//typedef void* pthread_mutex_t; -typedef CRITICAL_SECTION pthread_mutex_t; #else #include #include @@ -58,9 +54,6 @@ #define closesocket(fd) close(fd) #endif /* _MSC_VER */ -#define mutex __cmyth_mutex -extern pthread_mutex_t mutex; - /* * Some useful constants */ @@ -69,6 +62,8 @@ #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) #define CMYTH_COMMBREAK_START 4 @@ -91,6 +86,7 @@ char * server; /**< hostname of server */ uint16_t port; /**< port of server */ cmyth_conn_ann_t conn_ann; /**< connection announcement */ + pthread_mutex_t conn_mutex; }; /* Sergio: Added to support new livetv protocol */ @@ -104,6 +100,7 @@ char **chain_urls; cmyth_file_t *chain_files; /* File pointers for the urls */ volatile int8_t livetv_watch; /* JLB: Manage program breaks */ + int32_t livetv_buflen; int32_t livetv_tcp_rcvbuf; int32_t livetv_block_len; }; @@ -191,6 +188,7 @@ unsigned long timestamp_minute; unsigned long timestamp_second; int timestamp_isdst; + int timestamp_isutc; }; struct cmyth_proginfo { @@ -199,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; @@ -217,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 */ @@ -243,18 +242,21 @@ 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 { cmyth_proginfo_t *proglist_list; int proglist_count; + pthread_mutex_t proglist_mutex; }; /* @@ -276,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); @@ -308,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, @@ -339,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, @@ -424,6 +431,7 @@ char *name; char *icon; uint8_t visible; + uint8_t radio; uint32_t sourceid; uint32_t multiplex; }; @@ -470,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 { @@ -512,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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/libcmyth/cmyth_msc.h 2013-03-12 10:51:22.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,15 +32,16 @@ #include #include #include +#include #pragma warning(disable:4267) #pragma warning(disable:4996) +#define pthread_mutex_init(a, b) InitializeCriticalSection(a) +#define pthread_mutex_destroy(a) DeleteCriticalSection(a) #define pthread_mutex_lock(a) EnterCriticalSection(a) #define pthread_mutex_unlock(a) LeaveCriticalSection(a) -#define PTHREAD_MUTEX_INITIALIZER InitializeCriticalSection(&mutex); typedef CRITICAL_SECTION pthread_mutex_t; -extern pthread_mutex_t mutex; #define SHUT_RDWR SD_BOTH @@ -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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/libcmyth/commbreak.c 2013-03-12 10:51:22.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/commbreak.c 2014-01-04 10:28:12.000000000 +0000 @@ -110,7 +110,7 @@ sprintf(buf,"%s %"PRIu32" %ld", "QUERY_COMMBREAK", prog->proginfo_chanId, (long)cmyth_timestamp_to_unixtime(prog->proginfo_rec_start_ts)); - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&conn->conn_mutex); if ((err = cmyth_send_message(conn, buf)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", @@ -134,7 +134,7 @@ } out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&conn->conn_mutex); return breaklist; } @@ -156,7 +156,7 @@ sprintf(buf,"%s %"PRIu32" %ld", "QUERY_CUTLIST", prog->proginfo_chanId, (long)cmyth_timestamp_to_unixtime(prog->proginfo_rec_start_ts)); - + pthread_mutex_lock(&conn->conn_mutex); if ((err = cmyth_send_message(conn, buf)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", @@ -180,7 +180,7 @@ } out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&conn->conn_mutex); return breaklist; } @@ -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(&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(&mutex); - return breaklist; -} diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/libcmyth/connection.c 2013-03-12 10:51:22.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/connection.c 2014-01-04 10:28:12.000000000 +0000 @@ -33,31 +33,6 @@ static char * cmyth_conn_get_setting_unlocked(cmyth_conn_t conn, const char* hostname, const char* setting); static int cmyth_conn_set_setting_unlocked(cmyth_conn_t conn, const char* hostname, const char* setting, const char* value); -#ifdef _MSC_VER -CRITICAL_SECTION mutex; - -BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) -{ - switch( ul_reason_for_call ) - { - case DLL_PROCESS_ATTACH: - InitializeCriticalSection(&mutex); - break; - /*case DLL_THREAD_ATTACH: - ... - case DLL_THREAD_DETACH: - ...*/ - case DLL_PROCESS_DETACH: - DeleteCriticalSection(&mutex); - break; - } - return TRUE; -} - -#else -pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; -#endif - typedef struct { unsigned int version; char token[14]; // up to 13 chars used in v74 + the terminating NULL character @@ -78,6 +53,8 @@ {73, "D7FE8D6F"}, {74, "SingingPotato"}, {75, "SweetRock"}, + {76, "FireWilde"}, + {77, "WindMark" }, {0, ""} }; @@ -106,7 +83,7 @@ return; } if (!conn->conn_hang && conn->conn_ann != ANN_NONE) { - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&conn->conn_mutex); /* * Try to shut down the connection. Can't do much @@ -118,7 +95,7 @@ __FUNCTION__, err); } - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&conn->conn_mutex); } } @@ -146,6 +123,7 @@ { free( conn->server ); } + pthread_mutex_destroy(&conn->conn_mutex); cmyth_dbg(CMYTH_DBG_DEBUG, "%s }\n", __FUNCTION__); } @@ -186,6 +164,7 @@ ret->server = NULL; ret->port = 0; ret->conn_ann = ANN_NONE; + pthread_mutex_init(&ret->conn_mutex, NULL); cmyth_dbg(CMYTH_DBG_DEBUG, "%s }\n", __FUNCTION__); return ret; } @@ -227,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; @@ -239,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) { @@ -258,21 +236,18 @@ temp = tcp_rcvbuf; size = sizeof(temp); - setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (void*)&temp, size); + cmyth_dbg(CMYTH_DBG_DEBUG, "%s: setting socket option SO_RCVBUF to %d", __FUNCTION__, tcp_rcvbuf); + 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); - temp = tcp_rcvbuf; - } - tcp_rcvbuf = temp; - - 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); @@ -280,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); @@ -335,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; @@ -351,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); @@ -376,29 +350,26 @@ temp = conn->conn_tcp_rcvbuf; size = sizeof(temp); - setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (void*)&temp, size); + cmyth_dbg(CMYTH_DBG_DEBUG, "%s: setting socket option SO_RCVBUF to %d", __FUNCTION__, conn->conn_tcp_rcvbuf); + 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); - temp = conn->conn_tcp_rcvbuf; } - conn->conn_tcp_rcvbuf = temp; - 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); @@ -427,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); @@ -482,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; } @@ -797,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: * @@ -826,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) @@ -840,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) { @@ -856,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 @@ -881,7 +1016,6 @@ { cmyth_conn_t conn = NULL; char *announcement = NULL; - char *myth_host = NULL; char reply[16]; int err = 0; int count = 0; @@ -905,33 +1039,11 @@ __FUNCTION__); goto shut; } - cmyth_dbg(CMYTH_DBG_PROTO, "%s: connecting data connection\n", - __FUNCTION__); - if (control->conn_version >= 17) { - myth_host = cmyth_conn_get_setting(control, prog->proginfo_host, - "BackendServerIP"); - if (myth_host && (strcmp(myth_host, "-1") == 0)) { - ref_release(myth_host); - myth_host = NULL; - } - } - if (!myth_host) { - cmyth_dbg(CMYTH_DBG_PROTO, - "%s: BackendServerIP setting not found. Using proginfo_host: %s\n", - __FUNCTION__, prog->proginfo_host); - myth_host = ref_alloc(strlen(prog->proginfo_host) + 1); - strcpy(myth_host, prog->proginfo_host); - } - conn = cmyth_connect(myth_host, prog->proginfo_port, - buflen, tcp_rcvbuf); - cmyth_dbg(CMYTH_DBG_PROTO, - "%s: done connecting data connection, conn = %d\n", - __FUNCTION__, conn); + cmyth_dbg(CMYTH_DBG_PROTO, "%s: connecting data connection\n", __FUNCTION__); + conn = cmyth_connect(control->server, control->port, buflen, tcp_rcvbuf); + cmyth_dbg(CMYTH_DBG_PROTO, "%s: done connecting data connection, conn = %d\n", __FUNCTION__, conn); if (!conn) { - cmyth_dbg(CMYTH_DBG_ERROR, - "%s: cmyth_connect(%s, %"PRIu16", %"PRIu32") failed\n", - __FUNCTION__, - myth_host, prog->proginfo_port, buflen); + cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_connect(%s, %"PRIu16", %"PRIu32") failed\n", __FUNCTION__, control->server, control->port, buflen); goto shut; } /* @@ -1016,12 +1128,10 @@ ret->file_data = conn; ret->file_id = file_id; ret->file_length = file_length; - ref_release(myth_host); return ret; shut: ref_release(conn); - ref_release(myth_host); return NULL; } @@ -1060,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); @@ -1269,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); @@ -1390,7 +1493,7 @@ return NULL; } - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&conn->conn_mutex); if ((rec=cmyth_recorder_create()) == NULL) goto fail; @@ -1436,7 +1539,7 @@ conn->conn_tcp_rcvbuf) < 0) goto fail; - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&conn->conn_mutex); return rec; @@ -1444,7 +1547,7 @@ if (rec) ref_release(rec); - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&conn->conn_mutex); return NULL; } @@ -1483,7 +1586,7 @@ return NULL; } - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&conn->conn_mutex); if ((rec=cmyth_recorder_create()) == NULL) goto fail; @@ -1534,7 +1637,7 @@ conn->conn_tcp_rcvbuf) < 0) goto fail; - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&conn->conn_mutex); return rec; @@ -1542,7 +1645,7 @@ if (rec) ref_release(rec); - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&conn->conn_mutex); return NULL; } @@ -1563,7 +1666,7 @@ if ((total == NULL) || (used == NULL)) return -EINVAL; - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&control->conn_mutex); if (control->conn_version >= 32) { snprintf(msg, sizeof(msg), "QUERY_FREE_SPACE_SUMMARY"); } @@ -1633,7 +1736,7 @@ } out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&control->conn_mutex); return ret; } @@ -1653,7 +1756,7 @@ if (!conn) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", __FUNCTION__); - return -1; + return -EINVAL; } return conn->conn_version; @@ -1672,17 +1775,17 @@ if (!conn) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no connection\n", __FUNCTION__); - return -1; + return -EINVAL; } - pthread_mutex_lock(&mutex); + 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; } @@ -1704,7 +1807,7 @@ ret = (int)c; err: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&conn->conn_mutex); return ret; } @@ -1715,17 +1818,17 @@ int count, err; char* result = NULL; - pthread_mutex_lock(&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) { @@ -1758,7 +1861,7 @@ buffer[sizeof(buffer)-1] = 0; cmyth_dbg(CMYTH_DBG_ERROR, "%s: odd left over data %s\n", __FUNCTION__, buffer); } - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&conn->conn_mutex); if(!strcmp("-1",result)) { cmyth_dbg(CMYTH_DBG_PROTO, "%s: Failed to retrieve backend hostname.\n", @@ -1768,7 +1871,7 @@ return result; err: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&conn->conn_mutex); if(result) ref_release(result); @@ -1790,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; } @@ -1853,9 +1956,15 @@ { char* result = NULL; - pthread_mutex_lock(&mutex); + 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(&mutex); + pthread_mutex_unlock(&conn->conn_mutex); return result; } @@ -1866,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); @@ -1883,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; @@ -1900,9 +2009,15 @@ { int result; - pthread_mutex_lock(&mutex); + 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(&mutex); + pthread_mutex_unlock(&conn->conn_mutex); return result; } @@ -1929,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; } /* @@ -1970,7 +2091,7 @@ } } - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&conn->conn_mutex); if ((err = cmyth_send_message(conn, msg)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, @@ -1979,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); @@ -1987,6 +2108,6 @@ } out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&conn->conn_mutex); return err; -} \ No newline at end of file +} diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/libcmyth/event.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/libcmyth/file.c 2013-03-12 10:51:22.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/file.c 2014-01-28 20:43:50.000000000 +0000 @@ -51,7 +51,7 @@ return; } if (file->file_control) { - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&file->file_control->conn_mutex); /* * Try to shut down the file transfer. Can't do much @@ -74,7 +74,7 @@ goto fail; } fail: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&file->file_control->conn_mutex); ref_release(file->file_control); } if (file->closed_callback) { @@ -322,7 +322,7 @@ { struct timeval tv; fd_set fds; - int ret; + int32_t ret; if (file == NULL || file->file_data == NULL) return -EINVAL; @@ -409,7 +409,7 @@ return -EINVAL; } - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&file->file_control->conn_mutex); if(len > file->file_data->conn_tcp_rcvbuf) len = file->file_data->conn_tcp_rcvbuf; @@ -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; } @@ -445,7 +445,7 @@ ret = c; out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&file->file_control->conn_mutex); return ret; } @@ -474,7 +474,7 @@ int64_t cmyth_file_seek(cmyth_file_t file, int64_t offset, int8_t whence) { - char msg[128]; + char msg[4096]; int err; int count; int64_t c; @@ -484,18 +484,31 @@ if (file == NULL) return -EINVAL; - if ((offset == 0) && (whence == WHENCE_CUR)) - return file->file_pos; - - if ((offset == file->file_pos) && (whence == WHENCE_SET)) - return file->file_pos; + if (whence == WHENCE_CUR) { + if (offset == 0) + return file->file_pos; + ret = file->file_pos + offset; + if (ret < 0 || ret > file->file_length) + goto inv; + } + if (whence == WHENCE_SET) { + if (offset == file->file_pos) + return file->file_pos; + if (offset < 0 || offset > file->file_length) + goto inv; + } + if (whence == WHENCE_END) { + ret = file->file_length - offset; + if (ret < 0 || ret > file->file_length) + goto inv; + } - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&file->file_control->conn_mutex); 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) @@ -527,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; } @@ -558,9 +571,14 @@ ret = file->file_pos; out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&file->file_control->conn_mutex); return ret; + +inv: + cmyth_dbg(CMYTH_DBG_ERROR, "%s: seek out of range: file: %"PRIu32" pos: %"PRId64" length: %"PRId64" whence: %"PRId8" offset: %"PRId64, + __FUNCTION__, file->file_id, file->file_pos, file->file_length, whence, offset); + return -1; } /* @@ -600,7 +618,7 @@ if(len > file->file_data->conn_tcp_rcvbuf) len = file->file_data->conn_tcp_rcvbuf; - pthread_mutex_lock (&mutex); + pthread_mutex_lock (&file->file_control->conn_mutex); /* make sure we have outstanding requests that fill the buffer that was called with */ /* this way we should be able to saturate the network connection better */ @@ -745,7 +763,7 @@ ret = (int32_t)(cur - buf); out: - pthread_mutex_unlock (&mutex); + pthread_mutex_unlock (&file->file_control->conn_mutex); return ret; } @@ -780,7 +798,7 @@ return -EINVAL; } - pthread_mutex_lock (&mutex); + pthread_mutex_lock(&file->file_control->conn_mutex); snprintf (msg, sizeof (msg), "QUERY_FILETRANSFER %"PRIu32"[]:[]IS_OPEN", @@ -812,7 +830,7 @@ if (ret == 0) cmyth_dbg(CMYTH_DBG_ERROR, "%s: file transfer socket is closed\n", __FUNCTION__); out: - pthread_mutex_unlock (&mutex); + pthread_mutex_unlock(&file->file_control->conn_mutex); return ret; } @@ -845,7 +863,7 @@ return -EINVAL; } - pthread_mutex_lock (&mutex); + pthread_mutex_lock(&file->file_control->conn_mutex); snprintf(msg, sizeof(msg), "QUERY_FILETRANSFER %"PRIu32"[]:[]SET_TIMEOUT[]:[]%"PRId32, @@ -866,7 +884,7 @@ ret = 0; out: - pthread_mutex_unlock (&mutex); + pthread_mutex_unlock(&file->file_control->conn_mutex); return ret; } diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/libcmyth/input.c 2013-03-12 10:51:22.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/input.c 2014-01-04 10:28:12.000000000 +0000 @@ -114,7 +114,7 @@ } sprintf(buf,"QUERY_RECORDER %"PRIu32"[]:[]GET_FREE_INPUTS", rec->rec_id); - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&rec->rec_conn->conn_mutex); if ((err = cmyth_send_message(rec->rec_conn, buf)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_send_message() failed (%d)\n", @@ -137,8 +137,8 @@ goto out; } - out: - pthread_mutex_unlock(&mutex); +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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/libcmyth/livetv.c 2013-03-12 10:51:22.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); @@ -121,6 +117,7 @@ ret->chain_files = NULL; ret->progs = NULL; ret->livetv_watch = 0; /* JLB: Manage program breaks */ + ret->livetv_buflen = 0; ret->livetv_tcp_rcvbuf = 0; ret->livetv_block_len = 0; ref_set_destroy(ret, (ref_destroy_t)cmyth_livetv_chain_destroy); @@ -128,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 @@ -148,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, @@ -327,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__); @@ -353,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 @@ -414,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; } @@ -443,7 +298,7 @@ */ if (cmyth_livetv_chain_has_url(rec, url) == -1) { - ft = cmyth_conn_connect_file(loc_prog, rec->rec_conn, 4096, rec->rec_livetv_chain->livetv_tcp_rcvbuf); + ft = cmyth_conn_connect_file(loc_prog, rec->rec_conn, rec->rec_livetv_chain->livetv_buflen, rec->rec_livetv_chain->livetv_tcp_rcvbuf); if (!ft) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_conn_connect_file(%s) failed\n", @@ -458,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); @@ -485,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; } @@ -531,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 @@ -589,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 ...' @@ -663,8 +518,8 @@ * caller needs to do this on a failure. */ cmyth_recorder_t -cmyth_livetv_chain_setup(cmyth_recorder_t rec, int32_t tcp_rcvbuf, - void (*prog_update_callback)(cmyth_proginfo_t)) +cmyth_livetv_chain_setup(cmyth_recorder_t rec, uint32_t buflen, int32_t tcp_rcvbuf, + void (*prog_update_callback)(cmyth_proginfo_t)) { cmyth_recorder_t new_rec = NULL; @@ -673,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; } @@ -695,29 +549,32 @@ } 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; } /* JLB: Set tcp receive buffer for the chain files */ + new_rec->rec_livetv_chain->livetv_buflen = buflen; new_rec->rec_livetv_chain->livetv_tcp_rcvbuf = tcp_rcvbuf; /* JLB: Manage program breaks. Switch OFF watch signal */ new_rec->rec_livetv_chain->livetv_watch = 0; 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) { - ft = cmyth_conn_connect_file(loc_prog, new_rec->rec_conn, 4096, new_rec->rec_livetv_chain->livetv_tcp_rcvbuf); + 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; } @@ -728,15 +585,17 @@ * 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 */ - cmyth_livetv_chain_switch(new_rec, 0); + cmyth_livetv_chain_switch_last(new_rec); new_rec->rec_livetv_chain->chain_switch_on_create = 0; } } @@ -759,7 +618,7 @@ /* * cmyth_livetv_chain_get_block() * - * Scope: PUBLIC + * Scope: PRIVATE * * Description * @@ -771,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); } @@ -816,11 +663,17 @@ 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; - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&rec->rec_conn->conn_mutex); ret = 0; @@ -841,9 +694,9 @@ "%s: wait until livetv_watch is OFF\n", __FUNCTION__); for (i = 0; i < 4; i++) { - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); usleep(500000); - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&rec->rec_conn->conn_mutex); if (rec->rec_livetv_chain->livetv_watch == 0) break; } @@ -857,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); @@ -873,8 +726,9 @@ out: - pthread_mutex_unlock(&mutex); - + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); + if (oldfile) + ref_release(oldfile); return ret; } @@ -883,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); } @@ -895,7 +753,7 @@ /* * cmyth_livetv_chain_request_block() * - * Scope: PUBLIC + * Scope: PRIVATE * * Description * @@ -911,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); @@ -930,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__); @@ -938,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) { @@ -966,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; } @@ -975,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", @@ -1005,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; } @@ -1028,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 * @@ -1066,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; @@ -1099,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; @@ -1115,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 (fp && cur >=0) + 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; } /* @@ -1166,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; } /* @@ -1202,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); @@ -1232,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); @@ -1245,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); @@ -1266,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); @@ -1289,20 +1221,24 @@ 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; } - if ((rtrn = cmyth_livetv_chain_setup(rec, tcp_rcvbuf, + if ((rtrn = cmyth_livetv_chain_setup(rec, buflen, tcp_rcvbuf, prog_update_callback)) == NULL) { *err = "Failed to setup livetv."; goto err; @@ -1325,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; @@ -1341,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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/libcmyth/Makefile.am 2013-03-12 10:51:22.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,7 +23,8 @@ utf8tolatin1.c \ recordingrule.c \ channel.c \ - storagegroup.c + storagegroup.c \ + epginfo.c INCLUDES=-I../include/ $(MYSQL_INCLUDES) diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/libcmyth/mythtv_mysql.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/libcmyth/proginfo.c 2013-03-12 10:51:22.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(&mutex); + 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,8 +639,13 @@ goto out; } + if (result_code == -2) + ret = -1; + else + ret = 0; + out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&control->conn_mutex); free(buf); return ret; @@ -663,13 +707,13 @@ sprintf(buf, "FORGET_RECORDING 0[]:[]%s", proginfo); free(proginfo); - pthread_mutex_lock(&mutex); + 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; } @@ -683,7 +727,7 @@ } out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&control->conn_mutex); free(buf); return ret; @@ -745,13 +789,13 @@ sprintf(buf, "STOP_RECORDING 0[]:[]%s", proginfo); free(proginfo); - pthread_mutex_lock(&mutex); + 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; } @@ -765,7 +809,7 @@ } out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&control->conn_mutex); free(buf); return ret; @@ -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) @@ -1477,7 +1604,7 @@ sprintf(buf, "FILL_PROGRAM_INFO cmyth[]:[]0[]:[]%s", proginfo); free(proginfo); - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&control->conn_mutex); length = prog->proginfo_Length; @@ -1518,7 +1645,7 @@ } out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&control->conn_mutex); free(buf); return ret; @@ -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(&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(&mutex); - return prog_count; -} - cmyth_proginfo_t cmyth_proginfo_get_from_basename(cmyth_conn_t control, const char* basename) { @@ -1766,7 +1868,7 @@ * to enumerating all recordings */ if(control->conn_version >= 32 && strchr(basename, ' ') == NULL) { - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&control->conn_mutex); snprintf(msg, sizeof(msg), "QUERY_RECORDING BASENAME %s", basename); @@ -1807,10 +1909,10 @@ goto out; } - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&control->conn_mutex); return prog; out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&control->conn_mutex); if(prog) ref_release(prog); return NULL; @@ -1846,14 +1948,13 @@ } cmyth_proginfo_t -cmyth_proginfo_get_from_timeslot(cmyth_conn_t control, uint32_t chanid, time_t recstartts) +cmyth_proginfo_get_from_timeslot(cmyth_conn_t control, uint32_t chanid, const cmyth_timestamp_t recstartts) { int err = 0; int count, i; char msg[4096]; cmyth_proginfo_t prog = NULL; cmyth_proglist_t list = NULL; - cmyth_timestamp_t ts; char time[15]; if (!control) { @@ -1862,24 +1963,14 @@ return NULL; } - ts = cmyth_timestamp_from_unixtime(recstartts); - if (!ts) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: timestamp NULL\n", - __FUNCTION__); + if ((err = cmyth_timestamp_to_numstring(time, recstartts)) < 0) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: cmyth_timestamp_to_numstring() failed (%d)\n", + __FUNCTION__, err); return NULL; } - sprintf(time, - "%4.4ld%2.2ld%2.2ld%2.2ld%2.2ld%2.2ld", - ts->timestamp_year, - ts->timestamp_month, - ts->timestamp_day, - ts->timestamp_hour, - ts->timestamp_minute, - ts->timestamp_second); - if(control->conn_version >= 32) { - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&control->conn_mutex); snprintf(msg, sizeof(msg), "QUERY_RECORDING TIMESLOT %"PRIu32" %s", chanid, time); @@ -1908,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; } @@ -1920,10 +2011,10 @@ goto out; } - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&control->conn_mutex); return prog; out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&control->conn_mutex); if(prog) ref_release(prog); return NULL; @@ -1944,7 +2035,7 @@ __FUNCTION__); continue; } - if (cmyth_timestamp_compare(prog->proginfo_rec_start_ts, ts) != 0 || + if (cmyth_timestamp_compare(prog->proginfo_rec_start_ts, recstartts) != 0 || prog->proginfo_chanId != chanid) { ref_release(prog); prog = NULL; @@ -1957,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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/libcmyth/proglist.c 2013-03-12 10:51:22.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/proglist.c 2014-01-04 10:28:12.000000000 +0000 @@ -62,6 +62,7 @@ if (pl->proglist_list) { free(pl->proglist_list); } + pthread_mutex_destroy(&pl->proglist_mutex); } /* @@ -93,6 +94,7 @@ ret->proglist_list = NULL; ret->proglist_count = 0; + pthread_mutex_init(&ret->proglist_mutex, NULL); return ret; } @@ -154,7 +156,7 @@ return -EINVAL; } - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&pl->proglist_mutex); for (i=0; iproglist_count; i++) { if (cmyth_proginfo_compare(prog, pl->proglist_list[i]) == 0) { @@ -170,7 +172,7 @@ } out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&pl->proglist_mutex); return ret; } @@ -237,7 +239,7 @@ return -EINVAL; } - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&conn->conn_mutex); if ((err = cmyth_send_message(conn, msg)) < 0) { cmyth_dbg(CMYTH_DBG_ERROR, @@ -282,7 +284,7 @@ ret = 0; out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&conn->conn_mutex); return ret; } @@ -616,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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/libcmyth/recorder.c 2013-03-12 10:51:22.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/recorder.c 2014-01-28 20:43:50.000000000 +0000 @@ -180,16 +180,16 @@ return -EINVAL; } - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&rec->rec_conn->conn_mutex); 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; } @@ -205,7 +205,7 @@ ret = c; out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); return ret; } @@ -242,21 +242,21 @@ return -EINVAL; } - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&rec->rec_conn->conn_mutex); 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", @@ -269,7 +269,7 @@ ret = 0; out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); return ret; } @@ -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,10 +680,10 @@ if (!rec) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); - return -ENOSYS; + return -EINVAL; } - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&rec->rec_conn->conn_mutex); snprintf(msg, sizeof(msg), "QUERY_RECORDER %"PRIu32"[]:[]CANCEL_NEXT_RECORDING[]:[]%"PRIu32 ,rec->rec_id, cancel == 1); @@ -475,7 +700,7 @@ ret = 0; fail: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); return ret; } @@ -511,17 +736,17 @@ return -EINVAL; } - pthread_mutex_lock(&mutex); + 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; @@ -530,7 +755,7 @@ ret = 0; err: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); return ret; } @@ -616,50 +841,53 @@ 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(&mutex); + pthread_mutex_lock(&rec->rec_conn->conn_mutex); snprintf(msg, sizeof(msg), "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: - pthread_mutex_unlock(&mutex); - +out: + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); + if (oldchain) + ref_release(oldchain); return ret; } @@ -689,50 +917,53 @@ 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(&mutex); + pthread_mutex_lock(&rec->rec_conn->conn_mutex); snprintf(msg, sizeof(msg), "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: - pthread_mutex_unlock(&mutex); - +out: + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); + if (oldchain) + ref_release(oldchain); return ret; } @@ -889,20 +1120,20 @@ return -EINVAL; } - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&rec->rec_conn->conn_mutex); snprintf(msg, sizeof(msg), "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; } @@ -910,7 +1141,7 @@ ret = 1; fail: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); return ret; } @@ -976,16 +1207,16 @@ __FUNCTION__); goto out; } - pthread_mutex_lock(&mutex); + 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); @@ -1010,7 +1241,7 @@ } out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); return proginfo; } @@ -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,12 +1332,12 @@ if (!rec) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); - return -ENOSYS; + return -EINVAL; } control = rec->rec_conn; - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&rec->rec_conn->conn_mutex); t = time(NULL); tm = localtime(&t); @@ -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); @@ -1192,7 +1423,7 @@ ret = 0; out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); return ret; } @@ -1348,22 +1579,22 @@ if (!rec) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); - return -ENOSYS; + return -EINVAL; } - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&rec->rec_conn->conn_mutex); 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); @@ -1373,7 +1604,7 @@ ret = 0; fail: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); return ret; } @@ -1392,10 +1623,10 @@ if (!rec) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); - return -ENOSYS; + return -EINVAL; } - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&rec->rec_conn->conn_mutex); /* Get our own IP address */ @@ -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); @@ -1436,7 +1667,7 @@ ret = 0; fail: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); return ret; } @@ -1451,22 +1682,22 @@ if (!rec) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: no recorder connection\n", __FUNCTION__); - return -ENOSYS; + return -EINVAL; } - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&rec->rec_conn->conn_mutex); 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); @@ -1476,7 +1707,7 @@ ret = 0; fail: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); return ret; } @@ -1491,25 +1722,25 @@ 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(&mutex); + pthread_mutex_lock(&rec->rec_conn->conn_mutex); 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); @@ -1519,7 +1750,7 @@ ret = 0; fail: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); return ret; } @@ -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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/libcmyth/recordingrule.c 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/libcmyth/ringbuf.c 2013-03-12 10:51:22.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,20 +138,19 @@ 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; } control = rec->rec_conn; - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&rec->rec_conn->conn_mutex); snprintf(msg, sizeof(msg), "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); @@ -237,7 +236,7 @@ new_rec->rec_ring->ringbuf_fill = fill; out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); return new_rec; } @@ -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,12 +348,11 @@ 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(&mutex); + pthread_mutex_lock(&rec->rec_conn->conn_mutex); if(len > rec->rec_ring->conn_data->conn_tcp_rcvbuf) len = rec->rec_ring->conn_data->conn_tcp_rcvbuf; @@ -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; } @@ -374,7 +382,7 @@ ret = c; out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); return ret; } @@ -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,14 +412,12 @@ 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 (&mutex); + pthread_mutex_lock (&rec->rec_conn->conn_mutex); if(len > rec->rec_ring->conn_data->conn_tcp_rcvbuf) len = rec->rec_ring->conn_data->conn_tcp_rcvbuf; @@ -507,7 +514,7 @@ ret = (int32_t)(cur - buf); out: - pthread_mutex_unlock (&mutex); + pthread_mutex_unlock (&rec->rec_conn->conn_mutex); return ret; } @@ -542,15 +549,17 @@ 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; if ((offset == 0) && (whence == WHENCE_CUR)) return ring->file_pos; - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&rec->rec_conn->conn_mutex); snprintf(msg, sizeof(msg), "QUERY_RECORDER %"PRIu32"[]:[]SEEK_RINGBUF[]:[]%"PRId32"[]:[]%"PRId32"[]:[]%"PRId8"[]:[]%"PRId32"[]:[]%"PRId32, @@ -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); @@ -593,7 +602,7 @@ ret = ring->file_pos; out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&rec->rec_conn->conn_mutex); return ret; } diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/libcmyth/socket.c 2013-03-12 10:51:22.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 @@ -369,6 +369,17 @@ } } + if (sep_start && conn->conn_buf[conn->conn_pos] != (unsigned char)*state) { + /* + * Reset separator in case the current character does not match + * the expected part of the separator. This needs to take place + * before checking if the current character starts a new separator. + * (To resolve issues with strings that look like [[]:[]) + */ + sep_start = NULL; + state = separator; + } + if (conn->conn_buf[conn->conn_pos] == (unsigned char)*state) { /* * We matched the next (possibly first) step @@ -378,13 +389,6 @@ sep_start = &buf[placed]; } ++state; - } else { - /* - * No match with separator, reset the state to the - * beginning. - */ - sep_start = NULL; - state = separator; } if (placed < buflen) { @@ -647,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; @@ -673,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]; @@ -693,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", @@ -1264,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; @@ -1580,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) */ @@ -1849,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; @@ -2191,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; @@ -2274,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); @@ -2687,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; } /* @@ -2844,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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/libcmyth/storagegroup.c 2013-03-12 10:51:22.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,17 +165,17 @@ 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(&mutex); + pthread_mutex_lock(&control->conn_mutex); snprintf(msg, sizeof(msg), "QUERY_SG_GETFILELIST[]:[]%s[]:[]%s[]:[][]:[]1", hostname, storagegroup); @@ -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; } } @@ -246,7 +244,7 @@ cmyth_dbg(CMYTH_DBG_DEBUG, "%s: results= %d\n", __FUNCTION__, res); out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&control->conn_mutex); return ret; } @@ -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; @@ -284,7 +282,7 @@ return 0; } - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&control->conn_mutex); snprintf(msg, sizeof(msg), "QUERY_SG_FILEQUERY[]:[]%s[]:[]%s[]:[]%s", hostname, storagegroup, filename); @@ -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; } @@ -343,7 +341,7 @@ cmyth_dbg(CMYTH_DBG_DEBUG, "%s: filename: %s\n", __FUNCTION__, ret->filename); out: - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&control->conn_mutex); return ret; } @@ -372,4 +370,4 @@ return 0; } return file->size; -} \ No newline at end of file +} diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/libcmyth/timestamp.c 2013-03-12 10:51:22.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/cmyth/libcmyth/timestamp.c 2014-01-04 10:28:12.000000000 +0000 @@ -60,7 +60,8 @@ ret->timestamp_hour = 0; ret->timestamp_minute = 0; ret->timestamp_second = 0; - ret->timestamp_isdst = 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,11 +215,10 @@ return NULL; } -cmyth_timestamp_t +static cmyth_timestamp_t cmyth_timestamp_from_tm(struct tm * tm_datetime) { - cmyth_timestamp_t ret; - ret = cmyth_timestamp_create(); + cmyth_timestamp_t ret = cmyth_timestamp_create(); if (!ret) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL timestamp\n", __FUNCTION__); @@ -230,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) @@ -263,15 +354,27 @@ time_t cmyth_timestamp_to_unixtime(cmyth_timestamp_t ts) { - struct tm tm; - tm.tm_sec = ts->timestamp_second; - tm.tm_min = ts->timestamp_minute; - tm.tm_hour = ts->timestamp_hour; - tm.tm_mday = ts->timestamp_day; - tm.tm_mon = ts->timestamp_month-1; - tm.tm_year = ts->timestamp_year-1900; - tm.tm_isdst = ts->timestamp_isdst; - return mktime(&tm); + struct tm tm_datetime; + + if (!ts) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL timestamp provided\n", + __FUNCTION__); + 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; + tm_datetime.tm_min = ts->timestamp_minute; + tm_datetime.tm_hour = ts->timestamp_hour; + tm_datetime.tm_mday = ts->timestamp_day; + tm_datetime.tm_mon = ts->timestamp_month-1; + tm_datetime.tm_year = ts->timestamp_year-1900; + tm_datetime.tm_isdst = ts->timestamp_isdst; + return mktime(&tm_datetime); } /* @@ -285,6 +388,7 @@ * user supplied buffer 'str'. The size of 'str' must be * CMYTH_TIMESTAMP_LEN + 1 or this will overwrite beyond 'str'. * + * Format: ISO-8601 '%Y-%m-%dT%H:%i:%s' "2013-03-21T18:02:59" * * Return Value: * @@ -305,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; } @@ -327,6 +446,7 @@ * user supplied buffer 'str'. The size of 'str' must be * CMYTH_TIMESTAMP_LEN + 1 or this will overwrite beyond 'str'. * + * Format: ISO-8601 '%Y-%m-%d' "2013-03-21" * * Return Value: * @@ -356,8 +476,7 @@ } int -cmyth_timestamp_to_display_string(char *str, cmyth_timestamp_t ts, - int time_format_12) +cmyth_timestamp_to_display_string(char *str, cmyth_timestamp_t ts, int time_format_12) { if (!str) { cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL output string provided\n", @@ -391,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, @@ -439,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; @@ -455,7 +591,48 @@ return 0; } - +/* + * cmyth_timestamp_to_numstring(char *str, cmyth_timestamp_t ts) + * + * Scope: PUBLIC + * + * Description + * + * Create a string from the timestamp structure 'ts' and put it in the + * user supplied buffer 'str'. The size of 'str' must be + * CMYTH_TIMESTAMP_NUMERIC_LEN + 1 or this will overwrite beyond 'str'. + * + * Format: Numeric big endian '%Y%m%d%H%i%s' "20130321180259" + * + * Return Value: + * + * Success: 0 + * + * Failure: -(ERRNO) + */ +int +cmyth_timestamp_to_numstring(char *str, cmyth_timestamp_t ts) +{ + if (!str) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL output string provided\n", + __FUNCTION__); + return -EINVAL; + } + if (!ts) { + cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL timestamp provided\n", + __FUNCTION__); + return -EINVAL; + } + sprintf(str, + "%4.4ld%2.2ld%2.2ld%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; +} /* * cmyth_timestamp_compare(cmyth_timestamp_t ts1, cmyth_timestamp_t ts2) @@ -542,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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/librefmem/alloc.c 2012-11-15 21:18:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/Win32/libcmyth.vcxproj 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/cmyth/Win32/libcmyth.vcxproj.filters 2013-03-12 10:51:22.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~git20130416.0904-d37ec1d/lib/libdvblinkremote/channel.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/channel.cpp --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/COPYING xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/COPYING --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/curlhttpclient.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/curlhttpclient.cpp --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/curlhttpclient.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/curlhttpclient.h --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/dvblinkremotecommunication.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremotecommunication.cpp --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/dvblinkremoteconnection.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremoteconnection.h --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/dvblinkremote.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremote.cpp --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/dvblinkremote.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremote.h --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/dvblinkremotehttp.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremotehttp.cpp --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/dvblinkremotehttp.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremotehttp.h --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/dvblinkremoteserialization.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/dvblinkremoteserialization.h --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/epg.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/epg.cpp --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/Makefile.am --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/program.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/program.cpp --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/recording.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/recording.cpp --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/request.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/request.h --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/response.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/response.h --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/scheduling.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/scheduling.cpp --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/scheduling.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/scheduling.h --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/stream.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/stream.cpp --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/util.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/util.cpp --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/util.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/util.h --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/libdvblinkremote/version.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/libdvblinkremote/version.h --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/Makefile.am --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/lib/Makefile.am 2012-11-15 21:18:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/platform/posix/os-socket.h 2013-02-16 21:46:33.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/platform/windows/os-socket.h 2012-11-15 21:18:19.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~git20130416.0904-d37ec1d/lib/rapidxml/license.txt xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/rapidxml/license.txt --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/lib/rapidxml/license.txt 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/rapidxml/license.txt 2013-10-31 06:59:44.000000000 +0000 @@ -0,0 +1,52 @@ +Use of this software is granted under one of the following two licenses, +to be chosen freely by the user. + +1. Boost Software License - Version 1.0 - August 17th, 2003 +=============================================================================== + +Copyright (c) 2006, 2007 Marcin Kalicinski + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +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, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +2. The MIT License +=============================================================================== + +Copyright (c) 2006, 2007 Marcin Kalicinski + +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. diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/lib/rapidxml/manual.html xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/rapidxml/manual.html --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/lib/rapidxml/manual.html 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/rapidxml/manual.html 2013-10-31 06:59:44.000000000 +0000 @@ -0,0 +1,406 @@ +

RAPIDXML Manual

Version 1.13

Copyright (C) 2006, 2009 Marcin Kalicinski
See accompanying file license.txt for license information.

Table of Contents

1. What is RapidXml?
1.1 Dependencies And Compatibility
1.2 Character Types And Encodings
1.3 Error Handling
1.4 Memory Allocation
1.5 W3C Compliance
1.6 API Design
1.7 Reliability
1.8 Acknowledgements
2. Two Minute Tutorial
2.1 Parsing
2.2 Accessing The DOM Tree
2.3 Modifying The DOM Tree
2.4 Printing XML
3. Differences From Regular XML Parsers
3.1 Lifetime Of Source Text
3.2 Ownership Of Strings
3.3 Destructive Vs Non-Destructive Mode
4. Performance
4.1 Comparison With Other Parsers
5. Reference

1. What is RapidXml?

RapidXml is an attempt to create the fastest XML DOM parser possible, while retaining useability, portability and reasonable W3C compatibility. It is an in-situ parser written in C++, with parsing speed approaching that of strlen() function executed on the same data.

+ Entire parser is contained in a single header file, so no building or linking is neccesary. To use it you just need to copy rapidxml.hpp file to a convenient place (such as your project directory), and include it where needed. You may also want to use printing functions contained in header rapidxml_print.hpp.

1.1 Dependencies And Compatibility

RapidXml has no dependencies other than a very small subset of standard C++ library (<cassert>, <cstdlib>, <new> and <exception>, unless exceptions are disabled). It should compile on any reasonably conformant compiler, and was tested on Visual C++ 2003, Visual C++ 2005, Visual C++ 2008, gcc 3, gcc 4, and Comeau 4.3.3. Care was taken that no warnings are produced on these compilers, even with highest warning levels enabled.

1.2 Character Types And Encodings

RapidXml is character type agnostic, and can work both with narrow and wide characters. Current version does not fully support UTF-16 or UTF-32, so use of wide characters is somewhat incapacitated. However, it should succesfully parse wchar_t strings containing UTF-16 or UTF-32 if endianness of the data matches that of the machine. UTF-8 is fully supported, including all numeric character references, which are expanded into appropriate UTF-8 byte sequences (unless you enable parse_no_utf8 flag).

+ Note that RapidXml performs no decoding - strings returned by name() and value() functions will contain text encoded using the same encoding as source file. Rapidxml understands and expands the following character references: &apos; &amp; &quot; &lt; &gt; &#...; Other character references are not expanded.

1.3 Error Handling

By default, RapidXml uses C++ exceptions to report errors. If this behaviour is undesirable, RAPIDXML_NO_EXCEPTIONS can be defined to suppress exception code. See parse_error class and parse_error_handler() function for more information.

1.4 Memory Allocation

RapidXml uses a special memory pool object to allocate nodes and attributes, because direct allocation using new operator would be far too slow. Underlying memory allocations performed by the pool can be customized by use of memory_pool::set_allocator() function. See class memory_pool for more information.

1.5 W3C Compliance

RapidXml is not a W3C compliant parser, primarily because it ignores DOCTYPE declarations. There is a number of other, minor incompatibilities as well. Still, it can successfully parse and produce complete trees of all valid XML files in W3C conformance suite (over 1000 files specially designed to find flaws in XML processors). In destructive mode it performs whitespace normalization and character entity substitution for a small set of built-in entities.

1.6 API Design

RapidXml API is minimalistic, to reduce code size as much as possible, and facilitate use in embedded environments. Additional convenience functions are provided in separate headers: rapidxml_utils.hpp and rapidxml_print.hpp. Contents of these headers is not an essential part of the library, and is currently not documented (otherwise than with comments in code).

1.7 Reliability

RapidXml is very robust and comes with a large harness of unit tests. Special care has been taken to ensure stability of the parser no matter what source text is thrown at it. One of the unit tests produces 100,000 randomly corrupted variants of XML document, which (when uncorrupted) contains all constructs recognized by RapidXml. RapidXml passes this test when it correctly recognizes that errors have been introduced, and does not crash or loop indefinitely.

+ Another unit test puts RapidXml head-to-head with another, well estabilished XML parser, and verifies that their outputs match across a wide variety of small and large documents.

+ Yet another test feeds RapidXml with over 1000 test files from W3C compliance suite, and verifies that correct results are obtained. There are also additional tests that verify each API function separately, and test that various parsing modes work as expected.

1.8 Acknowledgements

I would like to thank Arseny Kapoulkine for his work on pugixml, which was an inspiration for this project. Additional thanks go to Kristen Wegner for creating pugxml, from which pugixml was derived. Janusz Wohlfeil kindly ran RapidXml speed tests on hardware that I did not have access to, allowing me to expand performance comparison table.

2. Two Minute Tutorial

2.1 Parsing

The following code causes RapidXml to parse a zero-terminated string named text:
using namespace rapidxml;
+xml_document<> doc;    // character type defaults to char
+doc.parse<0>(text);    // 0 means default parse flags
+
doc object is now a root of DOM tree containing representation of the parsed XML. Because all RapidXml interface is contained inside namespace rapidxml, users must either bring contents of this namespace into scope, or fully qualify all the names. Class xml_document represents a root of the DOM hierarchy. By means of public inheritance, it is also an xml_node and a memory_pool. Template parameter of xml_document::parse() function is used to specify parsing flags, with which you can fine-tune behaviour of the parser. Note that flags must be a compile-time constant.

2.2 Accessing The DOM Tree

To access the DOM tree, use methods of xml_node and xml_attribute classes:
cout << "Name of my first node is: " << doc.first_node()->name() << "\n";
+xml_node<> *node = doc.first_node("foobar");
+cout << "Node foobar has value " << node->value() << "\n";
+for (xml_attribute<> *attr = node->first_attribute();
+     attr; attr = attr->next_attribute())
+{
+    cout << "Node foobar has attribute " << attr->name() << " ";
+    cout << "with value " << attr->value() << "\n";
+}
+

2.3 Modifying The DOM Tree

DOM tree produced by the parser is fully modifiable. Nodes and attributes can be added/removed, and their contents changed. The below example creates a HTML document, whose sole contents is a link to google.com website:
xml_document<> doc;
+xml_node<> *node = doc.allocate_node(node_element, "a", "Google");
+doc.append_node(node);
+xml_attribute<> *attr = doc.allocate_attribute("href", "google.com");
+node->append_attribute(attr);
+
One quirk is that nodes and attributes do not own the text of their names and values. This is because normally they only store pointers to the source text. So, when assigning a new name or value to the node, care must be taken to ensure proper lifetime of the string. The easiest way to achieve it is to allocate the string from the xml_document memory pool. In the above example this is not necessary, because we are only assigning character constants. But the code below uses memory_pool::allocate_string() function to allocate node name (which will have the same lifetime as the document), and assigns it to a new node:
xml_document<> doc;
+char *node_name = doc.allocate_string(name);        // Allocate string and copy name into it
+xml_node<> *node = doc.allocate_node(node_element, node_name);  // Set node name to node_name
+
Check Reference section for description of the entire interface.

2.4 Printing XML

You can print xml_document and xml_node objects into an XML string. Use print() function or operator <<, which are defined in rapidxml_print.hpp header.
using namespace rapidxml;
+xml_document<> doc;    // character type defaults to char
+// ... some code to fill the document
+
+// Print to stream using operator <<
+std::cout << doc;   
+
+// Print to stream using print function, specifying printing flags
+print(std::cout, doc, 0);   // 0 means default printing flags
+
+// Print to string using output iterator
+std::string s;
+print(std::back_inserter(s), doc, 0);
+
+// Print to memory buffer using output iterator
+char buffer[4096];                      // You are responsible for making the buffer large enough!
+char *end = print(buffer, doc, 0);      // end contains pointer to character after last printed character
+*end = 0;                               // Add string terminator after XML
+

3. Differences From Regular XML Parsers

RapidXml is an in-situ parser, which allows it to achieve very high parsing speed. In-situ means that parser does not make copies of strings. Instead, it places pointers to the source text in the DOM hierarchy.

3.1 Lifetime Of Source Text

In-situ parsing requires that source text lives at least as long as the document object. If source text is destroyed, names and values of nodes in DOM tree will become destroyed as well. Additionally, whitespace processing, character entity translation, and zero-termination of strings require that source text be modified during parsing (but see non-destructive mode). This makes the text useless for further processing once it was parsed by RapidXml.

+ In many cases however, these are not serious issues.

3.2 Ownership Of Strings

Nodes and attributes produced by RapidXml do not own their name and value strings. They merely hold the pointers to them. This means you have to be careful when setting these values manually, by using xml_base::name(const Ch *) or xml_base::value(const Ch *) functions. Care must be taken to ensure that lifetime of the string passed is at least as long as lifetime of the node/attribute. The easiest way to achieve it is to allocate the string from memory_pool owned by the document. Use memory_pool::allocate_string() function for this purpose.

3.3 Destructive Vs Non-Destructive Mode

By default, the parser modifies source text during the parsing process. This is required to achieve character entity translation, whitespace normalization, and zero-termination of strings.

+ In some cases this behaviour may be undesirable, for example if source text resides in read only memory, or is mapped to memory directly from file. By using appropriate parser flags (parse_non_destructive), source text modifications can be disabled. However, because RapidXml does in-situ parsing, it obviously has the following side-effects:

4. Performance

RapidXml achieves its speed through use of several techniques:
  • In-situ parsing. When building DOM tree, RapidXml does not make copies of string data, such as node names and values. Instead, it stores pointers to interior of the source text.
  • Use of template metaprogramming techniques. This allows it to move much of the work to compile time. Through magic of the templates, C++ compiler generates a separate copy of parsing code for any combination of parser flags you use. In each copy, all possible decisions are made at compile time and all unused code is omitted.
  • Extensive use of lookup tables for parsing.
  • Hand-tuned C++ with profiling done on several most popular CPUs.
This results in a very small and fast code: a parser which is custom tailored to exact needs with each invocation.

4.1 Comparison With Other Parsers

The table below compares speed of RapidXml to some other parsers, and to strlen() function executed on the same data. On a modern CPU (as of 2007), you can expect parsing throughput to be close to 1 GB/s. As a rule of thumb, parsing speed is about 50-100x faster than Xerces DOM, 30-60x faster than TinyXml, 3-12x faster than pugxml, and about 5% - 30% faster than pugixml, the fastest XML parser I know of.
  • The test file is a real-world, 50kB large, moderately dense XML file.
  • All timing is done by using RDTSC instruction present in Pentium-compatible CPUs.
  • No profile-guided optimizations are used.
  • All parsers are running in their fastest modes.
  • The results are given in CPU cycles per character, so frequency of CPUs is irrelevant.
  • The results are minimum values from a large number of runs, to minimize effects of operating system activity, task switching, interrupt handling etc.
  • A single parse of the test file takes about 1/10th of a millisecond, so with large number of runs there is a good chance of hitting at least one no-interrupt streak, and obtaining undisturbed results.
Platform
Compiler
strlen() RapidXml pugixml 0.3 pugxml TinyXml
Pentium 4
MSVC 8.0
2.5
5.4
7.0
61.7
298.8
Pentium 4
gcc 4.1.1
0.8
6.1
9.5
67.0
413.2
Core 2
MSVC 8.0
1.0
4.5
5.0
24.6
154.8
Core 2
gcc 4.1.1
0.6
4.6
5.4
28.3
229.3
Athlon XP
MSVC 8.0
3.1
7.7
8.0
25.5
182.6
Athlon XP
gcc 4.1.1
0.9
8.2
9.2
33.7
265.2
Pentium 3
MSVC 8.0
2.0
6.3
7.0
30.9
211.9
Pentium 3
gcc 4.1.1
1.0
6.7
8.9
35.3
316.0
(*) All results are in CPU cycles per character of source text

5. Reference

This section lists all classes, functions, constants etc. and describes them in detail.
class + template + rapidxml::memory_pool
+ constructor + memory_pool()
+ destructor + ~memory_pool()
function allocate_node(node_type type, const Ch *name=0, const Ch *value=0, std::size_t name_size=0, std::size_t value_size=0)
function allocate_attribute(const Ch *name=0, const Ch *value=0, std::size_t name_size=0, std::size_t value_size=0)
function allocate_string(const Ch *source=0, std::size_t size=0)
function clone_node(const xml_node< Ch > *source, xml_node< Ch > *result=0)
function clear()
function set_allocator(alloc_func *af, free_func *ff)

class rapidxml::parse_error
+ constructor + parse_error(const char *what, void *where)
function what() const
function where() const

class + template + rapidxml::xml_attribute
+ constructor + xml_attribute()
function document() const
function previous_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
function next_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const

class + template + rapidxml::xml_base
+ constructor + xml_base()
function name() const
function name_size() const
function value() const
function value_size() const
function name(const Ch *name, std::size_t size)
function name(const Ch *name)
function value(const Ch *value, std::size_t size)
function value(const Ch *value)
function parent() const

class + template + rapidxml::xml_document
+ constructor + xml_document()
function parse(Ch *text)
function clear()

class + template + rapidxml::xml_node
+ constructor + xml_node(node_type type)
function type() const
function document() const
function first_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
function last_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
function previous_sibling(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
function next_sibling(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
function first_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
function last_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
function type(node_type type)
function prepend_node(xml_node< Ch > *child)
function append_node(xml_node< Ch > *child)
function insert_node(xml_node< Ch > *where, xml_node< Ch > *child)
function remove_first_node()
function remove_last_node()
function remove_node(xml_node< Ch > *where)
function remove_all_nodes()
function prepend_attribute(xml_attribute< Ch > *attribute)
function append_attribute(xml_attribute< Ch > *attribute)
function insert_attribute(xml_attribute< Ch > *where, xml_attribute< Ch > *attribute)
function remove_first_attribute()
function remove_last_attribute()
function remove_attribute(xml_attribute< Ch > *where)
function remove_all_attributes()

namespace rapidxml
enum node_type
function parse_error_handler(const char *what, void *where)
function print(OutIt out, const xml_node< Ch > &node, int flags=0)
function print(std::basic_ostream< Ch > &out, const xml_node< Ch > &node, int flags=0)
function operator<<(std::basic_ostream< Ch > &out, const xml_node< Ch > &node)
+ constant + parse_no_data_nodes
+ constant + parse_no_element_values
+ constant + parse_no_string_terminators
+ constant + parse_no_entity_translation
+ constant + parse_no_utf8
+ constant + parse_declaration_node
+ constant + parse_comment_nodes
+ constant + parse_doctype_node
+ constant + parse_pi_nodes
+ constant + parse_validate_closing_tags
+ constant + parse_trim_whitespace
+ constant + parse_normalize_whitespace
+ constant + parse_default
+ constant + parse_non_destructive
+ constant + parse_fastest
+ constant + parse_full
+ constant + print_no_indenting


class + template + rapidxml::memory_pool

+ + Defined in rapidxml.hpp
+ Base class for + xml_document

Description

This class is used by the parser to create new nodes and attributes, without overheads of dynamic memory allocation. In most cases, you will not need to use this class directly. However, if you need to create nodes manually or modify names/values of nodes, you are encouraged to use memory_pool of relevant xml_document to allocate the memory. Not only is this faster than allocating them by using new operator, but also their lifetime will be tied to the lifetime of document, possibly simplyfing memory management.

+ Call allocate_node() or allocate_attribute() functions to obtain new nodes or attributes from the pool. You can also call allocate_string() function to allocate strings. Such strings can then be used as names or values of nodes without worrying about their lifetime. Note that there is no free() function -- all allocations are freed at once when clear() function is called, or when the pool is destroyed.

+ It is also possible to create a standalone memory_pool, and use it to allocate nodes, whose lifetime will not be tied to any document.

+ Pool maintains RAPIDXML_STATIC_POOL_SIZE bytes of statically allocated memory. Until static memory is exhausted, no dynamic memory allocations are done. When static memory is exhausted, pool allocates additional blocks of memory of size RAPIDXML_DYNAMIC_POOL_SIZE each, by using global new[] and delete[] operators. This behaviour can be changed by setting custom allocation routines. Use set_allocator() function to set them.

+ Allocations for nodes, attributes and strings are aligned at RAPIDXML_ALIGNMENT bytes. This value defaults to the size of pointer on target architecture.

+ To obtain absolutely top performance from the parser, it is important that all nodes are allocated from a single, contiguous block of memory. Otherwise, cache misses when jumping between two (or more) disjoint blocks of memory can slow down parsing quite considerably. If required, you can tweak RAPIDXML_STATIC_POOL_SIZE, RAPIDXML_DYNAMIC_POOL_SIZE and RAPIDXML_ALIGNMENT to obtain best wasted memory to performance compromise. To do it, define their values before rapidxml.hpp file is included.

Parameters

Ch
Character type of created nodes.

+ constructor + memory_pool::memory_pool

Synopsis

memory_pool(); +

Description

Constructs empty pool with default allocator functions.

+ destructor + memory_pool::~memory_pool

Synopsis

~memory_pool(); +

Description

Destroys pool and frees all the memory. This causes memory occupied by nodes allocated by the pool to be freed. Nodes allocated from the pool are no longer valid.

function memory_pool::allocate_node

Synopsis

xml_node<Ch>* allocate_node(node_type type, const Ch *name=0, const Ch *value=0, std::size_t name_size=0, std::size_t value_size=0); +

Description

Allocates a new node from the pool, and optionally assigns name and value to it. If the allocation request cannot be accomodated, this function will throw std::bad_alloc. If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function will call rapidxml::parse_error_handler() function.

Parameters

type
Type of node to create.
name
Name to assign to the node, or 0 to assign no name.
value
Value to assign to the node, or 0 to assign no value.
name_size
Size of name to assign, or 0 to automatically calculate size from name string.
value_size
Size of value to assign, or 0 to automatically calculate size from value string.

Returns

Pointer to allocated node. This pointer will never be NULL.

function memory_pool::allocate_attribute

Synopsis

xml_attribute<Ch>* allocate_attribute(const Ch *name=0, const Ch *value=0, std::size_t name_size=0, std::size_t value_size=0); +

Description

Allocates a new attribute from the pool, and optionally assigns name and value to it. If the allocation request cannot be accomodated, this function will throw std::bad_alloc. If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function will call rapidxml::parse_error_handler() function.

Parameters

name
Name to assign to the attribute, or 0 to assign no name.
value
Value to assign to the attribute, or 0 to assign no value.
name_size
Size of name to assign, or 0 to automatically calculate size from name string.
value_size
Size of value to assign, or 0 to automatically calculate size from value string.

Returns

Pointer to allocated attribute. This pointer will never be NULL.

function memory_pool::allocate_string

Synopsis

Ch* allocate_string(const Ch *source=0, std::size_t size=0); +

Description

Allocates a char array of given size from the pool, and optionally copies a given string to it. If the allocation request cannot be accomodated, this function will throw std::bad_alloc. If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function will call rapidxml::parse_error_handler() function.

Parameters

source
String to initialize the allocated memory with, or 0 to not initialize it.
size
Number of characters to allocate, or zero to calculate it automatically from source string length; if size is 0, source string must be specified and null terminated.

Returns

Pointer to allocated char array. This pointer will never be NULL.

function memory_pool::clone_node

Synopsis

xml_node<Ch>* clone_node(const xml_node< Ch > *source, xml_node< Ch > *result=0); +

Description

Clones an xml_node and its hierarchy of child nodes and attributes. Nodes and attributes are allocated from this memory pool. Names and values are not cloned, they are shared between the clone and the source. Result node can be optionally specified as a second parameter, in which case its contents will be replaced with cloned source node. This is useful when you want to clone entire document.

Parameters

source
Node to clone.
result
Node to put results in, or 0 to automatically allocate result node

Returns

Pointer to cloned node. This pointer will never be NULL.

function memory_pool::clear

Synopsis

void clear(); +

Description

Clears the pool. This causes memory occupied by nodes allocated by the pool to be freed. Any nodes or strings allocated from the pool will no longer be valid.

function memory_pool::set_allocator

Synopsis

void set_allocator(alloc_func *af, free_func *ff); +

Description

Sets or resets the user-defined memory allocation functions for the pool. This can only be called when no memory is allocated from the pool yet, otherwise results are undefined. Allocation function must not return invalid pointer on failure. It should either throw, stop the program, or use longjmp() function to pass control to other place of program. If it returns invalid pointer, results are undefined.

+ User defined allocation functions must have the following forms:

+void *allocate(std::size_t size);
+void free(void *pointer);

Parameters

af
Allocation function, or 0 to restore default function
ff
Free function, or 0 to restore default function

class rapidxml::parse_error

+ + Defined in rapidxml.hpp

Description

Parse error exception. This exception is thrown by the parser when an error occurs. Use what() function to get human-readable error message. Use where() function to get a pointer to position within source text where error was detected.

+ If throwing exceptions by the parser is undesirable, it can be disabled by defining RAPIDXML_NO_EXCEPTIONS macro before rapidxml.hpp is included. This will cause the parser to call rapidxml::parse_error_handler() function instead of throwing an exception. This function must be defined by the user.

+ This class derives from std::exception class.

+ constructor + parse_error::parse_error

Synopsis

parse_error(const char *what, void *where); +

Description

Constructs parse error.

function parse_error::what

Synopsis

virtual const char* what() const; +

Description

Gets human readable description of error.

Returns

Pointer to null terminated description of the error.

function parse_error::where

Synopsis

Ch* where() const; +

Description

Gets pointer to character data where error happened. Ch should be the same as char type of xml_document that produced the error.

Returns

Pointer to location within the parsed string where error occured.

class + template + rapidxml::xml_attribute

+ + Defined in rapidxml.hpp
+ Inherits from + xml_base

Description

Class representing attribute node of XML document. Each attribute has name and value strings, which are available through name() and value() functions (inherited from xml_base). Note that after parse, both name and value of attribute will point to interior of source text used for parsing. Thus, this text must persist in memory for the lifetime of attribute.

Parameters

Ch
Character type to use.

+ constructor + xml_attribute::xml_attribute

Synopsis

xml_attribute(); +

Description

Constructs an empty attribute with the specified type. Consider using memory_pool of appropriate xml_document if allocating attributes manually.

function xml_attribute::document

Synopsis

xml_document<Ch>* document() const; +

Description

Gets document of which attribute is a child.

Returns

Pointer to document that contains this attribute, or 0 if there is no parent document.

function xml_attribute::previous_attribute

Synopsis

xml_attribute<Ch>* previous_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; +

Description

Gets previous attribute, optionally matching attribute name.

Parameters

name
Name of attribute to find, or 0 to return previous attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
name_size
Size of name, in characters, or 0 to have size calculated automatically from string
case_sensitive
Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters

Returns

Pointer to found attribute, or 0 if not found.

function xml_attribute::next_attribute

Synopsis

xml_attribute<Ch>* next_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; +

Description

Gets next attribute, optionally matching attribute name.

Parameters

name
Name of attribute to find, or 0 to return next attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
name_size
Size of name, in characters, or 0 to have size calculated automatically from string
case_sensitive
Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters

Returns

Pointer to found attribute, or 0 if not found.

class + template + rapidxml::xml_base

+ + Defined in rapidxml.hpp
+ Base class for + xml_attribute xml_node

Description

Base class for xml_node and xml_attribute implementing common functions: name(), name_size(), value(), value_size() and parent().

Parameters

Ch
Character type to use

+ constructor + xml_base::xml_base

Synopsis

xml_base(); +

function xml_base::name

Synopsis

Ch* name() const; +

Description

Gets name of the node. Interpretation of name depends on type of node. Note that name will not be zero-terminated if rapidxml::parse_no_string_terminators option was selected during parse.

+ Use name_size() function to determine length of the name.

Returns

Name of node, or empty string if node has no name.

function xml_base::name_size

Synopsis

std::size_t name_size() const; +

Description

Gets size of node name, not including terminator character. This function works correctly irrespective of whether name is or is not zero terminated.

Returns

Size of node name, in characters.

function xml_base::value

Synopsis

Ch* value() const; +

Description

Gets value of node. Interpretation of value depends on type of node. Note that value will not be zero-terminated if rapidxml::parse_no_string_terminators option was selected during parse.

+ Use value_size() function to determine length of the value.

Returns

Value of node, or empty string if node has no value.

function xml_base::value_size

Synopsis

std::size_t value_size() const; +

Description

Gets size of node value, not including terminator character. This function works correctly irrespective of whether value is or is not zero terminated.

Returns

Size of node value, in characters.

function xml_base::name

Synopsis

void name(const Ch *name, std::size_t size); +

Description

Sets name of node to a non zero-terminated string. See Ownership Of Strings .

+ Note that node does not own its name or value, it only stores a pointer to it. It will not delete or otherwise free the pointer on destruction. It is reponsibility of the user to properly manage lifetime of the string. The easiest way to achieve it is to use memory_pool of the document to allocate the string - on destruction of the document the string will be automatically freed.

+ Size of name must be specified separately, because name does not have to be zero terminated. Use name(const Ch *) function to have the length automatically calculated (string must be zero terminated).

Parameters

name
Name of node to set. Does not have to be zero terminated.
size
Size of name, in characters. This does not include zero terminator, if one is present.

function xml_base::name

Synopsis

void name(const Ch *name); +

Description

Sets name of node to a zero-terminated string. See also Ownership Of Strings and xml_node::name(const Ch *, std::size_t).

Parameters

name
Name of node to set. Must be zero terminated.

function xml_base::value

Synopsis

void value(const Ch *value, std::size_t size); +

Description

Sets value of node to a non zero-terminated string. See Ownership Of Strings .

+ Note that node does not own its name or value, it only stores a pointer to it. It will not delete or otherwise free the pointer on destruction. It is reponsibility of the user to properly manage lifetime of the string. The easiest way to achieve it is to use memory_pool of the document to allocate the string - on destruction of the document the string will be automatically freed.

+ Size of value must be specified separately, because it does not have to be zero terminated. Use value(const Ch *) function to have the length automatically calculated (string must be zero terminated).

+ If an element has a child node of type node_data, it will take precedence over element value when printing. If you want to manipulate data of elements using values, use parser flag rapidxml::parse_no_data_nodes to prevent creation of data nodes by the parser.

Parameters

value
value of node to set. Does not have to be zero terminated.
size
Size of value, in characters. This does not include zero terminator, if one is present.

function xml_base::value

Synopsis

void value(const Ch *value); +

Description

Sets value of node to a zero-terminated string. See also Ownership Of Strings and xml_node::value(const Ch *, std::size_t).

Parameters

value
Vame of node to set. Must be zero terminated.

function xml_base::parent

Synopsis

xml_node<Ch>* parent() const; +

Description

Gets node parent.

Returns

Pointer to parent node, or 0 if there is no parent.

class + template + rapidxml::xml_document

+ + Defined in rapidxml.hpp
+ Inherits from + xml_node memory_pool

Description

This class represents root of the DOM hierarchy. It is also an xml_node and a memory_pool through public inheritance. Use parse() function to build a DOM tree from a zero-terminated XML text string. parse() function allocates memory for nodes and attributes by using functions of xml_document, which are inherited from memory_pool. To access root node of the document, use the document itself, as if it was an xml_node.

Parameters

Ch
Character type to use.

+ constructor + xml_document::xml_document

Synopsis

xml_document(); +

Description

Constructs empty XML document.

function xml_document::parse

Synopsis

void parse(Ch *text); +

Description

Parses zero-terminated XML string according to given flags. Passed string will be modified by the parser, unless rapidxml::parse_non_destructive flag is used. The string must persist for the lifetime of the document. In case of error, rapidxml::parse_error exception will be thrown.

+ If you want to parse contents of a file, you must first load the file into the memory, and pass pointer to its beginning. Make sure that data is zero-terminated.

+ Document can be parsed into multiple times. Each new call to parse removes previous nodes and attributes (if any), but does not clear memory pool.

Parameters

text
XML data to parse; pointer is non-const to denote fact that this data may be modified by the parser.

function xml_document::clear

Synopsis

void clear(); +

Description

Clears the document by deleting all nodes and clearing the memory pool. All nodes owned by document pool are destroyed.

class + template + rapidxml::xml_node

+ + Defined in rapidxml.hpp
+ Inherits from + xml_base
+ Base class for + xml_document

Description

Class representing a node of XML document. Each node may have associated name and value strings, which are available through name() and value() functions. Interpretation of name and value depends on type of the node. Type of node can be determined by using type() function.

+ Note that after parse, both name and value of node, if any, will point interior of source text used for parsing. Thus, this text must persist in the memory for the lifetime of node.

Parameters

Ch
Character type to use.

+ constructor + xml_node::xml_node

Synopsis

xml_node(node_type type); +

Description

Constructs an empty node with the specified type. Consider using memory_pool of appropriate document to allocate nodes manually.

Parameters

type
Type of node to construct.

function xml_node::type

Synopsis

node_type type() const; +

Description

Gets type of node.

Returns

Type of node.

function xml_node::document

Synopsis

xml_document<Ch>* document() const; +

Description

Gets document of which node is a child.

Returns

Pointer to document that contains this node, or 0 if there is no parent document.

function xml_node::first_node

Synopsis

xml_node<Ch>* first_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; +

Description

Gets first child node, optionally matching node name.

Parameters

name
Name of child to find, or 0 to return first child regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
name_size
Size of name, in characters, or 0 to have size calculated automatically from string
case_sensitive
Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters

Returns

Pointer to found child, or 0 if not found.

function xml_node::last_node

Synopsis

xml_node<Ch>* last_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; +

Description

Gets last child node, optionally matching node name. Behaviour is undefined if node has no children. Use first_node() to test if node has children.

Parameters

name
Name of child to find, or 0 to return last child regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
name_size
Size of name, in characters, or 0 to have size calculated automatically from string
case_sensitive
Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters

Returns

Pointer to found child, or 0 if not found.

function xml_node::previous_sibling

Synopsis

xml_node<Ch>* previous_sibling(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; +

Description

Gets previous sibling node, optionally matching node name. Behaviour is undefined if node has no parent. Use parent() to test if node has a parent.

Parameters

name
Name of sibling to find, or 0 to return previous sibling regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
name_size
Size of name, in characters, or 0 to have size calculated automatically from string
case_sensitive
Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters

Returns

Pointer to found sibling, or 0 if not found.

function xml_node::next_sibling

Synopsis

xml_node<Ch>* next_sibling(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; +

Description

Gets next sibling node, optionally matching node name. Behaviour is undefined if node has no parent. Use parent() to test if node has a parent.

Parameters

name
Name of sibling to find, or 0 to return next sibling regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
name_size
Size of name, in characters, or 0 to have size calculated automatically from string
case_sensitive
Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters

Returns

Pointer to found sibling, or 0 if not found.

function xml_node::first_attribute

Synopsis

xml_attribute<Ch>* first_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; +

Description

Gets first attribute of node, optionally matching attribute name.

Parameters

name
Name of attribute to find, or 0 to return first attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
name_size
Size of name, in characters, or 0 to have size calculated automatically from string
case_sensitive
Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters

Returns

Pointer to found attribute, or 0 if not found.

function xml_node::last_attribute

Synopsis

xml_attribute<Ch>* last_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; +

Description

Gets last attribute of node, optionally matching attribute name.

Parameters

name
Name of attribute to find, or 0 to return last attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero
name_size
Size of name, in characters, or 0 to have size calculated automatically from string
case_sensitive
Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters

Returns

Pointer to found attribute, or 0 if not found.

function xml_node::type

Synopsis

void type(node_type type); +

Description

Sets type of node.

Parameters

type
Type of node to set.

function xml_node::prepend_node

Synopsis

void prepend_node(xml_node< Ch > *child); +

Description

Prepends a new child node. The prepended child becomes the first child, and all existing children are moved one position back.

Parameters

child
Node to prepend.

function xml_node::append_node

Synopsis

void append_node(xml_node< Ch > *child); +

Description

Appends a new child node. The appended child becomes the last child.

Parameters

child
Node to append.

function xml_node::insert_node

Synopsis

void insert_node(xml_node< Ch > *where, xml_node< Ch > *child); +

Description

Inserts a new child node at specified place inside the node. All children after and including the specified node are moved one position back.

Parameters

where
Place where to insert the child, or 0 to insert at the back.
child
Node to insert.

function xml_node::remove_first_node

Synopsis

void remove_first_node(); +

Description

Removes first child node. If node has no children, behaviour is undefined. Use first_node() to test if node has children.

function xml_node::remove_last_node

Synopsis

void remove_last_node(); +

Description

Removes last child of the node. If node has no children, behaviour is undefined. Use first_node() to test if node has children.

function xml_node::remove_node

Synopsis

void remove_node(xml_node< Ch > *where); +

Description

Removes specified child from the node.

function xml_node::remove_all_nodes

Synopsis

void remove_all_nodes(); +

Description

Removes all child nodes (but not attributes).

function xml_node::prepend_attribute

Synopsis

void prepend_attribute(xml_attribute< Ch > *attribute); +

Description

Prepends a new attribute to the node.

Parameters

attribute
Attribute to prepend.

function xml_node::append_attribute

Synopsis

void append_attribute(xml_attribute< Ch > *attribute); +

Description

Appends a new attribute to the node.

Parameters

attribute
Attribute to append.

function xml_node::insert_attribute

Synopsis

void insert_attribute(xml_attribute< Ch > *where, xml_attribute< Ch > *attribute); +

Description

Inserts a new attribute at specified place inside the node. All attributes after and including the specified attribute are moved one position back.

Parameters

where
Place where to insert the attribute, or 0 to insert at the back.
attribute
Attribute to insert.

function xml_node::remove_first_attribute

Synopsis

void remove_first_attribute(); +

Description

Removes first attribute of the node. If node has no attributes, behaviour is undefined. Use first_attribute() to test if node has attributes.

function xml_node::remove_last_attribute

Synopsis

void remove_last_attribute(); +

Description

Removes last attribute of the node. If node has no attributes, behaviour is undefined. Use first_attribute() to test if node has attributes.

function xml_node::remove_attribute

Synopsis

void remove_attribute(xml_attribute< Ch > *where); +

Description

Removes specified attribute from node.

Parameters

where
Pointer to attribute to be removed.

function xml_node::remove_all_attributes

Synopsis

void remove_all_attributes(); +

Description

Removes all attributes of node.

enum node_type

Description

Enumeration listing all node types produced by the parser. Use xml_node::type() function to query node type.

Values

node_document
A document node. Name and value are empty.
node_element
An element node. Name contains element name. Value contains text of first data node.
node_data
A data node. Name is empty. Value contains data text.
node_cdata
A CDATA node. Name is empty. Value contains data text.
node_comment
A comment node. Name is empty. Value contains comment text.
node_declaration
A declaration node. Name and value are empty. Declaration parameters (version, encoding and standalone) are in node attributes.
node_doctype
A DOCTYPE node. Name is empty. Value contains DOCTYPE text.
node_pi
A PI node. Name contains target. Value contains instructions.

function parse_error_handler

Synopsis

void rapidxml::parse_error_handler(const char *what, void *where); +

Description

When exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function is called to notify user about the error. It must be defined by the user.

+ This function cannot return. If it does, the results are undefined.

+ A very simple definition might look like that: + void rapidxml::parse_error_handler(const char *what, void *where) + { + std::cout << "Parse error: " << what << "\n"; + std::abort(); + } +

Parameters

what
Human readable description of the error.
where
Pointer to character data where error was detected.

function print

Synopsis

OutIt rapidxml::print(OutIt out, const xml_node< Ch > &node, int flags=0); +

Description

Prints XML to given output iterator.

Parameters

out
Output iterator to print to.
node
Node to be printed. Pass xml_document to print entire document.
flags
Flags controlling how XML is printed.

Returns

Output iterator pointing to position immediately after last character of printed text.

function print

Synopsis

std::basic_ostream<Ch>& rapidxml::print(std::basic_ostream< Ch > &out, const xml_node< Ch > &node, int flags=0); +

Description

Prints XML to given output stream.

Parameters

out
Output stream to print to.
node
Node to be printed. Pass xml_document to print entire document.
flags
Flags controlling how XML is printed.

Returns

Output stream.

function operator<<

Synopsis

std::basic_ostream<Ch>& rapidxml::operator<<(std::basic_ostream< Ch > &out, const xml_node< Ch > &node); +

Description

Prints formatted XML to given output stream. Uses default printing flags. Use print() function to customize printing process.

Parameters

out
Output stream to print to.
node
Node to be printed.

Returns

Output stream.

+ constant + parse_no_data_nodes

Synopsis

const int parse_no_data_nodes + = 0x1; +

Description

Parse flag instructing the parser to not create data nodes. Text of first data node will still be placed in value of parent element, unless rapidxml::parse_no_element_values flag is also specified. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_no_element_values

Synopsis

const int parse_no_element_values + = 0x2; +

Description

Parse flag instructing the parser to not use text of first data node as a value of parent element. Can be combined with other flags by use of | operator. Note that child data nodes of element node take precendence over its value when printing. That is, if element has one or more child data nodes and a value, the value will be ignored. Use rapidxml::parse_no_data_nodes flag to prevent creation of data nodes if you want to manipulate data using values of elements.

+ See xml_document::parse() function.

+ constant + parse_no_string_terminators

Synopsis

const int parse_no_string_terminators + = 0x4; +

Description

Parse flag instructing the parser to not place zero terminators after strings in the source text. By default zero terminators are placed, modifying source text. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_no_entity_translation

Synopsis

const int parse_no_entity_translation + = 0x8; +

Description

Parse flag instructing the parser to not translate entities in the source text. By default entities are translated, modifying source text. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_no_utf8

Synopsis

const int parse_no_utf8 + = 0x10; +

Description

Parse flag instructing the parser to disable UTF-8 handling and assume plain 8 bit characters. By default, UTF-8 handling is enabled. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_declaration_node

Synopsis

const int parse_declaration_node + = 0x20; +

Description

Parse flag instructing the parser to create XML declaration node. By default, declaration node is not created. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_comment_nodes

Synopsis

const int parse_comment_nodes + = 0x40; +

Description

Parse flag instructing the parser to create comments nodes. By default, comment nodes are not created. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_doctype_node

Synopsis

const int parse_doctype_node + = 0x80; +

Description

Parse flag instructing the parser to create DOCTYPE node. By default, doctype node is not created. Although W3C specification allows at most one DOCTYPE node, RapidXml will silently accept documents with more than one. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_pi_nodes

Synopsis

const int parse_pi_nodes + = 0x100; +

Description

Parse flag instructing the parser to create PI nodes. By default, PI nodes are not created. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_validate_closing_tags

Synopsis

const int parse_validate_closing_tags + = 0x200; +

Description

Parse flag instructing the parser to validate closing tag names. If not set, name inside closing tag is irrelevant to the parser. By default, closing tags are not validated. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_trim_whitespace

Synopsis

const int parse_trim_whitespace + = 0x400; +

Description

Parse flag instructing the parser to trim all leading and trailing whitespace of data nodes. By default, whitespace is not trimmed. This flag does not cause the parser to modify source text. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_normalize_whitespace

Synopsis

const int parse_normalize_whitespace + = 0x800; +

Description

Parse flag instructing the parser to condense all whitespace runs of data nodes to a single space character. Trimming of leading and trailing whitespace of data is controlled by rapidxml::parse_trim_whitespace flag. By default, whitespace is not normalized. If this flag is specified, source text will be modified. Can be combined with other flags by use of | operator.

+ See xml_document::parse() function.

+ constant + parse_default

Synopsis

const int parse_default + = 0; +

Description

Parse flags which represent default behaviour of the parser. This is always equal to 0, so that all other flags can be simply ored together. Normally there is no need to inconveniently disable flags by anding with their negated (~) values. This also means that meaning of each flag is a negation of the default setting. For example, if flag name is rapidxml::parse_no_utf8, it means that utf-8 is enabled by default, and using the flag will disable it.

+ See xml_document::parse() function.

+ constant + parse_non_destructive

Synopsis

const int parse_non_destructive + = parse_no_string_terminators | parse_no_entity_translation; +

Description

A combination of parse flags that forbids any modifications of the source text. This also results in faster parsing. However, note that the following will occur:
  • names and values of nodes will not be zero terminated, you have to use xml_base::name_size() and xml_base::value_size() functions to determine where name and value ends
  • entities will not be translated
  • whitespace will not be normalized
+See xml_document::parse() function.

+ constant + parse_fastest

Synopsis

const int parse_fastest + = parse_non_destructive | parse_no_data_nodes; +

Description

A combination of parse flags resulting in fastest possible parsing, without sacrificing important data.

+ See xml_document::parse() function.

+ constant + parse_full

Synopsis

const int parse_full + = parse_declaration_node | parse_comment_nodes | parse_doctype_node | parse_pi_nodes | parse_validate_closing_tags; +

Description

A combination of parse flags resulting in largest amount of data being extracted. This usually results in slowest parsing.

+ See xml_document::parse() function.

+ constant + print_no_indenting

Synopsis

const int print_no_indenting + = 0x1; +

Description

Printer flag instructing the printer to suppress indenting of XML. See print() function.

\ No newline at end of file diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/lib/rapidxml/rapidxml.hpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/rapidxml/rapidxml.hpp --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/lib/rapidxml/rapidxml.hpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/rapidxml/rapidxml.hpp 2013-10-31 06:59:44.000000000 +0000 @@ -0,0 +1,2596 @@ +#ifndef RAPIDXML_HPP_INCLUDED +#define RAPIDXML_HPP_INCLUDED + +// Copyright (C) 2006, 2009 Marcin Kalicinski +// Version 1.13 +// Revision $DateTime: 2009/05/13 01:46:17 $ +//! \file rapidxml.hpp This file contains rapidxml parser and DOM implementation + +// If standard library is disabled, user must provide implementations of required functions and typedefs +//#if !defined(RAPIDXML_NO_STDLIB) + #include // For std::size_t + #include // For assert + #include // For placement new +//#endif + +// On MSVC, disable "conditional expression is constant" warning (level 4). +// This warning is almost impossible to avoid with certain types of templated code +#ifdef _MSC_VER + #pragma warning(push) + #pragma warning(disable:4127) // Conditional expression is constant +#endif + +/////////////////////////////////////////////////////////////////////////// +// RAPIDXML_PARSE_ERROR + +#if defined(RAPIDXML_NO_EXCEPTIONS) + +#define RAPIDXML_PARSE_ERROR(what, where) { parse_error_handler(what, where); assert(0); } + +namespace rapidxml +{ + //! When exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, + //! this function is called to notify user about the error. + //! It must be defined by the user. + //!

+ //! This function cannot return. If it does, the results are undefined. + //!

+ //! A very simple definition might look like that: + //!

+    //! void %rapidxml::%parse_error_handler(const char *what, void *where)
+    //! {
+    //!     std::cout << "Parse error: " << what << "\n";
+    //!     std::abort();
+    //! }
+    //! 
+ //! \param what Human readable description of the error. + //! \param where Pointer to character data where error was detected. + void parse_error_handler(const char *what, void *where); +} + +#else + +#include // For std::exception + +#define RAPIDXML_PARSE_ERROR(what, where) throw parse_error(what, where) + +namespace rapidxml +{ + + //! Parse error exception. + //! This exception is thrown by the parser when an error occurs. + //! Use what() function to get human-readable error message. + //! Use where() function to get a pointer to position within source text where error was detected. + //!

+ //! If throwing exceptions by the parser is undesirable, + //! it can be disabled by defining RAPIDXML_NO_EXCEPTIONS macro before rapidxml.hpp is included. + //! This will cause the parser to call rapidxml::parse_error_handler() function instead of throwing an exception. + //! This function must be defined by the user. + //!

+ //! This class derives from std::exception class. + class parse_error: public std::exception + { + + public: + + //! Constructs parse error + parse_error(const char *what, void *where) + : m_what(what) + , m_where(where) + { + } + + //! Gets human readable description of error. + //! \return Pointer to null terminated description of the error. + virtual const char *what() const throw() + { + return m_what; + } + + //! Gets pointer to character data where error happened. + //! Ch should be the same as char type of xml_document that produced the error. + //! \return Pointer to location within the parsed string where error occured. + template + Ch *where() const + { + return reinterpret_cast(m_where); + } + + private: + + const char *m_what; + void *m_where; + + }; +} + +#endif + +/////////////////////////////////////////////////////////////////////////// +// Pool sizes + +#ifndef RAPIDXML_STATIC_POOL_SIZE + // Size of static memory block of memory_pool. + // Define RAPIDXML_STATIC_POOL_SIZE before including rapidxml.hpp if you want to override the default value. + // No dynamic memory allocations are performed by memory_pool until static memory is exhausted. + #define RAPIDXML_STATIC_POOL_SIZE (64 * 1024) +#endif + +#ifndef RAPIDXML_DYNAMIC_POOL_SIZE + // Size of dynamic memory block of memory_pool. + // Define RAPIDXML_DYNAMIC_POOL_SIZE before including rapidxml.hpp if you want to override the default value. + // After the static block is exhausted, dynamic blocks with approximately this size are allocated by memory_pool. + #define RAPIDXML_DYNAMIC_POOL_SIZE (64 * 1024) +#endif + +#ifndef RAPIDXML_ALIGNMENT + // Memory allocation alignment. + // Define RAPIDXML_ALIGNMENT before including rapidxml.hpp if you want to override the default value, which is the size of pointer. + // All memory allocations for nodes, attributes and strings will be aligned to this value. + // This must be a power of 2 and at least 1, otherwise memory_pool will not work. + #define RAPIDXML_ALIGNMENT sizeof(void *) +#endif + +namespace rapidxml +{ + // Forward declarations + template class xml_node; + template class xml_attribute; + template class xml_document; + + //! Enumeration listing all node types produced by the parser. + //! Use xml_node::type() function to query node type. + enum node_type + { + node_document, //!< A document node. Name and value are empty. + node_element, //!< An element node. Name contains element name. Value contains text of first data node. + node_data, //!< A data node. Name is empty. Value contains data text. + node_cdata, //!< A CDATA node. Name is empty. Value contains data text. + node_comment, //!< A comment node. Name is empty. Value contains comment text. + node_declaration, //!< A declaration node. Name and value are empty. Declaration parameters (version, encoding and standalone) are in node attributes. + node_doctype, //!< A DOCTYPE node. Name is empty. Value contains DOCTYPE text. + node_pi //!< A PI node. Name contains target. Value contains instructions. + }; + + /////////////////////////////////////////////////////////////////////// + // Parsing flags + + //! Parse flag instructing the parser to not create data nodes. + //! Text of first data node will still be placed in value of parent element, unless rapidxml::parse_no_element_values flag is also specified. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_no_data_nodes = 0x1; + + //! Parse flag instructing the parser to not use text of first data node as a value of parent element. + //! Can be combined with other flags by use of | operator. + //! Note that child data nodes of element node take precendence over its value when printing. + //! That is, if element has one or more child data nodes and a value, the value will be ignored. + //! Use rapidxml::parse_no_data_nodes flag to prevent creation of data nodes if you want to manipulate data using values of elements. + //!

+ //! See xml_document::parse() function. + const int parse_no_element_values = 0x2; + + //! Parse flag instructing the parser to not place zero terminators after strings in the source text. + //! By default zero terminators are placed, modifying source text. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_no_string_terminators = 0x4; + + //! Parse flag instructing the parser to not translate entities in the source text. + //! By default entities are translated, modifying source text. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_no_entity_translation = 0x8; + + //! Parse flag instructing the parser to disable UTF-8 handling and assume plain 8 bit characters. + //! By default, UTF-8 handling is enabled. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_no_utf8 = 0x10; + + //! Parse flag instructing the parser to create XML declaration node. + //! By default, declaration node is not created. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_declaration_node = 0x20; + + //! Parse flag instructing the parser to create comments nodes. + //! By default, comment nodes are not created. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_comment_nodes = 0x40; + + //! Parse flag instructing the parser to create DOCTYPE node. + //! By default, doctype node is not created. + //! Although W3C specification allows at most one DOCTYPE node, RapidXml will silently accept documents with more than one. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_doctype_node = 0x80; + + //! Parse flag instructing the parser to create PI nodes. + //! By default, PI nodes are not created. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_pi_nodes = 0x100; + + //! Parse flag instructing the parser to validate closing tag names. + //! If not set, name inside closing tag is irrelevant to the parser. + //! By default, closing tags are not validated. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_validate_closing_tags = 0x200; + + //! Parse flag instructing the parser to trim all leading and trailing whitespace of data nodes. + //! By default, whitespace is not trimmed. + //! This flag does not cause the parser to modify source text. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_trim_whitespace = 0x400; + + //! Parse flag instructing the parser to condense all whitespace runs of data nodes to a single space character. + //! Trimming of leading and trailing whitespace of data is controlled by rapidxml::parse_trim_whitespace flag. + //! By default, whitespace is not normalized. + //! If this flag is specified, source text will be modified. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_normalize_whitespace = 0x800; + + // Compound flags + + //! Parse flags which represent default behaviour of the parser. + //! This is always equal to 0, so that all other flags can be simply ored together. + //! Normally there is no need to inconveniently disable flags by anding with their negated (~) values. + //! This also means that meaning of each flag is a negation of the default setting. + //! For example, if flag name is rapidxml::parse_no_utf8, it means that utf-8 is enabled by default, + //! and using the flag will disable it. + //!

+ //! See xml_document::parse() function. + const int parse_default = 0; + + //! A combination of parse flags that forbids any modifications of the source text. + //! This also results in faster parsing. However, note that the following will occur: + //!
    + //!
  • names and values of nodes will not be zero terminated, you have to use xml_base::name_size() and xml_base::value_size() functions to determine where name and value ends
  • + //!
  • entities will not be translated
  • + //!
  • whitespace will not be normalized
  • + //!
+ //! See xml_document::parse() function. + const int parse_non_destructive = parse_no_string_terminators | parse_no_entity_translation; + + //! A combination of parse flags resulting in fastest possible parsing, without sacrificing important data. + //!

+ //! See xml_document::parse() function. + const int parse_fastest = parse_non_destructive | parse_no_data_nodes; + + //! A combination of parse flags resulting in largest amount of data being extracted. + //! This usually results in slowest parsing. + //!

+ //! See xml_document::parse() function. + const int parse_full = parse_declaration_node | parse_comment_nodes | parse_doctype_node | parse_pi_nodes | parse_validate_closing_tags; + + /////////////////////////////////////////////////////////////////////// + // Internals + + //! \cond internal + namespace internal + { + + // Struct that contains lookup tables for the parser + // It must be a template to allow correct linking (because it has static data members, which are defined in a header file). + template + struct lookup_tables + { + static const unsigned char lookup_whitespace[256]; // Whitespace table + static const unsigned char lookup_node_name[256]; // Node name table + static const unsigned char lookup_text[256]; // Text table + static const unsigned char lookup_text_pure_no_ws[256]; // Text table + static const unsigned char lookup_text_pure_with_ws[256]; // Text table + static const unsigned char lookup_attribute_name[256]; // Attribute name table + static const unsigned char lookup_attribute_data_1[256]; // Attribute data table with single quote + static const unsigned char lookup_attribute_data_1_pure[256]; // Attribute data table with single quote + static const unsigned char lookup_attribute_data_2[256]; // Attribute data table with double quotes + static const unsigned char lookup_attribute_data_2_pure[256]; // Attribute data table with double quotes + static const unsigned char lookup_digits[256]; // Digits + static const unsigned char lookup_upcase[256]; // To uppercase conversion table for ASCII characters + }; + + // Find length of the string + template + inline std::size_t measure(const Ch *p) + { + const Ch *tmp = p; + while (*tmp) + ++tmp; + return tmp - p; + } + + // Compare strings for equality + template + inline bool compare(const Ch *p1, std::size_t size1, const Ch *p2, std::size_t size2, bool case_sensitive) + { + if (size1 != size2) + return false; + if (case_sensitive) + { + for (const Ch *end = p1 + size1; p1 < end; ++p1, ++p2) + if (*p1 != *p2) + return false; + } + else + { + for (const Ch *end = p1 + size1; p1 < end; ++p1, ++p2) + if (lookup_tables<0>::lookup_upcase[static_cast(*p1)] != lookup_tables<0>::lookup_upcase[static_cast(*p2)]) + return false; + } + return true; + } + } + //! \endcond + + /////////////////////////////////////////////////////////////////////// + // Memory pool + + //! This class is used by the parser to create new nodes and attributes, without overheads of dynamic memory allocation. + //! In most cases, you will not need to use this class directly. + //! However, if you need to create nodes manually or modify names/values of nodes, + //! you are encouraged to use memory_pool of relevant xml_document to allocate the memory. + //! Not only is this faster than allocating them by using new operator, + //! but also their lifetime will be tied to the lifetime of document, + //! possibly simplyfing memory management. + //!

+ //! Call allocate_node() or allocate_attribute() functions to obtain new nodes or attributes from the pool. + //! You can also call allocate_string() function to allocate strings. + //! Such strings can then be used as names or values of nodes without worrying about their lifetime. + //! Note that there is no free() function -- all allocations are freed at once when clear() function is called, + //! or when the pool is destroyed. + //!

+ //! It is also possible to create a standalone memory_pool, and use it + //! to allocate nodes, whose lifetime will not be tied to any document. + //!

+ //! Pool maintains RAPIDXML_STATIC_POOL_SIZE bytes of statically allocated memory. + //! Until static memory is exhausted, no dynamic memory allocations are done. + //! When static memory is exhausted, pool allocates additional blocks of memory of size RAPIDXML_DYNAMIC_POOL_SIZE each, + //! by using global new[] and delete[] operators. + //! This behaviour can be changed by setting custom allocation routines. + //! Use set_allocator() function to set them. + //!

+ //! Allocations for nodes, attributes and strings are aligned at RAPIDXML_ALIGNMENT bytes. + //! This value defaults to the size of pointer on target architecture. + //!

+ //! To obtain absolutely top performance from the parser, + //! it is important that all nodes are allocated from a single, contiguous block of memory. + //! Otherwise, cache misses when jumping between two (or more) disjoint blocks of memory can slow down parsing quite considerably. + //! If required, you can tweak RAPIDXML_STATIC_POOL_SIZE, RAPIDXML_DYNAMIC_POOL_SIZE and RAPIDXML_ALIGNMENT + //! to obtain best wasted memory to performance compromise. + //! To do it, define their values before rapidxml.hpp file is included. + //! \param Ch Character type of created nodes. + template + class memory_pool + { + + public: + + //! \cond internal + typedef void *(alloc_func1)(std::size_t); // Type of user-defined function used to allocate memory + typedef void (free_func)(void *); // Type of user-defined function used to free memory + //! \endcond + + //! Constructs empty pool with default allocator functions. + memory_pool() + : m_alloc_func(0) + , m_free_func(0) + { + init(); + } + + //! Destroys pool and frees all the memory. + //! This causes memory occupied by nodes allocated by the pool to be freed. + //! Nodes allocated from the pool are no longer valid. + ~memory_pool() + { + clear(); + } + + //! Allocates a new node from the pool, and optionally assigns name and value to it. + //! If the allocation request cannot be accomodated, this function will throw std::bad_alloc. + //! If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function + //! will call rapidxml::parse_error_handler() function. + //! \param type Type of node to create. + //! \param name Name to assign to the node, or 0 to assign no name. + //! \param value Value to assign to the node, or 0 to assign no value. + //! \param name_size Size of name to assign, or 0 to automatically calculate size from name string. + //! \param value_size Size of value to assign, or 0 to automatically calculate size from value string. + //! \return Pointer to allocated node. This pointer will never be NULL. + xml_node *allocate_node(node_type type, + const Ch *name = 0, const Ch *value = 0, + std::size_t name_size = 0, std::size_t value_size = 0) + { + void *memory = allocate_aligned(sizeof(xml_node)); + xml_node *node = new(memory) xml_node(type); + if (name) + { + if (name_size > 0) + node->name(name, name_size); + else + node->name(name); + } + if (value) + { + if (value_size > 0) + node->value(value, value_size); + else + node->value(value); + } + return node; + } + + //! Allocates a new attribute from the pool, and optionally assigns name and value to it. + //! If the allocation request cannot be accomodated, this function will throw std::bad_alloc. + //! If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function + //! will call rapidxml::parse_error_handler() function. + //! \param name Name to assign to the attribute, or 0 to assign no name. + //! \param value Value to assign to the attribute, or 0 to assign no value. + //! \param name_size Size of name to assign, or 0 to automatically calculate size from name string. + //! \param value_size Size of value to assign, or 0 to automatically calculate size from value string. + //! \return Pointer to allocated attribute. This pointer will never be NULL. + xml_attribute *allocate_attribute(const Ch *name = 0, const Ch *value = 0, + std::size_t name_size = 0, std::size_t value_size = 0) + { + void *memory = allocate_aligned(sizeof(xml_attribute)); + xml_attribute *attribute = new(memory) xml_attribute; + if (name) + { + if (name_size > 0) + attribute->name(name, name_size); + else + attribute->name(name); + } + if (value) + { + if (value_size > 0) + attribute->value(value, value_size); + else + attribute->value(value); + } + return attribute; + } + + //! Allocates a char array of given size from the pool, and optionally copies a given string to it. + //! If the allocation request cannot be accomodated, this function will throw std::bad_alloc. + //! If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function + //! will call rapidxml::parse_error_handler() function. + //! \param source String to initialize the allocated memory with, or 0 to not initialize it. + //! \param size Number of characters to allocate, or zero to calculate it automatically from source string length; if size is 0, source string must be specified and null terminated. + //! \return Pointer to allocated char array. This pointer will never be NULL. + Ch *allocate_string(const Ch *source = 0, std::size_t size = 0) + { + assert(source || size); // Either source or size (or both) must be specified + if (size == 0) + size = internal::measure(source) + 1; + Ch *result = static_cast(allocate_aligned(size * sizeof(Ch))); + if (source) + for (std::size_t i = 0; i < size; ++i) + result[i] = source[i]; + return result; + } + + //! Clones an xml_node and its hierarchy of child nodes and attributes. + //! Nodes and attributes are allocated from this memory pool. + //! Names and values are not cloned, they are shared between the clone and the source. + //! Result node can be optionally specified as a second parameter, + //! in which case its contents will be replaced with cloned source node. + //! This is useful when you want to clone entire document. + //! \param source Node to clone. + //! \param result Node to put results in, or 0 to automatically allocate result node + //! \return Pointer to cloned node. This pointer will never be NULL. + xml_node *clone_node(const xml_node *source, xml_node *result = 0) + { + // Prepare result node + if (result) + { + result->remove_all_attributes(); + result->remove_all_nodes(); + result->type(source->type()); + } + else + result = allocate_node(source->type()); + + // Clone name and value + result->name(source->name(), source->name_size()); + result->value(source->value(), source->value_size()); + + // Clone child nodes and attributes + for (xml_node *child = source->first_node(); child; child = child->next_sibling()) + result->append_node(clone_node(child)); + for (xml_attribute *attr = source->first_attribute(); attr; attr = attr->next_attribute()) + result->append_attribute(allocate_attribute(attr->name(), attr->value(), attr->name_size(), attr->value_size())); + + return result; + } + + //! Clears the pool. + //! This causes memory occupied by nodes allocated by the pool to be freed. + //! Any nodes or strings allocated from the pool will no longer be valid. + void clear() + { + while (m_begin != m_static_memory) + { + char *previous_begin = reinterpret_cast
(align(m_begin))->previous_begin; + if (m_free_func) + m_free_func(m_begin); + else + delete[] m_begin; + m_begin = previous_begin; + } + init(); + } + + //! Sets or resets the user-defined memory allocation functions for the pool. + //! This can only be called when no memory is allocated from the pool yet, otherwise results are undefined. + //! Allocation function must not return invalid pointer on failure. It should either throw, + //! stop the program, or use longjmp() function to pass control to other place of program. + //! If it returns invalid pointer, results are undefined. + //!

+ //! User defined allocation functions must have the following forms: + //!
+ //!
void *allocate(std::size_t size); + //!
void free(void *pointer); + //!

+ //! \param af Allocation function, or 0 to restore default function + //! \param ff Free function, or 0 to restore default function + void set_allocator(alloc_func1 *af, free_func *ff) + { + assert(m_begin == m_static_memory && m_ptr == align(m_begin)); // Verify that no memory is allocated yet + m_alloc_func = af; + m_free_func = ff; + } + + private: + + struct header + { + char *previous_begin; + }; + + void init() + { + m_begin = m_static_memory; + m_ptr = align(m_begin); + m_end = m_static_memory + sizeof(m_static_memory); + } + + char *align(char *ptr) + { + std::size_t alignment = ((RAPIDXML_ALIGNMENT - (std::size_t(ptr) & (RAPIDXML_ALIGNMENT - 1))) & (RAPIDXML_ALIGNMENT - 1)); + return ptr + alignment; + } + + char *allocate_raw(std::size_t size) + { + // Allocate + void *memory; + if (m_alloc_func) // Allocate memory using either user-specified allocation function or global operator new[] + { + memory = m_alloc_func(size); + assert(memory); // Allocator is not allowed to return 0, on failure it must either throw, stop the program or use longjmp + } + else + { + memory = new char[size]; +#ifdef RAPIDXML_NO_EXCEPTIONS + if (!memory) // If exceptions are disabled, verify memory allocation, because new will not be able to throw bad_alloc + RAPIDXML_PARSE_ERROR("out of memory", 0); +#endif + } + return static_cast(memory); + } + + void *allocate_aligned(std::size_t size) + { + // Calculate aligned pointer + char *result = align(m_ptr); + + // If not enough memory left in current pool, allocate a new pool + if (result + size > m_end) + { + // Calculate required pool size (may be bigger than RAPIDXML_DYNAMIC_POOL_SIZE) + std::size_t pool_size = RAPIDXML_DYNAMIC_POOL_SIZE; + if (pool_size < size) + pool_size = size; + + // Allocate + std::size_t alloc_size = sizeof(header) + (2 * RAPIDXML_ALIGNMENT - 2) + pool_size; // 2 alignments required in worst case: one for header, one for actual allocation + char *raw_memory = allocate_raw(alloc_size); + + // Setup new pool in allocated memory + char *pool = align(raw_memory); + header *new_header = reinterpret_cast
(pool); + new_header->previous_begin = m_begin; + m_begin = raw_memory; + m_ptr = pool + sizeof(header); + m_end = raw_memory + alloc_size; + + // Calculate aligned pointer again using new pool + result = align(m_ptr); + } + + // Update pool and return aligned pointer + m_ptr = result + size; + return result; + } + + char *m_begin; // Start of raw memory making up current pool + char *m_ptr; // First free byte in current pool + char *m_end; // One past last available byte in current pool + char m_static_memory[RAPIDXML_STATIC_POOL_SIZE]; // Static raw memory + alloc_func1 *m_alloc_func; // Allocator function, or 0 if default is to be used + free_func *m_free_func; // Free function, or 0 if default is to be used + }; + + /////////////////////////////////////////////////////////////////////////// + // XML base + + //! Base class for xml_node and xml_attribute implementing common functions: + //! name(), name_size(), value(), value_size() and parent(). + //! \param Ch Character type to use + template + class xml_base + { + + public: + + /////////////////////////////////////////////////////////////////////////// + // Construction & destruction + + // Construct a base with empty name, value and parent + xml_base() + : m_name(0) + , m_value(0) + , m_parent(0) + { + } + + /////////////////////////////////////////////////////////////////////////// + // Node data access + + //! Gets name of the node. + //! Interpretation of name depends on type of node. + //! Note that name will not be zero-terminated if rapidxml::parse_no_string_terminators option was selected during parse. + //!

+ //! Use name_size() function to determine length of the name. + //! \return Name of node, or empty string if node has no name. + Ch *name() const + { + return m_name ? m_name : nullstr(); + } + + //! Gets size of node name, not including terminator character. + //! This function works correctly irrespective of whether name is or is not zero terminated. + //! \return Size of node name, in characters. + std::size_t name_size() const + { + return m_name ? m_name_size : 0; + } + + //! Gets value of node. + //! Interpretation of value depends on type of node. + //! Note that value will not be zero-terminated if rapidxml::parse_no_string_terminators option was selected during parse. + //!

+ //! Use value_size() function to determine length of the value. + //! \return Value of node, or empty string if node has no value. + Ch *value() const + { + return m_value ? m_value : nullstr(); + } + + //! Gets size of node value, not including terminator character. + //! This function works correctly irrespective of whether value is or is not zero terminated. + //! \return Size of node value, in characters. + std::size_t value_size() const + { + return m_value ? m_value_size : 0; + } + + /////////////////////////////////////////////////////////////////////////// + // Node modification + + //! Sets name of node to a non zero-terminated string. + //! See \ref ownership_of_strings. + //!

+ //! Note that node does not own its name or value, it only stores a pointer to it. + //! It will not delete or otherwise free the pointer on destruction. + //! It is reponsibility of the user to properly manage lifetime of the string. + //! The easiest way to achieve it is to use memory_pool of the document to allocate the string - + //! on destruction of the document the string will be automatically freed. + //!

+ //! Size of name must be specified separately, because name does not have to be zero terminated. + //! Use name(const Ch *) function to have the length automatically calculated (string must be zero terminated). + //! \param name Name of node to set. Does not have to be zero terminated. + //! \param size Size of name, in characters. This does not include zero terminator, if one is present. + void name(const Ch *name, std::size_t size) + { + m_name = const_cast(name); + m_name_size = size; + } + + //! Sets name of node to a zero-terminated string. + //! See also \ref ownership_of_strings and xml_node::name(const Ch *, std::size_t). + //! \param name Name of node to set. Must be zero terminated. + void name(const Ch *name) + { + this->name(name, internal::measure(name)); + } + + //! Sets value of node to a non zero-terminated string. + //! See \ref ownership_of_strings. + //!

+ //! Note that node does not own its name or value, it only stores a pointer to it. + //! It will not delete or otherwise free the pointer on destruction. + //! It is reponsibility of the user to properly manage lifetime of the string. + //! The easiest way to achieve it is to use memory_pool of the document to allocate the string - + //! on destruction of the document the string will be automatically freed. + //!

+ //! Size of value must be specified separately, because it does not have to be zero terminated. + //! Use value(const Ch *) function to have the length automatically calculated (string must be zero terminated). + //!

+ //! If an element has a child node of type node_data, it will take precedence over element value when printing. + //! If you want to manipulate data of elements using values, use parser flag rapidxml::parse_no_data_nodes to prevent creation of data nodes by the parser. + //! \param value value of node to set. Does not have to be zero terminated. + //! \param size Size of value, in characters. This does not include zero terminator, if one is present. + void value(const Ch *value, std::size_t size) + { + m_value = const_cast(value); + m_value_size = size; + } + + //! Sets value of node to a zero-terminated string. + //! See also \ref ownership_of_strings and xml_node::value(const Ch *, std::size_t). + //! \param value Vame of node to set. Must be zero terminated. + void value(const Ch *value) + { + this->value(value, internal::measure(value)); + } + + /////////////////////////////////////////////////////////////////////////// + // Related nodes access + + //! Gets node parent. + //! \return Pointer to parent node, or 0 if there is no parent. + xml_node *parent() const + { + return m_parent; + } + + protected: + + // Return empty string + static Ch *nullstr() + { + static Ch zero = Ch('\0'); + return &zero; + } + + Ch *m_name; // Name of node, or 0 if no name + Ch *m_value; // Value of node, or 0 if no value + std::size_t m_name_size; // Length of node name, or undefined of no name + std::size_t m_value_size; // Length of node value, or undefined if no value + xml_node *m_parent; // Pointer to parent node, or 0 if none + + }; + + //! Class representing attribute node of XML document. + //! Each attribute has name and value strings, which are available through name() and value() functions (inherited from xml_base). + //! Note that after parse, both name and value of attribute will point to interior of source text used for parsing. + //! Thus, this text must persist in memory for the lifetime of attribute. + //! \param Ch Character type to use. + template + class xml_attribute: public xml_base + { + + friend class xml_node; + + public: + + /////////////////////////////////////////////////////////////////////////// + // Construction & destruction + + //! Constructs an empty attribute with the specified type. + //! Consider using memory_pool of appropriate xml_document if allocating attributes manually. + xml_attribute() + { + } + + /////////////////////////////////////////////////////////////////////////// + // Related nodes access + + //! Gets document of which attribute is a child. + //! \return Pointer to document that contains this attribute, or 0 if there is no parent document. + xml_document *document() const + { + if (xml_node *node = this->parent()) + { + while (node->parent()) + node = node->parent(); + return node->type() == node_document ? static_cast *>(node) : 0; + } + else + return 0; + } + + //! Gets previous attribute, optionally matching attribute name. + //! \param name Name of attribute to find, or 0 to return previous attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found attribute, or 0 if not found. + xml_attribute *previous_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const + { + if (name) + { + if (name_size == 0) + name_size = internal::measure(name); + for (xml_attribute *attribute = m_prev_attribute; attribute; attribute = attribute->m_prev_attribute) + if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive)) + return attribute; + return 0; + } + else + return this->m_parent ? m_prev_attribute : 0; + } + + //! Gets next attribute, optionally matching attribute name. + //! \param name Name of attribute to find, or 0 to return next attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found attribute, or 0 if not found. + xml_attribute *next_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const + { + if (name) + { + if (name_size == 0) + name_size = internal::measure(name); + for (xml_attribute *attribute = m_next_attribute; attribute; attribute = attribute->m_next_attribute) + if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive)) + return attribute; + return 0; + } + else + return this->m_parent ? m_next_attribute : 0; + } + + private: + + xml_attribute *m_prev_attribute; // Pointer to previous sibling of attribute, or 0 if none; only valid if parent is non-zero + xml_attribute *m_next_attribute; // Pointer to next sibling of attribute, or 0 if none; only valid if parent is non-zero + + }; + + /////////////////////////////////////////////////////////////////////////// + // XML node + + //! Class representing a node of XML document. + //! Each node may have associated name and value strings, which are available through name() and value() functions. + //! Interpretation of name and value depends on type of the node. + //! Type of node can be determined by using type() function. + //!

+ //! Note that after parse, both name and value of node, if any, will point interior of source text used for parsing. + //! Thus, this text must persist in the memory for the lifetime of node. + //! \param Ch Character type to use. + template + class xml_node: public xml_base + { + + public: + + /////////////////////////////////////////////////////////////////////////// + // Construction & destruction + + //! Constructs an empty node with the specified type. + //! Consider using memory_pool of appropriate document to allocate nodes manually. + //! \param type Type of node to construct. + xml_node(node_type type) + : m_type(type) + , m_first_node(0) + , m_first_attribute(0) + { + } + + /////////////////////////////////////////////////////////////////////////// + // Node data access + + //! Gets type of node. + //! \return Type of node. + node_type type() const + { + return m_type; + } + + /////////////////////////////////////////////////////////////////////////// + // Related nodes access + + //! Gets document of which node is a child. + //! \return Pointer to document that contains this node, or 0 if there is no parent document. + xml_document *document() const + { + xml_node *node = const_cast *>(this); + while (node->parent()) + node = node->parent(); + return node->type() == node_document ? static_cast *>(node) : 0; + } + + //! Gets first child node, optionally matching node name. + //! \param name Name of child to find, or 0 to return first child regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found child, or 0 if not found. + xml_node *first_node(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const + { + if (name) + { + if (name_size == 0) + name_size = internal::measure(name); + for (xml_node *child = m_first_node; child; child = child->next_sibling()) + if (internal::compare(child->name(), child->name_size(), name, name_size, case_sensitive)) + return child; + return 0; + } + else + return m_first_node; + } + + //! Gets last child node, optionally matching node name. + //! Behaviour is undefined if node has no children. + //! Use first_node() to test if node has children. + //! \param name Name of child to find, or 0 to return last child regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found child, or 0 if not found. + xml_node *last_node(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const + { + assert(m_first_node); // Cannot query for last child if node has no children + if (name) + { + if (name_size == 0) + name_size = internal::measure(name); + for (xml_node *child = m_last_node; child; child = child->previous_sibling()) + if (internal::compare(child->name(), child->name_size(), name, name_size, case_sensitive)) + return child; + return 0; + } + else + return m_last_node; + } + + //! Gets previous sibling node, optionally matching node name. + //! Behaviour is undefined if node has no parent. + //! Use parent() to test if node has a parent. + //! \param name Name of sibling to find, or 0 to return previous sibling regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found sibling, or 0 if not found. + xml_node *previous_sibling(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const + { + assert(this->m_parent); // Cannot query for siblings if node has no parent + if (name) + { + if (name_size == 0) + name_size = internal::measure(name); + for (xml_node *sibling = m_prev_sibling; sibling; sibling = sibling->m_prev_sibling) + if (internal::compare(sibling->name(), sibling->name_size(), name, name_size, case_sensitive)) + return sibling; + return 0; + } + else + return m_prev_sibling; + } + + //! Gets next sibling node, optionally matching node name. + //! Behaviour is undefined if node has no parent. + //! Use parent() to test if node has a parent. + //! \param name Name of sibling to find, or 0 to return next sibling regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found sibling, or 0 if not found. + xml_node *next_sibling(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const + { + assert(this->m_parent); // Cannot query for siblings if node has no parent + if (name) + { + if (name_size == 0) + name_size = internal::measure(name); + for (xml_node *sibling = m_next_sibling; sibling; sibling = sibling->m_next_sibling) + if (internal::compare(sibling->name(), sibling->name_size(), name, name_size, case_sensitive)) + return sibling; + return 0; + } + else + return m_next_sibling; + } + + //! Gets first attribute of node, optionally matching attribute name. + //! \param name Name of attribute to find, or 0 to return first attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found attribute, or 0 if not found. + xml_attribute *first_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const + { + if (name) + { + if (name_size == 0) + name_size = internal::measure(name); + for (xml_attribute *attribute = m_first_attribute; attribute; attribute = attribute->m_next_attribute) + if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive)) + return attribute; + return 0; + } + else + return m_first_attribute; + } + + //! Gets last attribute of node, optionally matching attribute name. + //! \param name Name of attribute to find, or 0 to return last attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found attribute, or 0 if not found. + xml_attribute *last_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const + { + if (name) + { + if (name_size == 0) + name_size = internal::measure(name); + for (xml_attribute *attribute = m_last_attribute; attribute; attribute = attribute->m_prev_attribute) + if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive)) + return attribute; + return 0; + } + else + return m_first_attribute ? m_last_attribute : 0; + } + + /////////////////////////////////////////////////////////////////////////// + // Node modification + + //! Sets type of node. + //! \param type Type of node to set. + void type(node_type type) + { + m_type = type; + } + + /////////////////////////////////////////////////////////////////////////// + // Node manipulation + + //! Prepends a new child node. + //! The prepended child becomes the first child, and all existing children are moved one position back. + //! \param child Node to prepend. + void prepend_node(xml_node *child) + { + assert(child && !child->parent() && child->type() != node_document); + if (first_node()) + { + child->m_next_sibling = m_first_node; + m_first_node->m_prev_sibling = child; + } + else + { + child->m_next_sibling = 0; + m_last_node = child; + } + m_first_node = child; + child->m_parent = this; + child->m_prev_sibling = 0; + } + + //! Appends a new child node. + //! The appended child becomes the last child. + //! \param child Node to append. + void append_node(xml_node *child) + { + assert(child && !child->parent() && child->type() != node_document); + if (first_node()) + { + child->m_prev_sibling = m_last_node; + m_last_node->m_next_sibling = child; + } + else + { + child->m_prev_sibling = 0; + m_first_node = child; + } + m_last_node = child; + child->m_parent = this; + child->m_next_sibling = 0; + } + + //! Inserts a new child node at specified place inside the node. + //! All children after and including the specified node are moved one position back. + //! \param where Place where to insert the child, or 0 to insert at the back. + //! \param child Node to insert. + void insert_node(xml_node *where, xml_node *child) + { + assert(!where || where->parent() == this); + assert(child && !child->parent() && child->type() != node_document); + if (where == m_first_node) + prepend_node(child); + else if (where == 0) + append_node(child); + else + { + child->m_prev_sibling = where->m_prev_sibling; + child->m_next_sibling = where; + where->m_prev_sibling->m_next_sibling = child; + where->m_prev_sibling = child; + child->m_parent = this; + } + } + + //! Removes first child node. + //! If node has no children, behaviour is undefined. + //! Use first_node() to test if node has children. + void remove_first_node() + { + assert(first_node()); + xml_node *child = m_first_node; + m_first_node = child->m_next_sibling; + if (child->m_next_sibling) + child->m_next_sibling->m_prev_sibling = 0; + else + m_last_node = 0; + child->m_parent = 0; + } + + //! Removes last child of the node. + //! If node has no children, behaviour is undefined. + //! Use first_node() to test if node has children. + void remove_last_node() + { + assert(first_node()); + xml_node *child = m_last_node; + if (child->m_prev_sibling) + { + m_last_node = child->m_prev_sibling; + child->m_prev_sibling->m_next_sibling = 0; + } + else + m_first_node = 0; + child->m_parent = 0; + } + + //! Removes specified child from the node + // \param where Pointer to child to be removed. + void remove_node(xml_node *where) + { + assert(where && where->parent() == this); + assert(first_node()); + if (where == m_first_node) + remove_first_node(); + else if (where == m_last_node) + remove_last_node(); + else + { + where->m_prev_sibling->m_next_sibling = where->m_next_sibling; + where->m_next_sibling->m_prev_sibling = where->m_prev_sibling; + where->m_parent = 0; + } + } + + //! Removes all child nodes (but not attributes). + void remove_all_nodes() + { + for (xml_node *node = first_node(); node; node = node->m_next_sibling) + node->m_parent = 0; + m_first_node = 0; + } + + //! Prepends a new attribute to the node. + //! \param attribute Attribute to prepend. + void prepend_attribute(xml_attribute *attribute) + { + assert(attribute && !attribute->parent()); + if (first_attribute()) + { + attribute->m_next_attribute = m_first_attribute; + m_first_attribute->m_prev_attribute = attribute; + } + else + { + attribute->m_next_attribute = 0; + m_last_attribute = attribute; + } + m_first_attribute = attribute; + attribute->m_parent = this; + attribute->m_prev_attribute = 0; + } + + //! Appends a new attribute to the node. + //! \param attribute Attribute to append. + void append_attribute(xml_attribute *attribute) + { + assert(attribute && !attribute->parent()); + if (first_attribute()) + { + attribute->m_prev_attribute = m_last_attribute; + m_last_attribute->m_next_attribute = attribute; + } + else + { + attribute->m_prev_attribute = 0; + m_first_attribute = attribute; + } + m_last_attribute = attribute; + attribute->m_parent = this; + attribute->m_next_attribute = 0; + } + + //! Inserts a new attribute at specified place inside the node. + //! All attributes after and including the specified attribute are moved one position back. + //! \param where Place where to insert the attribute, or 0 to insert at the back. + //! \param attribute Attribute to insert. + void insert_attribute(xml_attribute *where, xml_attribute *attribute) + { + assert(!where || where->parent() == this); + assert(attribute && !attribute->parent()); + if (where == m_first_attribute) + prepend_attribute(attribute); + else if (where == 0) + append_attribute(attribute); + else + { + attribute->m_prev_attribute = where->m_prev_attribute; + attribute->m_next_attribute = where; + where->m_prev_attribute->m_next_attribute = attribute; + where->m_prev_attribute = attribute; + attribute->m_parent = this; + } + } + + //! Removes first attribute of the node. + //! If node has no attributes, behaviour is undefined. + //! Use first_attribute() to test if node has attributes. + void remove_first_attribute() + { + assert(first_attribute()); + xml_attribute *attribute = m_first_attribute; + if (attribute->m_next_attribute) + { + attribute->m_next_attribute->m_prev_attribute = 0; + } + else + m_last_attribute = 0; + attribute->m_parent = 0; + m_first_attribute = attribute->m_next_attribute; + } + + //! Removes last attribute of the node. + //! If node has no attributes, behaviour is undefined. + //! Use first_attribute() to test if node has attributes. + void remove_last_attribute() + { + assert(first_attribute()); + xml_attribute *attribute = m_last_attribute; + if (attribute->m_prev_attribute) + { + attribute->m_prev_attribute->m_next_attribute = 0; + m_last_attribute = attribute->m_prev_attribute; + } + else + m_first_attribute = 0; + attribute->m_parent = 0; + } + + //! Removes specified attribute from node. + //! \param where Pointer to attribute to be removed. + void remove_attribute(xml_attribute *where) + { + assert(first_attribute() && where->parent() == this); + if (where == m_first_attribute) + remove_first_attribute(); + else if (where == m_last_attribute) + remove_last_attribute(); + else + { + where->m_prev_attribute->m_next_attribute = where->m_next_attribute; + where->m_next_attribute->m_prev_attribute = where->m_prev_attribute; + where->m_parent = 0; + } + } + + //! Removes all attributes of node. + void remove_all_attributes() + { + for (xml_attribute *attribute = first_attribute(); attribute; attribute = attribute->m_next_attribute) + attribute->m_parent = 0; + m_first_attribute = 0; + } + + private: + + /////////////////////////////////////////////////////////////////////////// + // Restrictions + + // No copying + xml_node(const xml_node &); + void operator =(const xml_node &); + + /////////////////////////////////////////////////////////////////////////// + // Data members + + // Note that some of the pointers below have UNDEFINED values if certain other pointers are 0. + // This is required for maximum performance, as it allows the parser to omit initialization of + // unneded/redundant values. + // + // The rules are as follows: + // 1. first_node and first_attribute contain valid pointers, or 0 if node has no children/attributes respectively + // 2. last_node and last_attribute are valid only if node has at least one child/attribute respectively, otherwise they contain garbage + // 3. prev_sibling and next_sibling are valid only if node has a parent, otherwise they contain garbage + + node_type m_type; // Type of node; always valid + xml_node *m_first_node; // Pointer to first child node, or 0 if none; always valid + xml_node *m_last_node; // Pointer to last child node, or 0 if none; this value is only valid if m_first_node is non-zero + xml_attribute *m_first_attribute; // Pointer to first attribute of node, or 0 if none; always valid + xml_attribute *m_last_attribute; // Pointer to last attribute of node, or 0 if none; this value is only valid if m_first_attribute is non-zero + xml_node *m_prev_sibling; // Pointer to previous sibling of node, or 0 if none; this value is only valid if m_parent is non-zero + xml_node *m_next_sibling; // Pointer to next sibling of node, or 0 if none; this value is only valid if m_parent is non-zero + + }; + + /////////////////////////////////////////////////////////////////////////// + // XML document + + //! This class represents root of the DOM hierarchy. + //! It is also an xml_node and a memory_pool through public inheritance. + //! Use parse() function to build a DOM tree from a zero-terminated XML text string. + //! parse() function allocates memory for nodes and attributes by using functions of xml_document, + //! which are inherited from memory_pool. + //! To access root node of the document, use the document itself, as if it was an xml_node. + //! \param Ch Character type to use. + template + class xml_document: public xml_node, public memory_pool + { + + public: + + //! Constructs empty XML document + xml_document() + : xml_node(node_document) + { + } + + //! Parses zero-terminated XML string according to given flags. + //! Passed string will be modified by the parser, unless rapidxml::parse_non_destructive flag is used. + //! The string must persist for the lifetime of the document. + //! In case of error, rapidxml::parse_error exception will be thrown. + //!

+ //! If you want to parse contents of a file, you must first load the file into the memory, and pass pointer to its beginning. + //! Make sure that data is zero-terminated. + //!

+ //! Document can be parsed into multiple times. + //! Each new call to parse removes previous nodes and attributes (if any), but does not clear memory pool. + //! \param text XML data to parse; pointer is non-const to denote fact that this data may be modified by the parser. + template + void parse(Ch *text) + { + assert(text); + + // Remove current contents + this->remove_all_nodes(); + this->remove_all_attributes(); + + // Parse BOM, if any + parse_bom(text); + + // Parse children + while (1) + { + // Skip whitespace before node + skip(text); + if (*text == 0) + break; + + // Parse and append new child + if (*text == Ch('<')) + { + ++text; // Skip '<' + if (xml_node *node = parse_node(text)) + this->append_node(node); + } + else + RAPIDXML_PARSE_ERROR("expected <", text); + } + + } + + //! Clears the document by deleting all nodes and clearing the memory pool. + //! All nodes owned by document pool are destroyed. + void clear() + { + this->remove_all_nodes(); + this->remove_all_attributes(); + memory_pool::clear(); + } + + private: + + /////////////////////////////////////////////////////////////////////// + // Internal character utility functions + + // Detect whitespace character + struct whitespace_pred + { + static unsigned char test(Ch ch) + { + return internal::lookup_tables<0>::lookup_whitespace[static_cast(ch)]; + } + }; + + // Detect node name character + struct node_name_pred + { + static unsigned char test(Ch ch) + { + return internal::lookup_tables<0>::lookup_node_name[static_cast(ch)]; + } + }; + + // Detect attribute name character + struct attribute_name_pred + { + static unsigned char test(Ch ch) + { + return internal::lookup_tables<0>::lookup_attribute_name[static_cast(ch)]; + } + }; + + // Detect text character (PCDATA) + struct text_pred + { + static unsigned char test(Ch ch) + { + return internal::lookup_tables<0>::lookup_text[static_cast(ch)]; + } + }; + + // Detect text character (PCDATA) that does not require processing + struct text_pure_no_ws_pred + { + static unsigned char test(Ch ch) + { + return internal::lookup_tables<0>::lookup_text_pure_no_ws[static_cast(ch)]; + } + }; + + // Detect text character (PCDATA) that does not require processing + struct text_pure_with_ws_pred + { + static unsigned char test(Ch ch) + { + return internal::lookup_tables<0>::lookup_text_pure_with_ws[static_cast(ch)]; + } + }; + + // Detect attribute value character + template + struct attribute_value_pred + { + static unsigned char test(Ch ch) + { + if (Quote == Ch('\'')) + return internal::lookup_tables<0>::lookup_attribute_data_1[static_cast(ch)]; + if (Quote == Ch('\"')) + return internal::lookup_tables<0>::lookup_attribute_data_2[static_cast(ch)]; + return 0; // Should never be executed, to avoid warnings on Comeau + } + }; + + // Detect attribute value character + template + struct attribute_value_pure_pred + { + static unsigned char test(Ch ch) + { + if (Quote == Ch('\'')) + return internal::lookup_tables<0>::lookup_attribute_data_1_pure[static_cast(ch)]; + if (Quote == Ch('\"')) + return internal::lookup_tables<0>::lookup_attribute_data_2_pure[static_cast(ch)]; + return 0; // Should never be executed, to avoid warnings on Comeau + } + }; + + // Insert coded character, using UTF8 or 8-bit ASCII + template + static void insert_coded_character(Ch *&text, unsigned long code) + { + if (Flags & parse_no_utf8) + { + // Insert 8-bit ASCII character + // Todo: possibly verify that code is less than 256 and use replacement char otherwise? + text[0] = static_cast(code); + text += 1; + } + else + { + // Insert UTF8 sequence + if (code < 0x80) // 1 byte sequence + { + text[0] = static_cast(code); + text += 1; + } + else if (code < 0x800) // 2 byte sequence + { + text[1] = static_cast((code | 0x80) & 0xBF); code >>= 6; + text[0] = static_cast(code | 0xC0); + text += 2; + } + else if (code < 0x10000) // 3 byte sequence + { + text[2] = static_cast((code | 0x80) & 0xBF); code >>= 6; + text[1] = static_cast((code | 0x80) & 0xBF); code >>= 6; + text[0] = static_cast(code | 0xE0); + text += 3; + } + else if (code < 0x110000) // 4 byte sequence + { + text[3] = static_cast((code | 0x80) & 0xBF); code >>= 6; + text[2] = static_cast((code | 0x80) & 0xBF); code >>= 6; + text[1] = static_cast((code | 0x80) & 0xBF); code >>= 6; + text[0] = static_cast(code | 0xF0); + text += 4; + } + else // Invalid, only codes up to 0x10FFFF are allowed in Unicode + { + RAPIDXML_PARSE_ERROR("invalid numeric character entity", text); + } + } + } + + // Skip characters until predicate evaluates to true + template + static void skip(Ch *&text) + { + Ch *tmp = text; + while (StopPred::test(*tmp)) + ++tmp; + text = tmp; + } + + // Skip characters until predicate evaluates to true while doing the following: + // - replacing XML character entity references with proper characters (' & " < > &#...;) + // - condensing whitespace sequences to single space character + template + static Ch *skip_and_expand_character_refs(Ch *&text) + { + // If entity translation, whitespace condense and whitespace trimming is disabled, use plain skip + if (Flags & parse_no_entity_translation && + !(Flags & parse_normalize_whitespace) && + !(Flags & parse_trim_whitespace)) + { + skip(text); + return text; + } + + // Use simple skip until first modification is detected + skip(text); + + // Use translation skip + Ch *src = text; + Ch *dest = src; + while (StopPred::test(*src)) + { + // If entity translation is enabled + if (!(Flags & parse_no_entity_translation)) + { + // Test if replacement is needed + if (src[0] == Ch('&')) + { + switch (src[1]) + { + + // & ' + case Ch('a'): + if (src[2] == Ch('m') && src[3] == Ch('p') && src[4] == Ch(';')) + { + *dest = Ch('&'); + ++dest; + src += 5; + continue; + } + if (src[2] == Ch('p') && src[3] == Ch('o') && src[4] == Ch('s') && src[5] == Ch(';')) + { + *dest = Ch('\''); + ++dest; + src += 6; + continue; + } + break; + + // " + case Ch('q'): + if (src[2] == Ch('u') && src[3] == Ch('o') && src[4] == Ch('t') && src[5] == Ch(';')) + { + *dest = Ch('"'); + ++dest; + src += 6; + continue; + } + break; + + // > + case Ch('g'): + if (src[2] == Ch('t') && src[3] == Ch(';')) + { + *dest = Ch('>'); + ++dest; + src += 4; + continue; + } + break; + + // < + case Ch('l'): + if (src[2] == Ch('t') && src[3] == Ch(';')) + { + *dest = Ch('<'); + ++dest; + src += 4; + continue; + } + break; + + // &#...; - assumes ASCII + case Ch('#'): + if (src[2] == Ch('x')) + { + unsigned long code = 0; + src += 3; // Skip &#x + while (1) + { + unsigned char digit = internal::lookup_tables<0>::lookup_digits[static_cast(*src)]; + if (digit == 0xFF) + break; + code = code * 16 + digit; + ++src; + } + insert_coded_character(dest, code); // Put character in output + } + else + { + unsigned long code = 0; + src += 2; // Skip &# + while (1) + { + unsigned char digit = internal::lookup_tables<0>::lookup_digits[static_cast(*src)]; + if (digit == 0xFF) + break; + code = code * 10 + digit; + ++src; + } + insert_coded_character(dest, code); // Put character in output + } + if (*src == Ch(';')) + ++src; + else + RAPIDXML_PARSE_ERROR("expected ;", src); + continue; + + // Something else + default: + // Ignore, just copy '&' verbatim + break; + + } + } + } + + // If whitespace condensing is enabled + if (Flags & parse_normalize_whitespace) + { + // Test if condensing is needed + if (whitespace_pred::test(*src)) + { + *dest = Ch(' '); ++dest; // Put single space in dest + ++src; // Skip first whitespace char + // Skip remaining whitespace chars + while (whitespace_pred::test(*src)) + ++src; + continue; + } + } + + // No replacement, only copy character + *dest++ = *src++; + + } + + // Return new end + text = src; + return dest; + + } + + /////////////////////////////////////////////////////////////////////// + // Internal parsing functions + + // Parse BOM, if any + template + void parse_bom(Ch *&text) + { + // UTF-8? + if (static_cast(text[0]) == 0xEF && + static_cast(text[1]) == 0xBB && + static_cast(text[2]) == 0xBF) + { + text += 3; // Skup utf-8 bom + } + } + + // Parse XML declaration ( + xml_node *parse_xml_declaration(Ch *&text) + { + // If parsing of declaration is disabled + if (!(Flags & parse_declaration_node)) + { + // Skip until end of declaration + while (text[0] != Ch('?') || text[1] != Ch('>')) + { + if (!text[0]) + RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + text += 2; // Skip '?>' + return 0; + } + + // Create declaration + xml_node *declaration = this->allocate_node(node_declaration); + + // Skip whitespace before attributes or ?> + skip(text); + + // Parse declaration attributes + parse_node_attributes(text, declaration); + + // Skip ?> + if (text[0] != Ch('?') || text[1] != Ch('>')) + RAPIDXML_PARSE_ERROR("expected ?>", text); + text += 2; + + return declaration; + } + + // Parse XML comment (' + return 0; // Do not produce comment node + } + + // Remember value start + Ch *value = text; + + // Skip until end of comment + while (text[0] != Ch('-') || text[1] != Ch('-') || text[2] != Ch('>')) + { + if (!text[0]) + RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + + // Create comment node + xml_node *comment = this->allocate_node(node_comment); + comment->value(value, text - value); + + // Place zero terminator after comment value + if (!(Flags & parse_no_string_terminators)) + *text = Ch('\0'); + + text += 3; // Skip '-->' + return comment; + } + + // Parse DOCTYPE + template + xml_node *parse_doctype(Ch *&text) + { + // Remember value start + Ch *value = text; + + // Skip to > + while (*text != Ch('>')) + { + // Determine character type + switch (*text) + { + + // If '[' encountered, scan for matching ending ']' using naive algorithm with depth + // This works for all W3C test files except for 2 most wicked + case Ch('['): + { + ++text; // Skip '[' + int depth = 1; + while (depth > 0) + { + switch (*text) + { + case Ch('['): ++depth; break; + case Ch(']'): --depth; break; + case 0: RAPIDXML_PARSE_ERROR("unexpected end of data", text); + } + ++text; + } + break; + } + + // Error on end of text + case Ch('\0'): + RAPIDXML_PARSE_ERROR("unexpected end of data", text); + + // Other character, skip it + default: + ++text; + + } + } + + // If DOCTYPE nodes enabled + if (Flags & parse_doctype_node) + { + // Create a new doctype node + xml_node *doctype = this->allocate_node(node_doctype); + doctype->value(value, text - value); + + // Place zero terminator after value + if (!(Flags & parse_no_string_terminators)) + *text = Ch('\0'); + + text += 1; // skip '>' + return doctype; + } + else + { + text += 1; // skip '>' + return 0; + } + + } + + // Parse PI + template + xml_node *parse_pi(Ch *&text) + { + // If creation of PI nodes is enabled + if (Flags & parse_pi_nodes) + { + // Create pi node + xml_node *pi = this->allocate_node(node_pi); + + // Extract PI target name + Ch *name = text; + skip(text); + if (text == name) + RAPIDXML_PARSE_ERROR("expected PI target", text); + pi->name(name, text - name); + + // Skip whitespace between pi target and pi + skip(text); + + // Remember start of pi + Ch *value = text; + + // Skip to '?>' + while (text[0] != Ch('?') || text[1] != Ch('>')) + { + if (*text == Ch('\0')) + RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + + // Set pi value (verbatim, no entity expansion or whitespace normalization) + pi->value(value, text - value); + + // Place zero terminator after name and value + if (!(Flags & parse_no_string_terminators)) + { + pi->name()[pi->name_size()] = Ch('\0'); + pi->value()[pi->value_size()] = Ch('\0'); + } + + text += 2; // Skip '?>' + return pi; + } + else + { + // Skip to '?>' + while (text[0] != Ch('?') || text[1] != Ch('>')) + { + if (*text == Ch('\0')) + RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + text += 2; // Skip '?>' + return 0; + } + } + + // Parse and append data + // Return character that ends data. + // This is necessary because this character might have been overwritten by a terminating 0 + template + Ch parse_and_append_data(xml_node *node, Ch *&text, Ch *contents_start) + { + // Backup to contents start if whitespace trimming is disabled + if (!(Flags & parse_trim_whitespace)) + text = contents_start; + + // Skip until end of data + Ch *value = text, *end; + if (Flags & parse_normalize_whitespace) + end = skip_and_expand_character_refs(text); + else + end = skip_and_expand_character_refs(text); + + // Trim trailing whitespace if flag is set; leading was already trimmed by whitespace skip after > + if (Flags & parse_trim_whitespace) + { + if (Flags & parse_normalize_whitespace) + { + // Whitespace is already condensed to single space characters by skipping function, so just trim 1 char off the end + if (*(end - 1) == Ch(' ')) + --end; + } + else + { + // Backup until non-whitespace character is found + while (whitespace_pred::test(*(end - 1))) + --end; + } + } + + // If characters are still left between end and value (this test is only necessary if normalization is enabled) + // Create new data node + if (!(Flags & parse_no_data_nodes)) + { + xml_node *data = this->allocate_node(node_data); + data->value(value, end - value); + node->append_node(data); + } + + // Add data to parent node if no data exists yet + if (!(Flags & parse_no_element_values)) + if (*node->value() == Ch('\0')) + node->value(value, end - value); + + // Place zero terminator after value + if (!(Flags & parse_no_string_terminators)) + { + Ch ch = *text; + *end = Ch('\0'); + return ch; // Return character that ends data; this is required because zero terminator overwritten it + } + + // Return character that ends data + return *text; + } + + // Parse CDATA + template + xml_node *parse_cdata(Ch *&text) + { + // If CDATA is disabled + if (Flags & parse_no_data_nodes) + { + // Skip until end of cdata + while (text[0] != Ch(']') || text[1] != Ch(']') || text[2] != Ch('>')) + { + if (!text[0]) + RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + text += 3; // Skip ]]> + return 0; // Do not produce CDATA node + } + + // Skip until end of cdata + Ch *value = text; + while (text[0] != Ch(']') || text[1] != Ch(']') || text[2] != Ch('>')) + { + if (!text[0]) + RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + + // Create new cdata node + xml_node *cdata = this->allocate_node(node_cdata); + cdata->value(value, text - value); + + // Place zero terminator after value + if (!(Flags & parse_no_string_terminators)) + *text = Ch('\0'); + + text += 3; // Skip ]]> + return cdata; + } + + // Parse element node + template + xml_node *parse_element(Ch *&text) + { + // Create element node + xml_node *element = this->allocate_node(node_element); + + // Extract element name + Ch *name = text; + skip(text); + if (text == name) + RAPIDXML_PARSE_ERROR("expected element name", text); + element->name(name, text - name); + + // Skip whitespace between element name and attributes or > + skip(text); + + // Parse attributes, if any + parse_node_attributes(text, element); + + // Determine ending type + if (*text == Ch('>')) + { + ++text; + parse_node_contents(text, element); + } + else if (*text == Ch('/')) + { + ++text; + if (*text != Ch('>')) + RAPIDXML_PARSE_ERROR("expected >", text); + ++text; + } + else + RAPIDXML_PARSE_ERROR("expected >", text); + + // Place zero terminator after name + if (!(Flags & parse_no_string_terminators)) + element->name()[element->name_size()] = Ch('\0'); + + // Return parsed element + return element; + } + + // Determine node type, and parse it + template + xml_node *parse_node(Ch *&text) + { + // Parse proper node type + switch (text[0]) + { + + // <... + default: + // Parse and append element node + return parse_element(text); + + // (text); + } + else + { + // Parse PI + return parse_pi(text); + } + + // (text); + } + break; + + // (text); + } + break; + + // (text); + } + + } // switch + + // Attempt to skip other, unrecognized node types starting with ')) + { + if (*text == 0) + RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + ++text; // Skip '>' + return 0; // No node recognized + + } + } + + // Parse contents of the node - children, data etc. + template + void parse_node_contents(Ch *&text, xml_node *node) + { + // For all children and text + while (1) + { + // Skip whitespace between > and node contents + Ch *contents_start = text; // Store start of node contents before whitespace is skipped + skip(text); + Ch next_char = *text; + + // After data nodes, instead of continuing the loop, control jumps here. + // This is because zero termination inside parse_and_append_data() function + // would wreak havoc with the above code. + // Also, skipping whitespace after data nodes is unnecessary. + after_data_node: + + // Determine what comes next: node closing, child node, data node, or 0? + switch (next_char) + { + + // Node closing or child node + case Ch('<'): + if (text[1] == Ch('/')) + { + // Node closing + text += 2; // Skip '(text); + if (!internal::compare(node->name(), node->name_size(), closing_name, text - closing_name, true)) + RAPIDXML_PARSE_ERROR("invalid closing tag name", text); + } + else + { + // No validation, just skip name + skip(text); + } + // Skip remaining whitespace after node name + skip(text); + if (*text != Ch('>')) + RAPIDXML_PARSE_ERROR("expected >", text); + ++text; // Skip '>' + return; // Node closed, finished parsing contents + } + else + { + // Child node + ++text; // Skip '<' + if (xml_node *child = parse_node(text)) + node->append_node(child); + } + break; + + // End of data - error + case Ch('\0'): + RAPIDXML_PARSE_ERROR("unexpected end of data", text); + + // Data node + default: + next_char = parse_and_append_data(node, text, contents_start); + goto after_data_node; // Bypass regular processing after data nodes + + } + } + } + + // Parse XML attributes of the node + template + void parse_node_attributes(Ch *&text, xml_node *node) + { + // For all attributes + while (attribute_name_pred::test(*text)) + { + // Extract attribute name + Ch *name = text; + ++text; // Skip first character of attribute name + skip(text); + if (text == name) + RAPIDXML_PARSE_ERROR("expected attribute name", name); + + // Create new attribute + xml_attribute *attribute = this->allocate_attribute(); + attribute->name(name, text - name); + node->append_attribute(attribute); + + // Skip whitespace after attribute name + skip(text); + + // Skip = + if (*text != Ch('=')) + RAPIDXML_PARSE_ERROR("expected =", text); + ++text; + + // Add terminating zero after name + if (!(Flags & parse_no_string_terminators)) + attribute->name()[attribute->name_size()] = 0; + + // Skip whitespace after = + skip(text); + + // Skip quote and remember if it was ' or " + Ch quote = *text; + if (quote != Ch('\'') && quote != Ch('"')) + RAPIDXML_PARSE_ERROR("expected ' or \"", text); + ++text; + + // Extract attribute value and expand char refs in it + Ch *value = text, *end; + const int AttFlags = Flags & ~parse_normalize_whitespace; // No whitespace normalization in attributes + if (quote == Ch('\'')) + end = skip_and_expand_character_refs, attribute_value_pure_pred, AttFlags>(text); + else + end = skip_and_expand_character_refs, attribute_value_pure_pred, AttFlags>(text); + + // Set attribute value + attribute->value(value, end - value); + + // Make sure that end quote is present + if (*text != quote) + RAPIDXML_PARSE_ERROR("expected ' or \"", text); + ++text; // Skip quote + + // Add terminating zero after value + if (!(Flags & parse_no_string_terminators)) + attribute->value()[attribute->value_size()] = 0; + + // Skip whitespace after attribute value + skip(text); + } + } + + }; + + //! \cond internal + namespace internal + { + + // Whitespace (space \n \r \t) + template + const unsigned char lookup_tables::lookup_whitespace[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, // 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1 + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 5 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 7 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // A + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // B + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // C + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // D + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // E + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // F + }; + + // Node name (anything but space \n \r \t / > ? \0) + template + const unsigned char lookup_tables::lookup_node_name[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Text (i.e. PCDATA) (anything but < \0) + template + const unsigned char lookup_tables::lookup_text[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Text (i.e. PCDATA) that does not require processing when ws normalization is disabled + // (anything but < \0 &) + template + const unsigned char lookup_tables::lookup_text_pure_no_ws[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Text (i.e. PCDATA) that does not require processing when ws normalizationis is enabled + // (anything but < \0 & space \n \r \t) + template + const unsigned char lookup_tables::lookup_text_pure_with_ws[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Attribute name (anything but space \n \r \t / < > = ? ! \0) + template + const unsigned char lookup_tables::lookup_attribute_name[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Attribute data with single quote (anything but ' \0) + template + const unsigned char lookup_tables::lookup_attribute_data_1[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Attribute data with single quote that does not require processing (anything but ' \0 &) + template + const unsigned char lookup_tables::lookup_attribute_data_1_pure[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Attribute data with double quote (anything but " \0) + template + const unsigned char lookup_tables::lookup_attribute_data_2[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Attribute data with double quote that does not require processing (anything but " \0 &) + template + const unsigned char lookup_tables::lookup_attribute_data_2_pure[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Digits (dec and hex, 255 denotes end of numeric character reference) + template + const unsigned char lookup_tables::lookup_digits[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 0 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 1 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 2 + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,255,255,255,255,255,255, // 3 + 255, 10, 11, 12, 13, 14, 15,255,255,255,255,255,255,255,255,255, // 4 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 5 + 255, 10, 11, 12, 13, 14, 15,255,255,255,255,255,255,255,255,255, // 6 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 7 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 8 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 9 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // A + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // B + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // C + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // D + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // E + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 // F + }; + + // Upper case conversion + template + const unsigned char lookup_tables::lookup_upcase[256] = + { + // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A B C D E F + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, // 0 + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, // 1 + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, // 2 + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, // 3 + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, // 4 + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, // 5 + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, // 6 + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 123,124,125,126,127, // 7 + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, // 8 + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, // 9 + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, // A + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, // B + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, // C + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, // D + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, // E + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 // F + }; + } + //! \endcond + +} + +// Undefine internal macros +#undef RAPIDXML_PARSE_ERROR + +// On MSVC, restore warnings state +#ifdef _MSC_VER + #pragma warning(pop) +#endif + +#endif diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/lib/rapidxml/rapidxml_iterators.hpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/rapidxml/rapidxml_iterators.hpp --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/lib/rapidxml/rapidxml_iterators.hpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/rapidxml/rapidxml_iterators.hpp 2013-10-31 06:59:44.000000000 +0000 @@ -0,0 +1,175 @@ +#ifndef RAPIDXML_ITERATORS_HPP_INCLUDED +#define RAPIDXML_ITERATORS_HPP_INCLUDED + +// Copyright (C) 2006, 2009 Marcin Kalicinski +// Version 1.13 +// Revision $DateTime: 2009/05/13 01:46:17 $ +//! \file rapidxml_iterators.hpp This file contains rapidxml iterators + +#include +#include "rapidxml.hpp" + +namespace rapidxml +{ + + //! Iterator of child nodes of xml_node + template + class node_iterator + { + + public: + + typedef typename xml_node value_type; + typedef typename xml_node &reference; + typedef typename xml_node *pointer; + typedef std::ptrdiff_t difference_type; + typedef std::bidirectional_iterator_tag iterator_category; + + node_iterator() + : m_node(0) + { + } + + node_iterator(xml_node *node) + : m_node(node->first_node()) + { + } + + reference operator *() const + { + assert(m_node); + return *m_node; + } + + pointer operator->() const + { + assert(m_node); + return m_node; + } + + node_iterator& operator++() + { + assert(m_node); + m_node = m_node->next_sibling(); + return *this; + } + + node_iterator operator++(int) + { + node_iterator tmp = *this; + ++this; + return tmp; + } + + node_iterator& operator--() + { + assert(m_node && m_node->previous_sibling()); + m_node = m_node->previous_sibling(); + return *this; + } + + node_iterator operator--(int) + { + node_iterator tmp = *this; + ++this; + return tmp; + } + + bool operator ==(const node_iterator &rhs) + { + return m_node == rhs.m_node; + } + + bool operator !=(const node_iterator &rhs) + { + return m_node != rhs.m_node; + } + + private: + + xml_node *m_node; + + }; + + //! Iterator of child attributes of xml_node + template + class attribute_iterator + { + + public: + + typedef typename xml_attribute value_type; + typedef typename xml_attribute &reference; + typedef typename xml_attribute *pointer; + typedef std::ptrdiff_t difference_type; + typedef std::bidirectional_iterator_tag iterator_category; + + attribute_iterator() + : m_attribute(0) + { + } + + attribute_iterator(xml_node *node) + : m_attribute(node->first_attribute()) + { + } + + reference operator *() const + { + assert(m_attribute); + return *m_attribute; + } + + pointer operator->() const + { + assert(m_attribute); + return m_attribute; + } + + attribute_iterator& operator++() + { + assert(m_attribute); + m_attribute = m_attribute->next_attribute(); + return *this; + } + + attribute_iterator operator++(int) + { + attribute_iterator tmp = *this; + ++this; + return tmp; + } + + attribute_iterator& operator--() + { + assert(m_attribute && m_attribute->previous_attribute()); + m_attribute = m_attribute->previous_attribute(); + return *this; + } + + attribute_iterator operator--(int) + { + attribute_iterator tmp = *this; + ++this; + return tmp; + } + + bool operator ==(const attribute_iterator &rhs) + { + return m_attribute == rhs.m_attribute; + } + + bool operator !=(const attribute_iterator &rhs) + { + return m_attribute != rhs.m_attribute; + } + + private: + + xml_attribute *m_attribute; + + }; + +} + +#endif diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/lib/rapidxml/rapidxml_print.hpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/rapidxml/rapidxml_print.hpp --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/lib/rapidxml/rapidxml_print.hpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/rapidxml/rapidxml_print.hpp 2013-10-31 06:59:44.000000000 +0000 @@ -0,0 +1,421 @@ +#ifndef RAPIDXML_PRINT_HPP_INCLUDED +#define RAPIDXML_PRINT_HPP_INCLUDED + +// Copyright (C) 2006, 2009 Marcin Kalicinski +// Version 1.13 +// Revision $DateTime: 2009/05/13 01:46:17 $ +//! \file rapidxml_print.hpp This file contains rapidxml printer implementation + +#include "rapidxml.hpp" + +// Only include streams if not disabled +#ifndef RAPIDXML_NO_STREAMS + #include + #include +#endif + +namespace rapidxml +{ + + /////////////////////////////////////////////////////////////////////// + // Printing flags + + const int print_no_indenting = 0x1; //!< Printer flag instructing the printer to suppress indenting of XML. See print() function. + + /////////////////////////////////////////////////////////////////////// + // Internal + + //! \cond internal + namespace internal + { + + /////////////////////////////////////////////////////////////////////////// + // Internal character operations + + // Copy characters from given range to given output iterator + template + inline OutIt copy_chars(const Ch *begin, const Ch *end, OutIt out) + { + while (begin != end) + *out++ = *begin++; + return out; + } + + // Copy characters from given range to given output iterator and expand + // characters into references (< > ' " &) + template + inline OutIt copy_and_expand_chars(const Ch *begin, const Ch *end, Ch noexpand, OutIt out) + { + while (begin != end) + { + if (*begin == noexpand) + { + *out++ = *begin; // No expansion, copy character + } + else + { + switch (*begin) + { + case Ch('<'): + *out++ = Ch('&'); *out++ = Ch('l'); *out++ = Ch('t'); *out++ = Ch(';'); + break; + case Ch('>'): + *out++ = Ch('&'); *out++ = Ch('g'); *out++ = Ch('t'); *out++ = Ch(';'); + break; + case Ch('\''): + *out++ = Ch('&'); *out++ = Ch('a'); *out++ = Ch('p'); *out++ = Ch('o'); *out++ = Ch('s'); *out++ = Ch(';'); + break; + case Ch('"'): + *out++ = Ch('&'); *out++ = Ch('q'); *out++ = Ch('u'); *out++ = Ch('o'); *out++ = Ch('t'); *out++ = Ch(';'); + break; + case Ch('&'): + *out++ = Ch('&'); *out++ = Ch('a'); *out++ = Ch('m'); *out++ = Ch('p'); *out++ = Ch(';'); + break; + default: + *out++ = *begin; // No expansion, copy character + } + } + ++begin; // Step to next character + } + return out; + } + + // Fill given output iterator with repetitions of the same character + template + inline OutIt fill_chars(OutIt out, int n, Ch ch) + { + for (int i = 0; i < n; ++i) + *out++ = ch; + return out; + } + + // Find character + template + inline bool find_char(const Ch *begin, const Ch *end) + { + while (begin != end) + if (*begin++ == ch) + return true; + return false; + } + + /////////////////////////////////////////////////////////////////////////// + // Internal printing operations + + // Print node + template + inline OutIt print_node(OutIt out, const xml_node *node, int flags, int indent) + { + // Print proper node type + switch (node->type()) + { + + // Document + case node_document: + out = print_children(out, node, flags, indent); + break; + + // Element + case node_element: + out = print_element_node(out, node, flags, indent); + break; + + // Data + case node_data: + out = print_data_node(out, node, flags, indent); + break; + + // CDATA + case node_cdata: + out = print_cdata_node(out, node, flags, indent); + break; + + // Declaration + case node_declaration: + out = print_declaration_node(out, node, flags, indent); + break; + + // Comment + case node_comment: + out = print_comment_node(out, node, flags, indent); + break; + + // Doctype + case node_doctype: + out = print_doctype_node(out, node, flags, indent); + break; + + // Pi + case node_pi: + out = print_pi_node(out, node, flags, indent); + break; + + // Unknown + default: + assert(0); + break; + } + + // If indenting not disabled, add line break after node + if (!(flags & print_no_indenting)) + *out = Ch('\n'), ++out; + + // Return modified iterator + return out; + } + + // Print children of the node + template + inline OutIt print_children(OutIt out, const xml_node *node, int flags, int indent) + { + for (xml_node *child = node->first_node(); child; child = child->next_sibling()) + out = print_node(out, child, flags, indent); + return out; + } + + // Print attributes of the node + template + inline OutIt print_attributes(OutIt out, const xml_node *node, int flags) + { + for (xml_attribute *attribute = node->first_attribute(); attribute; attribute = attribute->next_attribute()) + { + if (attribute->name() && attribute->value()) + { + // Print attribute name + *out = Ch(' '), ++out; + out = copy_chars(attribute->name(), attribute->name() + attribute->name_size(), out); + *out = Ch('='), ++out; + // Print attribute value using appropriate quote type + if (find_char(attribute->value(), attribute->value() + attribute->value_size())) + { + *out = Ch('\''), ++out; + out = copy_and_expand_chars(attribute->value(), attribute->value() + attribute->value_size(), Ch('"'), out); + *out = Ch('\''), ++out; + } + else + { + *out = Ch('"'), ++out; + out = copy_and_expand_chars(attribute->value(), attribute->value() + attribute->value_size(), Ch('\''), out); + *out = Ch('"'), ++out; + } + } + } + return out; + } + + // Print data node + template + inline OutIt print_data_node(OutIt out, const xml_node *node, int flags, int indent) + { + assert(node->type() == node_data); + if (!(flags & print_no_indenting)) + out = fill_chars(out, indent, Ch('\t')); + out = copy_and_expand_chars(node->value(), node->value() + node->value_size(), Ch(0), out); + return out; + } + + // Print data node + template + inline OutIt print_cdata_node(OutIt out, const xml_node *node, int flags, int indent) + { + assert(node->type() == node_cdata); + if (!(flags & print_no_indenting)) + out = fill_chars(out, indent, Ch('\t')); + *out = Ch('<'); ++out; + *out = Ch('!'); ++out; + *out = Ch('['); ++out; + *out = Ch('C'); ++out; + *out = Ch('D'); ++out; + *out = Ch('A'); ++out; + *out = Ch('T'); ++out; + *out = Ch('A'); ++out; + *out = Ch('['); ++out; + out = copy_chars(node->value(), node->value() + node->value_size(), out); + *out = Ch(']'); ++out; + *out = Ch(']'); ++out; + *out = Ch('>'); ++out; + return out; + } + + // Print element node + template + inline OutIt print_element_node(OutIt out, const xml_node *node, int flags, int indent) + { + assert(node->type() == node_element); + + // Print element name and attributes, if any + if (!(flags & print_no_indenting)) + out = fill_chars(out, indent, Ch('\t')); + *out = Ch('<'), ++out; + out = copy_chars(node->name(), node->name() + node->name_size(), out); + out = print_attributes(out, node, flags); + + // If node is childless + if (node->value_size() == 0 && !node->first_node()) + { + // Print childless node tag ending + *out = Ch('/'), ++out; + *out = Ch('>'), ++out; + } + else + { + // Print normal node tag ending + *out = Ch('>'), ++out; + + // Test if node contains a single data node only (and no other nodes) + xml_node *child = node->first_node(); + if (!child) + { + // If node has no children, only print its value without indenting + out = copy_and_expand_chars(node->value(), node->value() + node->value_size(), Ch(0), out); + } + else if (child->next_sibling() == 0 && child->type() == node_data) + { + // If node has a sole data child, only print its value without indenting + out = copy_and_expand_chars(child->value(), child->value() + child->value_size(), Ch(0), out); + } + else + { + // Print all children with full indenting + if (!(flags & print_no_indenting)) + *out = Ch('\n'), ++out; + out = print_children(out, node, flags, indent + 1); + if (!(flags & print_no_indenting)) + out = fill_chars(out, indent, Ch('\t')); + } + + // Print node end + *out = Ch('<'), ++out; + *out = Ch('/'), ++out; + out = copy_chars(node->name(), node->name() + node->name_size(), out); + *out = Ch('>'), ++out; + } + return out; + } + + // Print declaration node + template + inline OutIt print_declaration_node(OutIt out, const xml_node *node, int flags, int indent) + { + // Print declaration start + if (!(flags & print_no_indenting)) + out = fill_chars(out, indent, Ch('\t')); + *out = Ch('<'), ++out; + *out = Ch('?'), ++out; + *out = Ch('x'), ++out; + *out = Ch('m'), ++out; + *out = Ch('l'), ++out; + + // Print attributes + out = print_attributes(out, node, flags); + + // Print declaration end + *out = Ch('?'), ++out; + *out = Ch('>'), ++out; + + return out; + } + + // Print comment node + template + inline OutIt print_comment_node(OutIt out, const xml_node *node, int flags, int indent) + { + assert(node->type() == node_comment); + if (!(flags & print_no_indenting)) + out = fill_chars(out, indent, Ch('\t')); + *out = Ch('<'), ++out; + *out = Ch('!'), ++out; + *out = Ch('-'), ++out; + *out = Ch('-'), ++out; + out = copy_chars(node->value(), node->value() + node->value_size(), out); + *out = Ch('-'), ++out; + *out = Ch('-'), ++out; + *out = Ch('>'), ++out; + return out; + } + + // Print doctype node + template + inline OutIt print_doctype_node(OutIt out, const xml_node *node, int flags, int indent) + { + assert(node->type() == node_doctype); + if (!(flags & print_no_indenting)) + out = fill_chars(out, indent, Ch('\t')); + *out = Ch('<'), ++out; + *out = Ch('!'), ++out; + *out = Ch('D'), ++out; + *out = Ch('O'), ++out; + *out = Ch('C'), ++out; + *out = Ch('T'), ++out; + *out = Ch('Y'), ++out; + *out = Ch('P'), ++out; + *out = Ch('E'), ++out; + *out = Ch(' '), ++out; + out = copy_chars(node->value(), node->value() + node->value_size(), out); + *out = Ch('>'), ++out; + return out; + } + + // Print pi node + template + inline OutIt print_pi_node(OutIt out, const xml_node *node, int flags, int indent) + { + assert(node->type() == node_pi); + if (!(flags & print_no_indenting)) + out = fill_chars(out, indent, Ch('\t')); + *out = Ch('<'), ++out; + *out = Ch('?'), ++out; + out = copy_chars(node->name(), node->name() + node->name_size(), out); + *out = Ch(' '), ++out; + out = copy_chars(node->value(), node->value() + node->value_size(), out); + *out = Ch('?'), ++out; + *out = Ch('>'), ++out; + return out; + } + + } + //! \endcond + + /////////////////////////////////////////////////////////////////////////// + // Printing + + //! Prints XML to given output iterator. + //! \param out Output iterator to print to. + //! \param node Node to be printed. Pass xml_document to print entire document. + //! \param flags Flags controlling how XML is printed. + //! \return Output iterator pointing to position immediately after last character of printed text. + template + inline OutIt print(OutIt out, const xml_node &node, int flags = 0) + { + return internal::print_node(out, &node, flags, 0); + } + +#ifndef RAPIDXML_NO_STREAMS + + //! Prints XML to given output stream. + //! \param out Output stream to print to. + //! \param node Node to be printed. Pass xml_document to print entire document. + //! \param flags Flags controlling how XML is printed. + //! \return Output stream. + template + inline std::basic_ostream &print(std::basic_ostream &out, const xml_node &node, int flags = 0) + { + print(std::ostream_iterator(out), node, flags); + return out; + } + + //! Prints formatted XML to given output stream. Uses default printing flags. Use print() function to customize printing process. + //! \param out Output stream to print to. + //! \param node Node to be printed. + //! \return Output stream. + template + inline std::basic_ostream &operator <<(std::basic_ostream &out, const xml_node &node) + { + return print(out, node); + } + +#endif + +} + +#endif diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/lib/rapidxml/rapidxml_utils.hpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/rapidxml/rapidxml_utils.hpp --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/lib/rapidxml/rapidxml_utils.hpp 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/rapidxml/rapidxml_utils.hpp 2013-10-31 06:59:44.000000000 +0000 @@ -0,0 +1,122 @@ +#ifndef RAPIDXML_UTILS_HPP_INCLUDED +#define RAPIDXML_UTILS_HPP_INCLUDED + +// Copyright (C) 2006, 2009 Marcin Kalicinski +// Version 1.13 +// Revision $DateTime: 2009/05/13 01:46:17 $ +//! \file rapidxml_utils.hpp This file contains high-level rapidxml utilities that can be useful +//! in certain simple scenarios. They should probably not be used if maximizing performance is the main objective. + +#include "rapidxml.hpp" +#include +#include +#include +#include + +namespace rapidxml +{ + + //! Represents data loaded from a file + template + class file + { + + public: + + //! Loads file into the memory. Data will be automatically destroyed by the destructor. + //! \param filename Filename to load. + file(const char *filename) + { + using namespace std; + + // Open stream + basic_ifstream stream(filename, ios::binary); + if (!stream) + throw runtime_error(string("cannot open file ") + filename); + stream.unsetf(ios::skipws); + + // Determine stream size + stream.seekg(0, ios::end); + size_t size = stream.tellg(); + stream.seekg(0); + + // Load data and add terminating 0 + m_data.resize(size + 1); + stream.read(&m_data.front(), static_cast(size)); + m_data[size] = 0; + } + + //! Loads file into the memory. Data will be automatically destroyed by the destructor + //! \param stream Stream to load from + file(std::basic_istream &stream) + { + using namespace std; + + // Load data and add terminating 0 + stream.unsetf(ios::skipws); + m_data.assign(istreambuf_iterator(stream), istreambuf_iterator()); + if (stream.fail() || stream.bad()) + throw runtime_error("error reading stream"); + m_data.push_back(0); + } + + //! Gets file data. + //! \return Pointer to data of file. + Ch *data() + { + return &m_data.front(); + } + + //! Gets file data. + //! \return Pointer to data of file. + const Ch *data() const + { + return &m_data.front(); + } + + //! Gets file data size. + //! \return Size of file data, in characters. + std::size_t size() const + { + return m_data.size(); + } + + private: + + std::vector m_data; // File data + + }; + + //! Counts children of node. Time complexity is O(n). + //! \return Number of children of node + template + inline std::size_t count_children(xml_node *node) + { + xml_node *child = node->first_node(); + std::size_t count = 0; + while (child) + { + ++count; + child = child->next_sibling(); + } + return count; + } + + //! Counts attributes of node. Time complexity is O(n). + //! \return Number of attributes of node + template + inline std::size_t count_attributes(xml_node *node) + { + xml_attribute *attr = node->first_attribute(); + std::size_t count = 0; + while (attr) + { + ++count; + attr = attr->next_attribute(); + } + return count; + } + +} + +#endif diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/lib/tinyxml2/CMakeLists.txt xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/CMakeLists.txt --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/tinyxml2/dox xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/dox --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/tinyxml2/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/Makefile.am --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/tinyxml2/readme.md xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/readme.md --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/tinyxml2/setversion.py xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/setversion.py --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/tinyxml2/tinyxml2.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/tinyxml2.cpp --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/tinyxml2/tinyxml2.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/tinyxml2.h --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/tinyxml2/tinyxml2.sln xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/tinyxml2.sln --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/lib/tinyxml2/xmltest.cpp xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/lib/tinyxml2/xmltest.cpp --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/Makefile.am xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/Makefile.am --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/Makefile.am 2012-11-15 21:18:18.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~git20130416.0904-d37ec1d/project/BuildDependencies/scripts/zlib_d.bat xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/project/BuildDependencies/scripts/zlib_d.bat --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/project/BuildDependencies/scripts/zlib_d.bat 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/project/BuildDependencies/scripts/zlib_d.bat 2013-10-31 06:59:44.000000000 +0000 @@ -0,0 +1,13 @@ +@ECHO OFF + +SET LOC_PATH=%CD% +SET FILES=%LOC_PATH%\zlib_d.txt + +CALL dlextract.bat zlib %FILES% + +cd %TMP_PATH% + +xcopy include\* "%CUR_PATH%\include\" /E /Q /I /Y +copy lib\zlib.lib "%CUR_PATH%\lib\" /Y + +cd %LOC_PATH% diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/project/BuildDependencies/scripts/zlib_d.txt xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/project/BuildDependencies/scripts/zlib_d.txt --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/project/BuildDependencies/scripts/zlib_d.txt 1970-01-01 00:00:00.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/project/BuildDependencies/scripts/zlib_d.txt 2013-10-31 06:59:44.000000000 +0000 @@ -0,0 +1,2 @@ +; filename mirror +zlib-vc100-1.2.5-lib.tar.bz2 http://mirrors.xbmc.org/build-deps/win32/ diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/project/VS2010Express/ConfigureAddonXML.bat xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/project/VS2010Express/ConfigureAddonXML.bat --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/project/VS2010Express/xbmc-pvr-addons.sln 2012-11-27 01:00:30.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 @@ -41,72 +41,147 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pvr.argustv", "..\..\addons\pvr.argustv\project\VS2010Express\pvr.argustv.vcxproj", "{8D24D95E-3C4E-4DC5-ABEF-C35C938C2EBB}" 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~git20130416.0904-d37ec1d/README xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/README --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/README 2013-03-12 10:51:22.000000000 +0000 +++ xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/README 2013-10-31 06:59:44.000000000 +0000 @@ -30,6 +30,8 @@ - MythTV addon: Build dependencies: libmysqlclient, boost (headers) Runtime dependencies: libmysqlclient +- IPTV Simple addon: + Build dependencies: zlib ============================= Windows diff -Nru xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/tools/rbp/depends.mk xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/tools/rbp/depends.mk --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/tools/rbp/depends.mk 2012-11-15 21:18:19.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~git20130416.0904-d37ec1d/xbmc/avcodec.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/avcodec.h --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/xbmc/avcodec.h 2012-11-15 21:18:19.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~git20130416.0904-d37ec1d/xbmc/DVDDemuxPacket.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/DVDDemuxPacket.h --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/xbmc/DVDDemuxPacket.h 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/xbmc/libXBMC_addon.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/libXBMC_addon.h --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/xbmc/libXBMC_addon.h 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/xbmc/libXBMC_codec.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/libXBMC_codec.h --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/xbmc/libXBMC_gui.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/libXBMC_gui.h --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/xbmc/libXBMC_gui.h 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/xbmc/libXBMC_pvr.h xbmc-pvr-addons-1.0.0~git20140504.0903-2955e1d/xbmc/libXBMC_pvr.h --- xbmc-pvr-addons-1.0.0~git20130416.0904-d37ec1d/xbmc/libXBMC_pvr.h 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/xbmc/xbmc_addon_cpp_dll.h 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/xbmc/xbmc_addon_dll.h 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/xbmc/xbmc_addon_types.h 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/xbmc/xbmc_epg_types.h 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/xbmc/xbmc_pvr_dll.h 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/xbmc/xbmc_pvr_types.h 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/xbmc/xbmc_scr_dll.h 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/xbmc/xbmc_scr_types.h 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/xbmc/xbmc_vis_dll.h 2013-03-12 10:51:19.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~git20130416.0904-d37ec1d/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~git20130416.0904-d37ec1d/xbmc/xbmc_vis_types.h 2013-03-12 10:51:19.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