pax_global_header00006660000000000000000000000064133756235210014521gustar00rootroot0000000000000052 comment=83aa1e9c588b80cdef9b2bc062e554b7ba2e609d pvr.argustv-3.5.4-Leia/000077500000000000000000000000001337562352100147035ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/.gitignore000066400000000000000000000007161337562352100166770ustar00rootroot00000000000000# build artifacts build/ debian/changelog debian/files debian/kodi-pvr-argustv-dbg.debhelper.log debian/kodi-pvr-argustv-dbg.substvars debian/kodi-pvr-argustv-dbg/ debian/kodi-pvr-argustv.debhelper.log debian/kodi-pvr-argustv.postinst.debhelper debian/kodi-pvr-argustv.postrm.debhelper debian/kodi-pvr-argustv.substvars debian/kodi-pvr-argustv/ debian/tmp/ obj-x86_64-linux-gnu/ pvr.argustv/addon.xml # clion .idea/ # Eclipse/CDT .cproject .project .settings/ pvr.argustv-3.5.4-Leia/.travis.yml000066400000000000000000000022061337562352100170140ustar00rootroot00000000000000language: cpp # # Define the build matrix # # Travis defaults to building on Ubuntu Trusty when building on # Linux. We need Xenial in order to get up to date versions of # cmake and g++. # env: global: - app_id=pvr.argustv matrix: include: - os: linux dist: xenial sudo: required compiler: gcc - os: linux dist: xenial sudo: required compiler: clang - os: osx osx_image: xcode9 - os: osx osx_image: xcode9.4 # # The addon source is automatically checked out in $TRAVIS_BUILD_DIR, # we'll put the Kodi source on the same level # before_script: - cd $TRAVIS_BUILD_DIR/.. - git clone --depth=1 https://github.com/xbmc/xbmc.git - cd ${app_id} && mkdir build && cd build - mkdir -p definition/${app_id} - echo ${app_id} $TRAVIS_BUILD_DIR $TRAVIS_COMMIT > definition/${app_id}/${app_id}.txt - cmake -DADDONS_TO_BUILD=${app_id} -DADDON_SRC_PREFIX=$TRAVIS_BUILD_DIR/.. -DADDONS_DEFINITION_DIR=$TRAVIS_BUILD_DIR/build/definition -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=$TRAVIS_BUILD_DIR/../xbmc/addons -DPACKAGE_ZIP=1 $TRAVIS_BUILD_DIR/../xbmc/cmake/addons script: make pvr.argustv-3.5.4-Leia/CMakeLists.txt000066400000000000000000000046151337562352100174510ustar00rootroot00000000000000project(pvr.argustv) cmake_minimum_required(VERSION 2.6) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}) enable_language(CXX) find_package(Kodi REQUIRED) find_package(kodiplatform REQUIRED) find_package(p8-platform REQUIRED) include_directories(${kodiplatform_INCLUDE_DIRS} ${p8-platform_INCLUDE_DIRS} ${KODI_INCLUDE_DIR} ${PROJECT_SOURCE_DIR}/src) if(NOT WIN32) add_options(ALL_LANGUAGES ALL_BUILDS "-fPIC") endif() # Source files set(ARGUSTV_SOURCES src/activerecording.cpp src/argustvrpc.cpp src/channel.cpp src/client.cpp src/epg.cpp src/EventsThread.cpp src/guideprogram.cpp src/KeepAliveThread.cpp src/pvrclient-argustv.cpp src/recording.cpp src/recordinggroup.cpp src/tools.cpp src/upcomingrecording.cpp src/uri.cpp src/utils.cpp) # Header files set(ARGUSTV_HEADERS src/activerecording.h src/argustvrpc.h src/channel.h src/client.h src/epg.h src/EventsThread.h src/guideprogram.h src/KeepAliveThread.h src/pvrclient-argustv.h src/recording.h src/recordinggroup.h src/tools.h src/upcomingrecording.h src/uri.h src/utils.h) source_group("Header Files" FILES ${ARGUSTV_HEADERS}) if(WIN32) # Misc files set(RESOURCE_FILES pvr.argustv/addon.xml pvr.argustv/changelog.txt pvr.argustv/resources/settings.xml pvr.argustv/resources/language/resource.language.en_gb/strings.po) source_group("Resource Files" FILES ${RESOURCE_FILES}) endif(WIN32) # Make sure that CMake adds the headers to the MSVC project list(APPEND ARGUSTV_SOURCES ${ARGUSTV_HEADERS}) set(DEPLIBS ${p8-platform_LIBRARIES} tsreader) find_package(JsonCpp REQUIRED) list(APPEND DEPLIBS ${JSONCPP_LIBRARIES}) list(APPEND INCLUDES ${JSONCPP_INCLUDE_DIRS}) include_directories(${INCLUDES}) add_subdirectory(src/lib/tsreader) build_addon(pvr.argustv ARGUSTV DEPLIBS) include(CPack) pvr.argustv-3.5.4-Leia/FindJsonCpp.cmake000066400000000000000000000006641337562352100200700ustar00rootroot00000000000000find_package(PkgConfig) if(PKG_CONFIG_FOUND) pkg_check_modules (JSONCPP jsoncpp) endif() if(NOT JSONCPP_FOUND) find_path(JSONCPP_INCLUDE_DIRS json/json.h PATH_SUFFIXES jsoncpp) find_library(JSONCPP_LIBRARIES jsoncpp) endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(JsonCpp DEFAULT_MSG JSONCPP_LIBRARIES JSONCPP_INCLUDE_DIRS) mark_as_advanced(JSONCPP_INCLUDE_DIRS JSONCPP_LIBRARIES) pvr.argustv-3.5.4-Leia/Jenkinsfile000066400000000000000000000000161337562352100170640ustar00rootroot00000000000000buildPlugin() pvr.argustv-3.5.4-Leia/README.md000066400000000000000000000015451337562352100161670ustar00rootroot00000000000000[![Build Status](https://travis-ci.org/kodi-pvr/pvr.argustv.svg?branch=master)](https://travis-ci.org/kodi-pvr/pvr.argustv) [![Coverity Scan Build Status](https://scan.coverity.com/projects/5120/badge.svg)](https://scan.coverity.com/projects/5120) # ARGUS TV PVR ARGUS TV PVR client addon for [Kodi] (http://kodi.tv) ## Build instructions ### Linux 1. `git clone https://github.com/xbmc/xbmc.git` 2. `git clone https://github.com/kodi-pvr/pvr.argustv.git` 3. `cd pvr.argustv && mkdir build && cd build` 4. `cmake -DADDONS_TO_BUILD=pvr.argustv -DADDON_SRC_PREFIX=../.. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../../xbmc/addons -DPACKAGE_ZIP=1 ../../xbmc/cmake/addons` 5. `make` ##### Useful links * [Kodi's PVR user support] (http://forum.kodi.tv/forumdisplay.php?fid=167) * [Kodi's PVR development support] (http://forum.kodi.tv/forumdisplay.php?fid=136) pvr.argustv-3.5.4-Leia/debian/000077500000000000000000000000001337562352100161255ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/debian/changelog.in000066400000000000000000000002651337562352100204070ustar00rootroot00000000000000kodi-pvr-argustv (#PACKAGEVERSION#-#TAGREV#~#DIST#) #DIST#; urgency=low [ kodi ] * autogenerated dummy changelog -- Nobody Sat, 01 Jun 2013 00:59:22 +0200 pvr.argustv-3.5.4-Leia/debian/compat000066400000000000000000000000021337562352100173230ustar00rootroot000000000000009 pvr.argustv-3.5.4-Leia/debian/control000066400000000000000000000012171337562352100175310ustar00rootroot00000000000000Source: kodi-pvr-argustv Priority: extra Maintainer: Arne Morten Kvarving Build-Depends: debhelper (>= 9.0.0), cmake, libkodiplatform-dev (>= 16.0.0), kodi-addon-dev, libjsoncpp-dev Standards-Version: 3.9.4 Section: libs Homepage: Package: kodi-pvr-argustv Section: libs Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: ArgusTV PVR for Kodi ArgusTV PVR for Kodi Package: kodi-pvr-argustv-dbg Section: libs Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: debug symbols for ArgusTV PVR for Kodi debug symbols for ArgusTV PVR for Kodi pvr.argustv-3.5.4-Leia/debian/copyright000066400000000000000000000027511337562352100200650ustar00rootroot00000000000000Format: http://dep.debian.net/deps/dep5 Upstream-Name: pvr.argustv Source: Files: * Copyright: License: . # If you want to use GPL v2 or later for the /debian/* files use # the following clauses, or change it to suit. Delete these two lines Files: debian/* Copyright: 2013 Arne Morten Kvarving License: GPL-2+ This package 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 package 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 . On Debian systems, the complete text of the GNU General Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". # Please also look if there are files or directories which have a # different copyright/license attached and list them here. pvr.argustv-3.5.4-Leia/debian/kodi-pvr-argustv.install000066400000000000000000000000261337562352100227370ustar00rootroot00000000000000usr/lib/* usr/share/* pvr.argustv-3.5.4-Leia/debian/rules000077500000000000000000000013401337562352100172030ustar00rootroot00000000000000#!/usr/bin/make -f # -*- makefile -*- # Sample debian/rules that uses debhelper. # This file was originally written by Joey Hess and Craig Small. # As a special exception, when this file is copied by dh-make into a # dh-make output file, you may use that output file without restriction. # This special exception was added by Craig Small in version 0.37 of dh-make. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 %: dh $@ override_dh_auto_configure: dh_auto_configure -- -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=1 -DCMAKE_INSTALL_PREFIX=/usr -DUSE_LTO=1 override_dh_strip: dh_strip -pkodi-pvr-argustv --dbg-package=kodi-pvr-argustv-dbg override_dh_installdocs: dh_installdocs --link-doc=kodi-pvr-argustv pvr.argustv-3.5.4-Leia/debian/source/000077500000000000000000000000001337562352100174255ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/debian/source/format000066400000000000000000000000151337562352100206340ustar00rootroot000000000000003.0 (native) pvr.argustv-3.5.4-Leia/depends/000077500000000000000000000000001337562352100163255ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/depends/common/000077500000000000000000000000001337562352100176155ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/depends/common/jsoncpp/000077500000000000000000000000001337562352100212715ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/depends/common/jsoncpp/CMakeLists.txt000066400000000000000000000010201337562352100240220ustar00rootroot00000000000000project(jsoncpp) cmake_minimum_required(VERSION 3.1) enable_language(CXX) SET(CMAKE_CXX_STANDARD 11) SET(CMAKE_CXX_STANDARD_REQUIRED ON) SET(CMAKE_CXX_EXTENSIONS OFF) set(SOURCES src/lib_json/json_reader.cpp src/lib_json/json_value.cpp src/lib_json/json_writer.cpp) include_directories(${PROJECT_SOURCE_DIR}/include) add_library(jsoncpp ${SOURCES}) install(TARGETS jsoncpp DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) install(DIRECTORY include/json DESTINATION ${CMAKE_INSTALL_PREFIX}/include/jsoncpp) pvr.argustv-3.5.4-Leia/depends/common/jsoncpp/jsoncpp.sha256000066400000000000000000000001011337562352100236670ustar00rootroot000000000000003671ba6051e0f30849942cc66d1798fdf0362d089343a83f704c09ee7156604f pvr.argustv-3.5.4-Leia/depends/common/jsoncpp/jsoncpp.txt000066400000000000000000000001071337562352100235040ustar00rootroot00000000000000jsoncpp http://mirrors.kodi.tv/build-deps/sources/jsoncpp-1.8.3.tar.gz pvr.argustv-3.5.4-Leia/pvr.argustv/000077500000000000000000000000001337562352100172045ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/addon.xml.in000066400000000000000000000763101337562352100214270ustar00rootroot00000000000000 @ADDON_DEPENDS@ Kodi voorprogram vir die ARGUS TV PVR http://www.argus-tv.com// Kodi frontend for the ARGUS TV PVR http://www.argus-tv.com// Клиент за ПВР „ARGUS TV“ – http://www.argus-tv.com// Frontal de Kodi per al PVR ARGUS TV http://www.argus-tv.com// Rozhraní Kodi pro nahrávač videa ARGUS TV http://www.argus-tv.com/ Pen blaen Kodi ar gyfer ARGUS TV PVR http://www.argus-tv.com// Kodi frontend til ARGUS TV PVR http://www.argus-tv.com// Kodi Oberfläche für ARGUS TV PVR http://www.argus-tv.com// Frontend του Kodi για το ARGUS TV PVR http://www.argus-tv.com/ Kodi frontend for the ARGUS TV PVR http://www.argus-tv.com// Kodi frontend for the ARGUS TV PVR http://www.argus-tv.com// Kodi frontend for the ARGUS TV PVR http://www.argus-tv.com// Kodi frontend for the ARGUS TV PVR http://www.argus-tv.com/ Frontend de Kodi para ARGUS TV PVR http://www.argus-tv.com// Frontend de Kodi para ARGUS TV PVR http://www.argus-tv.com// Frontend de Kodi para ARGUS TV PVR http://www.argus-tv.com// Kodi liides ARGUS TV PVR'ile http://www.argus-tv.com// Kodiren interfazea ARGUS TV PVRrako http://www.argus-tv.com// Kodin ARGUS TV -asiakasohjelma http:/www.argus-tv.com/ Frontale Kodi pour le numériscope ARGUS TV http://www.argus-tv.com/ Interface logicielle pour l'enregistreur vidéo (PVR) ARGUS TV http://www.argus-tv.com/ Interface de Kodi para o PRV de ARGUS TV http://www.argus-tv.com// לקוח טלוויזיה חיה עבור ARGUS TV מהכתובת http://www.argus-tv.com Kodi pozadinski softver za ARGUS TV PVR http://www.argus-tv.com// Kodi előtét az ARGUS TV-hez http://www.argus-tv.com// Kodi արտաքին տեսքը ARGUS TV PVR համար http://www.argus-tv.com// Antarmuka Kodi untuk ARGUS TV PVR http://www.argus-tv.com// Kodi framendi fyrir ARGUS TV upptökutæki (PVR) http://www.argus-tv.com// Frontend Kodi di ARGUS TV PVR http://www.argus-tv.com// ARGUS TV PVR 用 Kodi フロントエンド http://www.argus-tv.com// ARGUS TV PVR을 위한 Kodi 프론트엔드 http://www.argus-tv.com// Kodi sąsaja su ARGUS TV PVR http://www.argus-tv.com// Kodi galasistēma ARGUS TV PVR http://www.argus-tv.com// Kodi интерфејс за ARGUS TV PVR http://www.argus-tv.com// Bahagian hadapan Kodi untuk PVR ARGUS TV http://www.argus-tv.com// Faċċata tal-Kodi għall- ARGUS TV PVR http://www.argus-tv.com// Kodi-grenseflate til ARGUS TV-PVR http://www.argus-tv.com/ Kodi frontend voor het ARGUS-TV PVR http://www.argus-tv.com/ Klient telewizji dla ARGUS TV http://www.argus-tv.com// Frontend do Kodi para o PVR ARGUS TV http://www.argus-tv.com// Interface Kodi para ARGUS TV PVR http://www.argus-tv.com// Interfața Kodi pentru PVR-ul ARGUS TV http://www.argus-tv.com/ Интерфейс Kodi для ARGUS TV PVR http://www.argus-tv.com// TV PVR ආරක්ෂාව සඳහා Kodi ඉදිරි කොන http://www.argus-tv.com// Kodi rozhranie pre ARGUS TV PVR http://www.argus-tv.com// Kodijev vmesnik za ARGUS TV PVR http://www.argus-tv.com// Kodi frontend për ARGUS TV PVR http://www.argus-tv.com & Kodi интерфејс за ARGUS ТВ PVR http://www.argus-tv.com// Kodi interfejs za ARGUS TV PVR http://www.argus-tv.com// Kodi frontend för ARGUS TV PVR http://www.argus-tv.com// Klijynt dlŏ ARGUS TV PVR http://www.argus-tv.com// ARGUS TV PVR için Kodi ön ucu http://www.argus-tv.com// Накладка Kodi для ARGUS TV PVR http://www.argus-tv.com// Giao tiếp Kodi cho ARGUS TV PVR http://www.argus-tv.com/ Kodi 的 ARGUS TV PVR 前端 http://www.argus-tv.com// ARGUS TV PVR 'http://www.argus-tv.com//' 可使用的Kodi前端 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“. Поддържа телевизия на живо и записване, слушане на радио канали, електронен програмен справочник и графици. Frontal del PVR ARGUS TV. És compatible amb les transmissions en línia de TV en directe i enregistraments, escolta d'emissores de ràdio, guia electrònica de programació (EPG) i programacions. Rozhraní ARGUS TV PVR. Podporuje streamování živého vysílání a nahrávání, poslech kanálů rádia, televizní program a plánování. Pen blaen ARGUS TV PVR. Mae'n cynnal ffrydio Teledu Byw a Recordiadau, gwrando ar sianeli Radio ac Amserlenni Rhaglenni Electronig. ARGUS TV PVR frontend'en understøtter streaming af direkte TV og optagelser, lytning til radiokanaler, EPG og tidsplaner. 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. 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 (GEP) 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. Frontend de ARGUS TV PVR. Soporta transmisiones de TV en vivo y grabaciones, escuchar canales de Radio, Guía Electrónica de Programas y temporizadores. ARGUS TV PVR'i liides. Toetab telekanalite striimimist ja salvestamist, raadio kuulamist ja elektroonilist saatekava. ARGUS TV PVR interfazea. Ondokoa ahalbidetzen du: zuzeneko telebistaren streaming-a eta grabazioak, irrati kateak entzutea, PGEa eta programatzeko egutegiak. ARGUS TV -asiakasohjelma. Tukee suoria tv-lähetyksiä, tallentamista, radiokanavia ja ohjelmaopasta. Frontale de numériscope pour ARGUS TV, prenant en charge la diffusion en continu des télés en direct et les enregistrements, l’écoute de chaînes radio, le GÉP et les horaires. Interface logicielle pour l'enregistreur vidéo (PVR) ARGUS TV. Gère la diffusion de la TV en direct, l'enregistrement, l'écoute de radios, le guide électronique des programmes TV et les programmations. Interface do PVR de ARGUS TV. Soporta transmisión de TV en directo e Gravacións, escoita de canles de radio, Guía e programacións. לקוח טלוויזיה חיה של ARGUS 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ét. Élő adások, felvételek és rádiócsatornák támogatása, EPG-vel és időzítésekkel. ARGUS TV PVR արտաքին տեսքը: TV հիմա, Ձայնագրություններ, Ռադիո ալիքների ունկնդրում, EPG և ժամանակացույցի հնարավորություն: Antarmuka PVR ARGUS TV. Mendukung streaming TV dan Rekaman langsung, mendengarkan kanal radio, EPG dan jadwal. ARGUS TV framendi; styður streymingu á beinum útsendingum og upptökum, hlustun á útvarpsstöðvar sjónvarpsvísum (EGP) og dagskráryfirlitum. 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. Faċċata tal- ARGUS TV PVR. Jiflaħ għal streaming ta' TV Lajv u Rekordings, smiegħ ta' stazzjonijiet tar- Radju, EPG u skedi. ARGUS TV PVR-klientdel Støtter visning av direkte-TV, opptak, lytting til radiokanaler, EPG og tidsopptak. ARGUS TV PVR frontend. Ondersteunt het bekijken van Live-TV en opnames, het beluisteren van radiozenders, het tonen van de EPG en het inplannen/beheren van nieuwe opnames (Timers). Klient telewizji dla ARGUS TV obsługuje transmisję kanałów radiowych i telewizyjnych, nagrywanie i harmonogram nagrań oraz funkcje przewodnika telewizyjnego. Frontend do PVR ARGUS TV. Suporta streaming de TV Local & Gravações, sintonização de canais de Rádio, guia de programação eletrônica (GPE) e agendamento. Interface ARGUS TV PVR. Suporta transmissão e gravação de TV em direto, audição de estações de rádio, EPG e agendamentos. 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. Поддерживает просмотр потокового ТВ и видеозаписей, прослушивание радиоканалов и работу с электронным телегидом и расписаниями. ආරක්ෂක TV PVR ඉදිරිකොන. සජීව රූපවාහිනී සහ පටිගත කිරීම්, ගුවන් විදුලි නාලිකාවට සවන් දීම, EPG සහ උපලේඛණ සඳහා ප්‍රවාහන උදව් ලබා දීම. ARGUS TV PVR rozhranie. Podporuje streamovanie živého TV vysielania a nahrávanie, počúvanie rozhlasových kanálov, EPG a naplánované nahrávanie. 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 ТВ PVR интерфејс. Подржава стримовање ТВ Уживо & Снимака, слушање Радио канала, EPG и распореде. ARGUS TV PVR interfejs. Podržava strimovanje TV Uživo & Snimaka, slušanje Radio kanala, EPG i rasporede. ARGUS TV PVR frontend. Stödjer strömmning av Live-TV & inspelningar, lyssna på radiokanaler, EPG och schemaläggning. Klijynt telewizyjny dlŏ ARGUS TV PVR podpiyrŏ szpricowanie kanałōw radyjowych i telewizyjnych, nagrowanie aji funkcyje EPG. ARGUS TV PVR ön ucu. Canlı TV akışı ve kayıt yapabilme, radyo kanalları dinleme, EPG ve zamanlayıcıları destekler. Накладка для 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.. Тази програма е нестабилна! Авторите не носят отговорност за неуспешно записване, некоректни броячи, пропиляно време и други нежелани ефекти. Aquest és programari inestable! Els autors no són de cap manera responsables dels enregistraments que fallin, temporitzadors incorrectes, hores perdudes, o qualsevol altre efecte indesitjat.. Tento software není stabilní! Autoři nejsou žádným způsobem zodpovědní za neúspěšná nahrávání, chybné časovače, ztracený čas nebo jakékoliv jiné nežádoucí výsledky… Mae'r feddalwedd hon yn ansefydlog! Nid yw'r awduron yn gyfrifol mewn unrhyw ffordd am fethu recordio, amseru gwallus, oriau wedi eu gwastraffu, nac effeithiau annymunol 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.. 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 por grabaciones fallidas, temporizadores incorrectos, horas perdidas, o cualquier otro efecto no deseado.. ¡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. ¡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, vale taimeri, raisatud aja ega muude soovimatute asjade eest. Software hau ezegonkorra da! Egilea ez da arduratzen grabazio-erroreetaz, kronometro-erroreetaz, ordu galduetaz edo beste edozein ondorio ezerosoetaz. Tämä on epävakaa ohjelma! Sen tekijät eivät ole millään muotoa vastuussa epäonnistuneista tallennuksista, virheellisistä ajastuksista, haaskatusta ajasta, verenpaineen noususta tai mistään muusta epäsuotuisasta vaikutuksesta. 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. Logiciel en cours d'élaboration ! Les auteurs ne sont en aucun cas responsables de l'échec des enregistrements, programmations défectueuses, temps perdu ou autres effets indésirables. Software non estable! Os autores non se fan responsábeis dos erros nas 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 á engan 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. これは不安定なソフトウェアです!本プログラムの作者は、録画の失敗、正確に作動しなかったタイマー、無駄にした時間、その他あらゆる好ましくない結果について責任を負わないものとします。 이 소프트웨어는 불안정합니다! 제작자는 녹화 실패, 부정확한 타이머, 시간 낭비 및 기타 예상하지 못한 결과에 대해 책임지지 않습니다.. 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](Kodi.lt siūlo/rekomenduoja testuojant šį priedą persijungti į Anglų [orinali] kalbą)[/COLOR] Šī ir nestabila programmatūra! Autori nav 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.. Dan il-programm mhuwiex stabbli! L-Awturi m'humiex responsabbli bl-ebda mod għal rekordings li ma jirnexxewx, arloġġi żbaljati, siegħat moħlija, jew kwalunkwe effett ieħor mhux mixtieq. Dette er ustabil programvare! Skaperne har på ingen måte ansvar for ødelagte opptak, feilstilte tidsur, bortkastede timer, eller andre uønskede effekter… Deze software is niet 100% stabiel! De auteurs zijn op geen enkele wijze aansprakelijk voor mislukte opnames, verspilde tijd, of enig ander ongewild neveneffect. Oprogramowanie nadal jest w fazie rozwoju i jest niestabilne! Autorzy w żaden sposób nie są odpowiedzialni za nieudane nagrania, błędy w harmonogramie nagrań, zmarnowany czas ani jakiekolwiek inne niepożądane efekty. 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. Este software é instável! Os autores não podem ser responsabilizados por gravações falhadas, temporizadores incorretos, horas desperdiçadas ou qualquer outro tipo de 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, nesprávne časovače alebo iné neželané udalosti.. 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. Овај софтвер је нестабилан! Аутори ни на који начин нису одговорни за неуспела снимања, неисправне тајмере, изгубљене сате, или било које друге нежељене ефекте. Ovaj softver je nestabilan! Autori ni na koji način nisu odgovorni za neuspela snimanja, neispravne tajmere, izgubljene sate, ili bilo koje druge neželjene efekte. 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.. To je niystabilny softwer! Autōry niy sōm ôdpedzialne za niypodarzōne graniy, niynŏleżne godziny EPG, stracōne godziny i inksze niychciane efekty. ఇది అస్థిర సాఫ్ట్వేర్! విఫలమైన రికార్డింగ్లు, తప్పు టైమర్లు, వృధా గంటల, లేదా ఏ ఇతర అవాంఛనీయ ప్రభావాలకు ఏ విధంగా రచయితలు భాద్యుతులు కారు. Ин нармафзори ноустувор аст! Муаллифон барои вайрониҳои сабт, вақтсанҷҳои нодуруст, соатҳои бефоида ва дигар таъсирҳои номатлуб ҷавобгар намебошанд. นี่คือโปรแกรมที่ยังไม่เสถียร! ผู้เขียนไม่อยู่ในทางที่จะรับผิดชอบในการบันทึกที่ล้มเหลว, การตั้งเวลาที่ไม่ถูกต้อง, การเสียเวลา, หรือผลกระทบที่ไม่พึงประสงค์อื่น ๆ.. Bu kararsız bir yazılımdır! 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.. 这是不稳定版的软件!作者不对录像失败、错误定时造成时间浪费或其它不良影响负责。 這是測試版軟體!其原創作者並無法對於以下情況負責,包含:錄影失敗,不正確的定時設定,多餘時數,或任何產生的其它不良影響... @PLATFORM@ pvr.argustv-3.5.4-Leia/pvr.argustv/changelog.txt000066400000000000000000000250311337562352100216750ustar00rootroot00000000000000v3.5.0 - Update to PVR addon API v5.10.0 v3.4.2 - Update to PVR addon API v5.9.0 v3.4.0 - Update to PVR addon API v5.8.0 v3.3.3 - Change to non deprecated jsoncpp methods v3.3.2 - Use account info for smb shares if added in settings v3.3.1 - Bump jsoncpp to version 1.8.3 v3.3.0 - Update to PVR addon API v5.7.0 v3.2.0 - Update to PVR addon API v5.5.0 - Get rid of StdString - Fix uwp build v3.1.0 - Update to PVR addon API v5.3.0 v3.0.4 (22-05-2017) - Remove of never used addon interface function v3.0.3 (17-05-2017) - Update Debian package control - PVR addon callback way changes v3.0.2 (16-05-2017) - Removed old no more needed version functions v3.0.1 (12-05-2017) - Language updates - Set dependency versions automatic during build - Removed never used kodi to addon functions - Build system fixes v3.0.0 (05-12-2016) - Initial Kodi v18 version v2.5.0 (20-09-2016) - Correct PVR API reference to v5.2.0 - Disable unsubscribing from events (at least for v17 Krypton) Allows clean exiting of Kodi v2.4.2 (20-08-2016) - Updated language files from Transifex v2.4.1 (18-06-2016) - Updated language files from Transifex v2.4.0 (18-05-2016) - Cmake: rename find_package kodi to Kodi v2.3.0 (13-05-2016) - Update to PVR addon API v5.2.0 - Fix includes v2.2.0 (08-03-2016) - Update to PVR addon API v5.1.0 v2.1.0 (14-02-2016) - Update to PVR addon API v5.0.0 v2.0.1 (23-01-2016) - Updated language files from Transifex v2.0.0 (17-01-2016) - Initial Kodi Krypton version. v1.11.9 (10-01-2016) - Updated language files from Transifex v1.11.8 (03-01-2016) - Updated language files from Transifex v1.11.7 (08-12-2015) - Updated language files from Transifex v1.11.6 (19-09-2015) - Update to PVR addon API v4.1.0 v1.11.5 (09-09-2015) - Updated to PVR API v4.0.0 v1.11.4 (04-08-2015) - Updated to PVR API v3.0.0 (API 1.9.7 compatibility mode) v1.11.3 (19-07-2015) - Updated to PVR API v2.1.0 - Automatically fill in platform and library name v1.11.2 (17-07-2015) - Debian packaging: fix library install path - Miscellaneous backend fixes v1.11.1 (04-07-2015) - Updated to PVR API v2.0.0 v1.11.0 (03-07-2015) - Updated to PVR API v1.9.7 v1.10.9 (29-06-2015) - Coverity fixes v1.10.8 (28-06-2015) - Updated language files from Transifex v1.10.7 (11-04-2015) - Added option for all recordings to be in folders v1.10.6 (04-05-2015) - Updated to use new libplatform-dev v1.10.5 (09-04-2015) - Fix race condition on Channel GUID cache v1.10.4 (28-03-2015) - Updated to PVR API v1.9.6 v1.10.3 (14-03-2015) - TSReader: attempt to fix a crash on RPi due to xbmc/xbmc#6306 This PR introduced a 2nd FileReader class in Kodi which conflicts with the PVR addon one... The PVR FileReader class is now inside an ArgusTV namespace v1.10.2 (08-03-2015) - Updated to PVR API v1.9.5 v1.10.1 (17-02-2015) - Updated to PVR API v1.9.4 v1.9.189 (21-01-2015) - Updated language files from Transifex - Minor changes to conform with C++11 v1.9.188 (13-01-2015) - Updated language files from Transifex v1.9.187 (28-12-2014) - added getBackendHostname function v1.9.186 (27-12-2014) - Fixed mime-type for MPEG-TS v1.9.185 (02-12-2014) - Updated language files from Transifex v1.9.184 (26-11-2014) - change library name to Kodi v1.9.183 (12-11-2014) - fixed deadlock when activating the addon on some darwin (osx, ios) runtimes v1.9.182 (11-11-2014) - Updated language files from Transifex v1.9.181 (10-11-2014) - Updated language files from Transifex v1.9.180 (03-09-2014) - Updated to API v1.9.2 v1.9.178 (01-07-2014) - Updated language files from Transifex v1.9.177 (01-05-2014) - fill initial last played position for recordings 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) - EPG genre will contain the ARGUS TV "Category" string. v1.6.163 (01-01-2013) - Updated language files from Transifex v1.6.162 (15-12-2012) - Updated language files from Transifex v1.6.161 (12-12-2012) - New version number by Team XBMC v1.6.160.145 (11-12-2012) - Support ARGUS TV channel numbers on XBMC, switch on: Settings / Live-TV / General / "Use backend channels..." and "Always use the channel order..." - New version number by Team XBMC v1.0.150.144 (18-11-2012) - First ARGUS TV implementation - Support XBMC play count v1.0.150.143 (03-11-2012) - Bump version to 1 for Frodo :) - Version number: major.minor.apiversion.buildnumber - Fully supports setting and retrieving lastplayed position on the FTR server for recordings - Support Timer conflict notification - Add episode name to epg title - Credit Team Mediaportal for original TsReader code v0.0.1.142 (06-09-2012) - Use the XBMC lifetime setting for a recording when possible - Now can delete scheduled recordings/programs on the FTR server that were created by other clients - At startup try to connect to FTR for 30 seconds, This fixes startup problems on linux systems where the add-on is started before the network interface is up (eg. OpenElec) - Notify user when no free tuner is found, channel is scrambled etc. - Shorter keep-alive delay to fix loosing Live-TV in certain cases v0.0.1.141 (04-09-2012) - Updated to Frodo PVR API - Add timeshift support for Frodo v0.0.1.140 (03-06-2012) - Fixed deletion of recordings due to api change - Fixed instant-record failed due to start time set to 1970 by XBMC v0.0.1.138 (02-06-2012) - Full support for timeshift implemented in the add-on v0.0.1.137 (18-05-2012) - Fixed playing recording with national characters in names on Windows v0.0.1.136 (01-05-2012) - Aggressively optimised TsReader class - Added new configurable delay in milliseconds after tuning a channel v0.0.1.135 (12-04-2012) - Small regression fixes after switch to new platform library When ForTheRecord returns 'NoRetunePossible' close the current live stream and then try to tune again v0.0.1.134 (07-04-2012) - Internal change: Switch to new platform library for threading and lock mechanisms 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 pvr.argustv-3.5.4-Leia/pvr.argustv/icon.png000066400000000000000000001534341337562352100206540ustar00rootroot00000000000000PNG  IHDR?1IDATxknQt3眹IfP (`Kd.PĦ!W $NR؎q,"$D [\$0&ɺnFs̙sΏ^k#}RM=߽DmMDTRٶMGU_Z5P$n*T.acڵ?PI筱k|T5rޗ .D{Zn"3}*,m\ؖ3X]_kȯ|vU/˻T__yoMPl)JnL*U U[[n{{mr=[oe&*Pp ۨmSoc~Vo͈m"p^.i}$l-y XAN(R\S8E1 UUԮSm̰\"ŲyuyzXUmΦ$;%KD Y ̍ml?ljw&?su5ھ6fF\gؖ-e<|,1/Gͅjgv4jb5A"jj%ELH%I $ X#ԠR`gI,ޤw`"`{_fUǓ垜wb#H] ndKjlŖ,Q܏+̬=A9}sGǀr{gv[o`=fwUTa<<[@K̛ؿ)0|(v\@mۈؔ=y5P˛%ms.kTcPoB"`.ɖɖ=o"Xf<k?qr#;?&|v}w_* 0;CT}a[wW WKE-c訡FkHNV(ymJEjaG>pkfGl[QAgA5N*/0ڡal/=\|"Bﴞ g?Э?Bu/\{E/w.>1 PRB)"Ƃ`Pˆ ^B PU/(s1jz79\bft=W㹴({̬bS/I$҉UR߇bcXIe%2k!GZul0]ED2.54Cre+Hz7s6P@܂z<)13V=x3̑іmy/0 T1_v]ғWU# 0^ @K0lc21̢H#K$D\snĈ1}wnL  DtOlh},xB׍J W&8XDUPGtSap W@]6<3cag)%3 AHGB eɗWy[j/hI;f5wE2I,V0X?Ogrk[x1n#lS-AXYN@L Ŝ$rلD-~fO$j"GTi<ƺA?uPMx1T7c LkPE#VG U(Tei碱nKvd̪m;>-Hx:hAH}otRQ=vƱx0J\u 5Nt{ZTot-ϗnܒuTı_96Kq]|5-ރy.%SKBISiQHﶂ QY3fudH,ЇTUx!V S[mFxʤش&UDQ儲}$\^ "C52ŗ'eunHNT--$u ){s1{.Ð?t"T\NsO9mv$Xl,HEF/}#ԋx9J$"n2AbC[q]L6:U& |6o5o fD&S|#3DUk OfG/3*;T(vVУPfGr,oAfwX(lX?@F}ޅ$_yD΍-ZТ^"&>ulIxT+ Fe5fRl~e2%cRq# Zi,[Ќ!_ñX;@kL$*vn$sp*,/ ޱU x>1`=0E%JwǬQk,2&VGXާذ>Dߊ %6H`Ah$cLo,;Rr3Y"n5. I,Kh,੭%uJ ϫm!.yy'tlA/;++cC -d! pQl"k %@ )ߞA0f\FF/P1^߶fKE+M`D^Hi{BDUAYĝzmO}u1G"2-T T/P E^Hm:QugI;h/Ғ$kn].21X#$y e/O9{YzBU+:"b6"%C;5"]R8Z}TgaBDԼٮ7T[!gO  4 ^d.ݖAS|@Ay!%AF`әB%"U"`Z`؉XM,`qF AI a(I#FAܔyY?8*5F^dA06 ,z`W.h]dGt`eSS&5̨lJQ6Ød8U ;B-fU&EGt\/c8J ۞4gr1rmk.M!@T GBτLAr6]ŐeHWqp2ֱ|+tYI<#ԉQ 8=5}WZ-dKVZ z!`3L68 00hb>gu]8 GK-qXl,d)0$ضUUHKT{j0MM!4T8IфBpԲ#Y ,lm\'"Gյ[ XaD"ޥmcwP2Q7M {9cA۶mlJ@E/nb%JڶuMG-@*[wD]ni0H Dr*"yDDDHY*Hd=/uPcr&(fWɸt9%pؽ jVNUx=Kp,'nMnˡL \Gf#t􀊵2\nMx09pXy RX&?Awۑ~ FLPِGvTkv3|pE~f2#3}宮A3QbL \t! U;gaư{5=鐌BwWY"aj"}#-¶"]fF-^~^x"&Z@, #Qo5;Zk۶ E{`&(2I~/tU!jfLb̗R+!B: 7, ocMaV0NC.Tm[Na:k@C F=w[`©HFˡ]R9y~B*Lu%H=-;< WVMv3T:aIr4wnI-DQG JЀ؊iöK)f(8n "*K͌ P4q"1+1Ԝ@ܔp%(1i -og{;E<~*trKeYh1[KkM>Eևՙ#Q ;F"UY`h&G'1 aq. r7Ҹ5b;48S~5H@iХ,w"PWaQH}D/&ۮp 6 `'齋n &Q* BlUYճw'!x| v Qш-3D{"B'̨*056MZ۳t#\ SDTgk6Q稂A1 KmvTq:" :!͕ Pi@ONN1+F2*!F5 Ue|5nء T׆`pa"&HwpmQIV\n-fs1B%&0Cw#)<$ uOOaGf+a}SfU2E&RpN3_퐱\5dƺd Jr niz2m L7*ku\=Ćr =B.02ϨA.j2w Pf ђ GBV=SJn9,9[܈0 ~l.5a]Pwst(ict+B0 w3u0ŅOsj4Oq$I5g0h7 "RK5\'Ὤcq.ilO#߰\^DRFC/?zqq#τTd|2 'rBըNL~x5#*Q͇uUbp`Ӎm`ALjyztCb&l&P?'%@_XG=]gF$6g<_cpDG Ac^V.=Xּ@d:ÍpLn\C(D31+Лw@ ?Mg\r!*QQ*RJi͝!?0u8£ɾ@=L-y ͺNRƤTp2`/jNdڲb1>d>k:COȂ#FnbuPtLF5QY:Q>kkݫ@1~#AATi39EF`z"acXBkoh-oUYL9!B4ȎS!1^Y` è0̆ '=L Z{ٶmge[k|H`׻w'X&4Sg#p_˪I}h܆Op-vաcVc4d1Jl0|hĕ$ĄUm̹t-`Ʈ|rr"{/+`n3f4KPZw 8Y8Sy fp1NTP!iɬj-qIjlƬGHŠKzq0smǪ$M0E1J^(w19Z=/f8"E]M-kEtt0#'y P PLi>\۩yMx'qJ\t :5?HMkT31)@[k2e"6vѵJ4m;|" rg I5~kma $ALX򲤋ÊiA5O@;^t:"Ca.f^w؝7T=˭-ÛrҘ "ȫjbu(L(Dj4a`I[w3뒨XlM.ckDL > qJnǯa#bog @;䈃|,RS%R< 0h(9b37vػHgY|̕n3nPH`{@4V+vUd{iRIΓrͺ+#ݟ(]g<`4iJcKLP qAiRED'ۉzNr")GPb>X-N^Ãj>5\cwm8PL!hL 6ڂ Ù4OYr7Ҡs_tc=Ul&Y=Ɣc+2:uC#RP/áQB]"Z \ A$_ֵ^.tumv2h}%Rj4uv]t;R"].0 '`ߘ( %Wd<{8rhqb2;R]nTnZ,N Fj/fW=kV !Kg@ yɩnK{Fu`}᧽6C61Bc&b)dȘe%[Q&{3NH[A;ua0&16WoD-pQG{g H%`0=q䱸{%K 6ArY#j\J LrN삒)W3el'>G Pk.йP:̊=s|FhyaldT᠅XS{ VjY=ʎM܁5#Z/sKՐ.VmKq%Uz?EsTB̼ISxC 2,#-j)BҞ7f;Uܒ#RP4\ ޾ܻppjRyh]/FCAdbs@˽ơ<NŬAt&|2,c6j[*cW?G\wInaG֌4j e&OUC #=mkC'McPfWuWQ mL'_0Ǔ4XC9<~H//*D–q1:ӏ&E0"ׂulL8MlbEZbp< (PϠe C7`7"zҞ֖;K5An߫SCt~5l}3#8*P)3ָE&c(w"% :×r 8~-d+zw~yB,='3^R5.99+x1sS=9IɹīX&+A}j]*69y9-KJAj@}8le jK&jǨƧqvHڟ:83u3/qJSf6ǙqU>c'e49Y.C:+ogIZhwwCO枛[q~[6=3I7[!b/°[jd (Tn`Uar3J)R#5\mH`<*TN/ Ǟ2G-$YcOkHt4}٘jFn>iiRa Byw'iPާT86Y#U*:9ǗzOM`>kמb)Jw|8*5P`p˜Gһ5h`vh54Ɲy#YuUsΝlk{[~"1|`YAU7y[ w6b8 0n Gtk-8 T0QPZ/E#6 ȋ y4֨)OLT| uXSKqtjkhy_S*?~b6p-k8)^VGɫfiƏA)rcXSל@El {ݘE$ Ӵ1L2c0ݓh13 F)itdp Pk^x+׊y F!DLZkrz:9_pdPa&N[pP#hOF @kV2_z3}-\VA3Q$癀Cl"t# Խ9t\j!֜:np\.wMsUWوHHwG;u)kX@gs!˾[uQ4L)hDfjJ[bvJI~AG:)+Fܨth89q%( v؏aݡfE|V)c:z#7~-p}CKdZtDb-Ǟ9cw en5.rE!_[ Ώ0bO@ Rԣ"h)Ə1n-+Gp$w ?{ӻo_~S>|ګ_޻驷]K{ZaNP]0B Rk]M / 1> :(ld"ysH7`q}.W1QLōUv@`Pn ³`63p# jRbofJ"~%#T%.=,Þȏ J<jPOֲs׮қ8/nh9QZ97ߕ޻Xv΋їЈji׉ԍ"u Xl,fFnfS1Ys mnT7I3?G.E9c$M `PksA|tK=tl<8?N8&fwttf2;=džh1@l,Qyә>`&*s֭INz@ Ey# M\IujifP4BT&m&Ɉm΂ {]e txd; K.T7Gn_%wӟ^"4GJpz6U?>C zviCk=WP lp&bXLdae%'H6kv5ENruK3ϰ&Y&#b¬B_9w?˺reBrPb \\&_.D Hs?xg{;}х}ey$3=u aI1!r%2[Xڒe⧧jȂF*X $0j sH@Oh Dl?N I6>0x\C([x/}\Æ AvI-4^Wlӄn{դh 5$8b2 9ܡ21z-|lTE/^}͋Mc_-~g+o7Q׌Z,JPTѡ3Tf|H~!IfՙΊHbkTfa|D]'Zg|RΎt^7!O[Ze2Jp}\Oa3O.F~k3_;iirr/9kF\TXuΘlyDd ,RiRKm?ra{ŋ?z~rۋ_~ӏX10FXce封ރ5i\Z9!c437[i##FQJE\ZV"6B @cٕ٤ *\(fu]|L4ƮyH9Tb+MԹTk}j.AZ $RM[eG-rޥ8{_9}۽˞'~|}j}:zbUj`>Fe6貢.KG]+g r!B¥(]ٵ@sZn kVeT¢ >MX5hK %r=qe{׍UeH]1W׶ %; &)dyv9kZ%q,>/_ ~'~څ[,kVGf;ө7vRk| -]8?_81HRc 594.&)NddU{wbWEr̮@1}p6̤fݵdOһxMdoqּ]]|:w$j@)6kʂnN;%cUX΅{R˕WƫJBH>Wf[90`6ƲA=ˉH82!q-Z Hf[G'UC[z=f5S+1{6,*\fTP<1|'7*i{5|/anBve6tvن1i J d7F9f" 8Z8f GpRp9(-*?̃Jا|U>wFZ#K?p*lojպ.c;sNڂ$_AMK'm\JE en$e ݖAFfI!pB85qPjor׍ E'R㯻7e㴤\L"ZusZ0At {|wI\lL m23E*2SNL5P"bJ]JϜ oU)]qB1PVeZlf>L0q7p@S;\R~Տhprr'nu \{ڥmz<.u(UEy/ګNKmYqSE1ppM" LafL䎏U4فiR:2d<4q׀P0&#>`ҋPk@h׊<>\z` 2rO ]٭i1ph#bn;H1лڜJ; l(D!d"*k =gƫ")mFـG~9!+?94^95!nvd?%|QX <8^SVR9`N%9ӏ|C?뇾vKK/}ᥗ~+7>˿Goy_OPN+maεS\+0: k>(ise%KF|2^]Rn}(Ř#'!X:MhDi82 VF48o-Z灲$@t~;ܧʗ_v .]YY|ʇCt\L[~)m4@td{mۓoow7x}ziՏ-^"Rdj>*(pN,y&pTjB2&oZ[¯EplLZA߾px8qj̭UuXup;h) o^I4yʟڛ_%햛??;`~O~.}=^j7_\| _{< |VyCc1L |5X`ajd{CLz1K1*}q5fٵ[5qq67PAN.{>!@~DRqH? :50iBf!<7!%OUxM3۱mP?΃y ]mn}KExG?'wN?Gk?>^nIW]o+qh|9wu^fOC E7!6u$?4Yb*7;!TFSiPzmLB+{oJض&2B/*7r 磎O4&`P(SB$"Ber6SE?En|/C~˿A/ĢvNPڏ2H?*k>Ӊ2lg#.mDp2k.blI9v/J$0"@l0Z̊黵J3pt-q}^Y%u9ZJ͚7GS7{:}~|\~ߏm_tr)ߖ/^+_rK~GꜹO}TzP=ÁัDת/{8TѼ&6@]j.gΖpx8acm%?Q9|]@zl'0 C>Ge)7_M4a + ǻ>uu1ǿ|ǟh=V+쭷|K盷[.=O=cT.xGVqjeqa?0ާyx [s|( lcFGLl.#Bc\X#20X=~˚d`AcwoFcq,]d1ay.3&Ke اJEnS/{kڝ͟=7*~A]>Χ){m1&",'b Xe!LF2+%|!`KFkBUzj͇ۚ.ehٹݡS IӜ(* &N;b_gq2͸!A=Rԣ*!fLU?ߙEE=IOW=O _8ԯ7'_?^xs>ݏxc~g>d =Q0ǭhtkt"# -{HLXN}yNtYp慍6WiجC4 -tZƧqG*̈́aU\Ou b<7DQ~RuzwpJc7 }z%_/G}s0}Z6| _O'[.=/y\{?;L>(|Kj-sl\si5>s A̸ɖ|lM#[ņJB€HUF,PޥT=5рGif`~,B3շ5wZ)C\} F;?K_şp!h׽y#!m}?}ﭯ|Gԙ'`zUZK79|PR[t&)Зe<Ȝaa(m^9)hv/bN`Ni΍ =Jtwd}|fBnN'(ʷgnOO_r@t~6~{Ώ|}7v0*qj-VKFH{+jidL{۶i9ZE+C #m{"uU6kUh35Vbj+ &QD?™m򡣊c>#np`-p>xb}EӞ[YC?J\*g-Е+oy/ygܶן9w?_scdxТ̙Aӷ,XkSvsh&-410IL˕p(M6e$^ь{4kfvfYy_Ihry͑S;.%Ʃo};w<GOO^=IC/_g`֕ۼ$>yd #G5 bN86 c4*uW v(X8)1f~*w֏]Yzm$/tU//==Qk)~_~Owt+o瞜]D#r:?Ʒ/ŜguT.Ζ\ u>0@++3H儙 5&dEw|Q1oRۗ)2 d3-t?KIxuom{?[n:`{p'HB7=Yr׼0uc18&zEEsU$BϱZdf){.1i4 LjTi{ޖlT(@6Zj@[;Ԙ*J֖E os~5w<~H=ryՆ=-귿EɝOyb1pJ^?o+nw~ooox3^7NWCW :;zҫԦNNB̝X$D"_ת?c5gIz: eY/>ᎮFzs&c4~Tu4кf9||Q^m!(A#,ZNGT6uI73{']0}ѿ[_~we/ ܷt^}bSv D*zQq,<Ǩ"E*8 `ܢ@8L%yqa&1clͶ$ebFq8j"-Ƀ %uAѻ 2|1Fjko@W\JWz|u2BU?gg fѬp-X^>9u]w⩯kW:{p˪^t99T@u@P` Fihp&_]3~Dޗ-'{XAݷ͌)K>-p-[_iS7pæ- (`ޚrvbbzWG̔}Lj`d M; d luwd$UB[eRfB B0GenE׆5|Tdu.]O~{~~^U9='O ;vؿr7Mrַ֭.=bqxSv'o/v\;eaKHe¼~5 b)-vV8!o"ʎ$^gԨ#AK=jiZI+7zC_ʐU0f{ %kBCy-+ėwG?kHotƃ;6H-|-7=eھɄN/~?o|m/CR%ll>zKXKhgd‡E 3VwbkfAٹ [j2gbB_W8t謼D~շ^ŲزFDK9E_(gWx?zWbjMlşZ+"> u戙n殇>?mx>7wCfJ1LGM>m4aww =gN~~{V>/= &۔g1+|j ֮ /sO"go'ta',BgR]dR6\MBZYW \tE^s4`Bܲ3~'-0rK {Ӣæt as|~hh졙3տWw=.j9fc5sߛ_(vАZi53=/Ȼ!n-C[X$MM\0r[r.\Gm"v'aOoTrJfGw|Ͽ^ZM>h> {2a~8o[ Gf5:v̝ 9'/]\ n`v ACeKlƊUk{cB%}f zjiJ`>uSnIT~f] q3D$C&DL8>5? KR({kP,j2|KD@3."u`wăyS`>~him.}?}|`dPi[-{߿i~ݼ3+\n㷲(FZYv֭Qk,LTLd0^5` QY$HwR&}f8y*->diac>m7=XEl4N?F[{Lot9c508P"5N}_òяn}.&E_N6MuN}cXqUz@=vq't:48;**Qcd0EewZ AS_ WG.u l=:!ep߷&=O^mq3cco~?>U~ = Ef+Kֲ5~_rYH/ΊlaJa-M[NSqR+m.DZKZ􌄋3!EN5N=VQw%n_ޭ:;_W-a[!ӣߣo7qަӫ~o\s%!e?vYNmɌ e aĥPƹ_XS+?N]d8'?9qM*.=xZؿ\kTXfB#|<}e7l=>9eȂq2u>͉gA}/~Đ5/~ޅf(6]ԽLE3Z Ф5U";4&hnUUq_j SZn^j`hKms{BmCu9RzWy5~ݾ㷭$?k+ð׺lݾ+߻Ŀxߘ9U,gUxQZ~GmfE_֤kG5I`/3.<]$*2TU$ W[ ? x!:g:@RCC+%{N<}է5?=]z5A:/jVFJaEf{Z68v64wzuwM͌>·׬<af& EHջZ6RB0fZ%rȲuY:kCpB:+TJUF_iJ+~;K6,`CL4:6(`޹'OZi/:pޟ_g[h7|ч?skuW6xf6sEvq[eZظѧm .T浛-P9PcVw(. YEU6A QdvYˎw@9C鵺Ew`6b߰}zW_/:YnDo;]Ky WoA㩿뮸v4wAe*H}Ⱥ LyB㲾ow.q&+6u!:jLOo#~| N2%{Sl[CWq/TPEfLFҙR~Ʒ&^oO]qW2{No3i^_/8c [n-?{(l ۱Mj'q9е`כd eNLLRqAԀha=Oe'YB*eqzNnG0b) 6zڻa,'iK1 uy߸@ z_93񉉍[ݷ~ ^]Jm|)w N^M R2O-n  44KB fc|%;FXOwfFVaP{Gjat'U1C5lT o=eϵӖRʼ- tz,z *m+r"TVaɵ|EP#` Uv>Ԛ44`ƴCO9t),`&7K>|x'|d۵j26ѐ8R!=WvPI]pZ.-jkNaE#``BQl:TF+NCIp*.JFshv- |@,R5U<WmZO"Olٽvˆ4# J4>hXhsv$zʬW4FNvkKjqz-E/膖_Wguq> JXq@LA9Ui6"Ԥc67f٥hfl"fדbfߴD*1t[7A3@=alPhׄ9E*Pq%=jk-X͚QndX2ߥ^8@q%rvRl""(p)s);Di&@aQ궽tRڢ8m(lTz% +XIa°^bhU[ľTed(M"VA|Glwuǁ!`hXGRHc~cNkr(;Z8MQЮTֶrcWϕ5~g!p7fNgtSY'B?-@P6PQk(V1 =,+X{7@ `9J;F uqA;Q|>jgHA-9 0p@Dx߫2#}pEBp]Q%UYBF-TWfbCe=k7󢤴l'jLXbb/ j̕ETKb)dR wl]/%4x3:Vl P"Z tssż6D^g`! ΌkCwoP+ţ5zF;ё^Zagk-E,M$`QهgI 9 ARya쀛Ԑ -->}:Y%@9JCCCu|rO)#c?NN CbuPT>raQ@4&n۾׏m_r4D gX$33UOw& ѻ(Cd˒iŢ]u ԠmeV1:z-禍EusT} m g0OKI/";+u̢oV["H,ˍw.޻A9r&mu%9 Ŧ/Ж]UkK-nޭRqgąЃ^^q# C`j}Vwjqv,4 mkᙂXZ_$7Pk|{ݲc|Ö]wէOel}{=88eeCY1j0Id[L6#We@iFhdP +emqi#|[-%>d/*bLV ɞIlf@T&7aXqMu0#f쐰u`ΰk<k06NcvO0Q#4yLg& s~07~dOLMnN9|4h3B2˨oݡO_S;g(iR)5ۖ=PP_Q98 LJ!t:M+p{ax>;$`,vnU,kvj Y(g瞸mz~U3^v !?}X I`bj[ ;w`2q!]0ґ@e䜟6\inA?er3:ιÀ&SF72 8D3V}r 2돖N7[ u=t +o]fGI ,_$<0s9<4͐H$dLaW |)>Cڶeh P:2!(17J6&lӢ$d-ふO^q39Ň{H"< "Ϝ9 38}؆-k.1Oźk/᠏km&_V46-FZ&z}с=h3҂הz`!d)dbv\֭7@!ѭ"B!Ckwj#(͡c3HɱPMȳiJD>H׮31 x~{wM9xw t -Z'mp=.0^!~ e4h~kYN7c2;EE>tQYHB">@2#+|~hR l @aO➂ql'Tj>5/&u1)@ڟgCR6rGbӧ8bwN23af90ذq0kxF24c|^nhO, V\,ܵ6ܮ2*:|!ky5.nG mjӛ~N!+ce/$4x; ƅЅI[Rt|$N) $jjeS'D͹:rowF^> S%r 6sVYSN}K6&veVoin3,YS]B'+o|SS-.+{]Cq`u}j,Pؐbb LSP{ !tӅeGe/7g qEBfE=o+ }*O;L4͵GX]3Yek{GP%(E?? % 7}ґR5á$Aצ=72k;)ʶ" h"޳&?_>`G/㛷 J K&XsLLR@[c2G0;?XfS):?'.32A%X`\" (Pt$(yTEl}$R^^: i׽Aacs@v}[_]JPugX;=qFt3 ]/ `#[GL;GΖk;[;c>a F}{Te^ac[ l4l΁NXƸ)gG xv ,z\7mZ&S[9(jNƥݗK>:7KXDouP" AN5޸ub 9Iunv::kR)U3ME'% i?I<T r0LO Y؊lQA]xEURgmgu2wZL,~$f ȇw+( fe6@#k.2o|8 ""͵~i!L>CtDŽXInjn Ý4xˇv?rnt/:=3^|MC=&mmf-5j!틆rԐQ2O{IGSzĒ ѵHw≈-ΡhOή!$!&,2S8i]BZ~o  "T@gӸQ8g[,餽WoZs}֮$^TP.ueL5.X7isz{Θ^pZ=M- İ@-/>t=)Q{fҰbmZUTiWlSX/ 3U 䀔@%ߑ>B\Jr 8NPH 9 <@Z{4<4$  Pq {s[H)JytCߒjҬ؋T2H`me!tFuћ ~D$UZq%z"C=p3Tspq뿒cru,mSޤvvCP z)2jNT_Vdl]ЍR=JQiǎ*c_nb0{Wet]JB@;F\F(gA#J/n5+KX@ R 8}Ǭ5"lF scڭґsډMх|6Xr^Woa (/3yAutohaZAYجXCŒwӱvx!dMs( 컢fQ^T(@p9\PjpCZ&]$#X͙Hʍib1EO}VwاoNZj6qҠզiC VftL߈\[,0ZT_4bKRQUK*0ꑶLZźٵ >nI^`xb'^;:6^%GGNhC+'* 4qʑ?*fa`h{Am Ic8R;FLY"PYtqIYB$hR t-pyBH$5!'q$b9-#<|f* E-GB^΋\Uښ WL{hE5::?f9rHRW{;eRWTk@A{Jv= #PBhr$S39# AB^1>G޷mKLlRm1ZT*lD idH]> t4sd:L( bTfoa~%> C.úa-Y5yֳ":_A ֐U\ JBL֬љ(.;&RpM>r !{e&MB̽XM$!ѬR&O^PE+ I=53Gl0s^f؊Ӡt } *}e{}/Nv{Ot^YcYu4[aWg-VD;r蜧6(ސ~.!$)) @ͫ\Z:#[Z 2C@VM2K߫EGtLLN L'! +V&.mիHZߊжVSFp#rB\{zVTlp,hP4 @,Gu(~hO.J4}LD?8%F&&\<<'+=kXGv}Lo i(2Oc *Cbzy1XX t /Qރ3N"ȵ[3!8س;Z53xj/޾"+wTl?tL2:) 4&Ɋ$3LX/ْY]$E]$zȶRu3;'^~F 3wHb8cvq.(²F-;&Fжy +%5R)#?D "PǖNW6 9u,\jC1iҔވł_ޢ}< Rҹt2 l+VXVt ;'g;SR~<2ƵHhТ47!: J9#!$UQEfsFXw0͆E B4Xu\]ylMqX o;R[s"oizBlǺT xO`m|uJsRv"E ;\C S̅{.WPe8/1$xeX34MX:DG@fpqĸNH&1ތ. &ZO^(>*uo`<ے:[HT\HۦGiR=utZޢQ#Qj[Kcx NA :a \PxR݅D^~T<0Td5MP @`׍l& zbBmmydTiDs%YǜwuHj C!0GgQOqh D]2}1"2I1\no*L,3&Y.voв!;h &ݨ(P;E230!-y1IbNW0#@/řOؠCJ@A:i !"uAG D Q␉)*iƠ " X{Qh644̭a1],Eɘ]BH )B #BlG)3lzkyŅP겧"(=ւc)3{t✓vc Fl)E=Cpu!ߐDJ`IM NbVNd+ib\zt(03Fӟh^' !7LҒ@b&!ntc%"#( wTF=KF -J+[k,% B '2F5q:3. Wjjt[NfU͢)<5$_k*(c=0X,JD|qWsN0dȌ pN\>Qh@LQb$7ii" IGM% ]􀋰 Ȱp$5̚]K4aHȼZ0bC:@hR.v#-(^aVg")ڬB.VRP[d:*gOxN #I#s= ޕME.>Zl 3<_>r"SKynIqVCelH !rrB]D3]95.."8;PH^ =M)^K醮31鮭 j+.GUdkq\3ʎj~A$."G/ v5QMytXdtV&Qϻ8 T'U\8c'W(L2ed!H; @*)A mIP ]{ r "6, sX4iwzwHcd)6cԋ(o2;GG昬]2,B_8ԹD=)F 9fjC;߭< bIeO], X6>% и('cHF9 ){Df$tۂ߶a.2b .G%*YTY 񙈽wMv62Hz yk,+'Xpb9),|maW% D"~Fv4*2ORsi V0lBv(*T28 N1(:%WjTaM>n0$ў `(SqQ @-TD5M1;fi5h[e ?A'n( W:%b/q5McI$5C3VDbhW 0iқp2ۄՙVf]`Y+K ]б 6X`۶}|f'$?5TKQvXiW>o(P #N.@RUdw*tH&|e,$Ah!CbT@ 1e5w.岌b"5HVAѪÒ`@XEMH2dzhW{Ԏй[`ʎIfds,0NNeY 6!uW`/:U=C$ZV~7e-BW"L Xg8($ bCCцS\ X}Bp8Dm 2(ȏ 6tllBui >MބwZ} (7FF*I% OV`USI pi3Pbư$8M ^UH clPJ,Vp  Po "{8OfmzX=tn_,}ζ NNNsNt;c3hf>k tZ?A.l "HTeDL@HL .Mﭑ= biIf@sQU+h/y)SyugL W6O۶m{snǎ6m;wIk o`EZ#HnF"v8?O>bŊu -^?>322}aڰ˨_~ᇷn*o~֬Yp@Y橧6mڡ,Aѝqx{''Mt!,^xs̩u KطgIٙ?3<{/*S͘1NBRqd]zsbG gvCQ={Μ%/I{FviӁAE?'^9 [ggN9 !HpcjeHhLB[=!;o||"!8iҤEs1|;/^y*w'ɒ5M7911q}]|wqSO=eY4K_/~UsaEܰ@-3{vzWqW]uUL?eҵ^{W Lt38mo{[Ϗ(nmxos7ֳ`QJ6GG'OfǎW\׿3<<̎ӌ860ի:>>~~0sn#̤7M^$-[\z'tXQbs1/I|p a5]vܹ~pcccVZj_ι|vYD-3֡` ,127{/~_m{{衇Ξ=Р ĵN>B߽{w bYT Ui}kwXvy]wYo}5Q*;~#eXv^{`ʛ6mھ}I͟~̼{wnժ3ȦFŴ(5A;g'|G,Y.W]m۶<׼&=bLt H.Z-Ĺs^7{O8c(0F{8x;K[{,{_SԼ-[Lƹw=aԪPXr$;ߩي_~gΜi|+-bUZi\G "mS{ԫ_p 7,C. %)77g}g=K.y_ 222B^kL24: m@ƴ@cy]0::w~+\2kۿ+浯o did`Bd8!Ɩ%\L9wO\yr>޽/?򨣆!ewfDG_9,R _N- -[6k֬-[\rǎz|8#_Xq'"+2e^{9l"A7BUhƋOWO鋡# .bM]mڴIqwᇏ{+^BC*4=Q[W$p KY .PSf,YՌ`O9[\r73ϟo0n[o'>}k_z Z;8zfhF)JMSyŊwqțn?s S2aiU6>wܹn=gEqRPP:7x ڌٱ>}MNlٲO|v؜9syΝ>~E*ۣ+v;QeԾ{Ⱥپ}Oӫzҥ•W\1']?{ʕ'O~k^744]89:%_x Kh[ b2׊+~rMsݏ~baMݙM0ļa&0wԀf/AF0Ƌ,U 7x|>ٳgs q*ظۈo)'tiY!BɎp/MN??GXdHY9pKL`0vރ`$|H<@ bΡ{td6ƿmoYbŝ?YQ^yv:∗/iۀ4&z 8Y< )脐B۶7o`˖-W^y'>[$ۦQTw*41VI1 ܶ_n?:f̃ .ZL޴i@kɒ%K[*o{oݤ.ZVxmdo™01jt@Qs'rGbݕO9o۲`ƍ_җo|׻ua.{h&!q}$ffeѻh:&k1!W"$" g("lNcx~pGիΑ-=gK5Lw#ED3gYg/|Angp@0 >-NV^Lܽ{߽l٫W;n*?44go~ wDK]]ZAe˖]vΞ={֬Ywu?sFC pM+4rNR5վh?$ro9O_x/o[qR?K搞,)8WDm7dR 9-b~o|',X ۾} _WHT*uOtTOC\EO뮓#=ؓÏ8Bsڵ7pCsYgjRұk7)RcH^_|\`ݺu/{t-/&^$zXhZLA,~@Z^X[9 +޿4O>|+'xbQ_=we]9FpKqYm+DdW2|,}q7BVw¯8 S_ 'n߾G^+_UW]̧z3!c@bI  w0[tyꫯַuܹ 2^i&>a97I!aA64&Hgitz_iӧ12P8DcW IU3 BάٳFGGey晍7ܑȖ“2xS[V{ N6iA*eZ2{9w߼+7O> ƍGq jǖ'-#F0Q?ɗ%_44Ic:Z2EN:df}vf馛֮YϾtI'e`c˗#˂ 3<3g*zs'Pw_=8{|-[,&nµS`AXft;<꨿goyn&W0+'Jܭm ;(tIj-ܛ)zpR i6s{qǎ;5p),XPGÅ*!K݀|fV_8d u]y>`nn5W^qnb ^sPt5&OO+_".駟BITg"ȩNŘ;g] m̋/>s;~vX/&c3iaM #<_^&>EfΝ<\ue.xǸ Wad _}'z駵QhaMj6Nvn2ʢщށ! ANJvey$]7wNNCD'y='0x+ɓ'~ItBmsL_O" S_SOFªUn|53i!G]",5l @=!9eG ǟ7˯"#q)-dQNũ%r)/wwCzErzjK t+`69ԧ6mԶ͛/٧,]`{Ԥp 4+<39_>v\;;2 aqٰ{`% ]8 l eib0N?Ν;? Hr` `}_dc; 6{O> Kg+;-2\܂dڬOsc=go||則-=,#ڣWE#jG>l}'v۫_e˖-YDɿ/ɱ?< މNqy믿;<#m6{xQDv N9ɥ1 -[\r%\rܹs-Z466#yK_*6ټ<m#+?"UV[ڌ.)VRBKdw9\"/Dwpywuw=<<|g8BdŽ& 11`;1㎟>r<3gs=ti3xн[>'{/ݿx+_YOl44sWzU 0:ezm&?h_/|]4/ ' ׿#; PDʢt Bi$,n`}0N&:'\3KrDqk^4!urB]+Yd;,C=:E x?u ;]49*u-grl1Nq>_!Bj5 c))TlWWo"`oW=Rl,'.ȚZKâ-a)Ţ0k^SS-)`'"dvb9򓸕F #3wΨP`G1`ĩ2W9ǥNNqK+&Q@yO!@E[IDe*rǦGʉ#JQiHI$:v U0+E$o^ %BLX 2%Y9qʑ;<0qP2isb,5JBtUNaYR@'D!c}SaiЁɽJij y414O ][1-*ݴ@jt:J F$ň8D҅#bRsH'Z#c#4bEN!7<8\O%ɢ;DSXD gM#0=Sf4zEQa ".8gS 4!sE;g1" b L✈ 0Ab8:`냒Qy$>2 䇖s97Eض85Z G%$&#r%&PH6u.+ Rq=),ǩV3wnJǖiE)Y=6x99 &˃q$3 gpK Sk$ k"r;$3Yruf=5&5BK! jYݭRҿbN|Fq g ؁rGR"xq{UC2L2Af̭Eeprkc1s!9\'ng0IW#mL{X0_C9哣:-&DL!z:PrLF3{Aۢ aLIA؎Tg/$Xtqg uD v"86*pO"%\w)?4G) B.eb-oF{q"-=] EN}$űCBK6{FBAET5Jq2le{$h9n@FO)쓺'+]DDΡ V{!t04E4MPh'RRS4@;;1Y$<%W$"|"dau`# !3rr1[N(2b I_w7q0y)L /.wMWB6-C0 G3FtѤ $ 6'}sC31"^J|JEAF13Eɇ+ˎm&<27;0c!:t蛆s.9*\jC R5GɆ6 ( l[@fwg&7sCvD, z|ڑK S&oAis(l)%-Gd5k~8['`bꧪ*W([bc %]vhX~<$ (.iEzDkx&"h5Эc$LhZ$ Z5<2brrQ̛xenГ3 6SFSXfOHa{$⥥UfS2|+h&2\@ NZ(D2m fraZoM R_=5v.2&i@.}S)+ůe`HWb&*{T4>]"(>GE|(\Kb #-byIS8 & RK'(1uhG GI#UUmARsN| wR3b"I!hY9HFE2r$&;(P@՚b*,\Z:10G )1T&*[,M4@rY0FjNiL IwOKg #[ opRD $Q;t_dO~$UPX, LX踨.J5bHXaXqJy2cRrb+*"#?R5i@ `灻 .PPC]UI&%|Efs72U!>esz -^*$ScfYlT"hEђv$y5Aϣe`Z& RxQPt@NPD1M=K+Tjb&읁 "$wCp4jb@=rhNim:00@¢Jt&fz344h',@" )U՗id* dҹA20F(HHhN{1YCԮ$ 0T8ZRd!wtȡ8B@to[ M$Ve\NKfhFC\, D}%( &]1$")gHyRЭ?n7H,VYՈ0Kخ/F-!*Wݽ46"ϧ⃓7ID- 9}bO"F# [f"Q$uT }{O kfqUc5mfސɉ? sjzb&@+_EkJ"EsL1*T1'PSsvVu)HSMsDBϷ!K:Rt/B]DķtKD2-Ez9hs&\]ܣ{-#{qjX˧ң_SUפ:jb͉mxvzCN?9rR t[h5d^A2EUs}<dB*${W+[%\Z"쮰5nNW"Wbh7r8VPF8ds0qYi4=?e`h1(Җηgɛd9Tρ&ޥ&wydQGGNY{ۈ\?Z\P;;SejA ]K'MW&qRz",3&E~P| .Jk-)9v6KT!hMȫKH- -D6uتV(]>[L|O|l< O{@-Pw1 8a G\W8ì"m4?"vm ˹?' "oW"Nb]2/rf&eX=tNF7P >YrX6VTaVd i >#r`$IbBup*,: ~%ZAq ;+^yVEC0ۼ7@"Nd%hA9v/:pIwl؂<I_~ΑVVO|,65^^4h׎f~4=lh}_8 `?HU,N/b?':1RUHܙi=9bBa#9g%uجȣQ9sZk!&<~=l_}1۷s'1{訥w\Ұf& %TW{$A]:'d@[KOq&y5I+&[,Pd#|\7EkIQT}YX.L>/ )Jt;Vr$e̟|90@ 2`1}/r07?|l V H1{q'KNxF1U8\| n咀;,y%c̊W00[Ӗ\Ga୦p [c:T9Iρ4l÷wbD`NM"RuUsJD,ɻ_ h!,p 3WgT\TpHwMQӶr:Bs H"s|303t89E͇<tli F2uiO1 .6Nb1RLB+sTeHL}CN.Bdi#ξpL&w ĪZ@ws]\#ځIXN0["$m6JEk@@_Ȁ>>6ݺ4'.uZO%-j` >Cheʃ1_,!/B@Z@Ȍ=z}^'7RfAYj6 kJrkN1 kN #EҜ0z$fp!3 m+%D>iT#eIS<32v ̓K)k5Hȑ"t>FI':FVd[p"aG /~[^@Dœi[G{(P(8[5Ud%*z;I}P-Z8\r)񵪒F8qIA^&o`Z)aSi\ e5Je-U䍼KXy!-cH+ҹۡK;]ۘvV/3=cK5ig\To "<-RgILj}_Ƽ%L@(Y,6įr1uӥ&^K-h]S(A8Q;avqcn1p.yOSUbp`gayV{Dri4緓E)Ϳv( yHMs[~)N2 B6-f#~D -ܪrCmzzQÇj8rh}Qkrn#O [:9vƢY ; ^KTݔV:,ʼD3hNCYM*%^2//#eN NB)x2 6gj5Z!aъ͍L,4j#^>WhXD ĹPӼ8pϷ);|pSwetNJ*HeWԇD V&d@Q`e,YXNI䡾ɈЄgP!6+<*{w*% 2$b9Hwpy;Z5OJI:ƃTs Ooe$My&_:=\]vB)O{@zE mqDYSu3pcD;K#x1v; BbKS"U4w#Õ1:|3: %jmeZaeyi/Wig$(DY 2ދWC|^3kJg-V67Eʘ>w1Hs$b\t{V{op[D9ҰىM`VIyx=8mЩgPHq̅CTq'YMOč/}ȒL:OAS+S?-8 N(E=f[mIL g P &;n0sb+ؼFiл~Am%*bgD5Wۋ"GqڏdDxR1K0IJQP!Ux-v!gbiHӘX 2t V[j,baj"m_qJFva6)oCr'n~'Z' "ʾGTȄm.؉(ݑڠJ+{͘cC\d1d 6JR#C^j!"hYcN;֞)+W2W:%t⇌}.zr&'շ:9 & I/]҉yUu8oW3+oH}v2A+bΩw"%d{:z(Ʊ6>c# *]eLme B!vW lj(DZZ7-CjY4{f˧ Nu[41-~"pE|d{ (<L7d:oFI6D@HmbQp:63s U7fi.ƛ5=|/H4{'q]R]?Ϙ3CAW?͈S$T9KsW0}#dE<4X?~t~ک^l9N검0efcHl,Olg mt)5D:,Na[3,|xS  MZzN}6zЃ՛S)qwҖ4 zФF縓J#: UQFG=~ܑr -gBcDr.Fvߏy'W2Wm̷8 A(FMLgw' G7a\V\͜ұ.@s3;jX}cE"18gHװ0ǀi,ېO+݂ڻTgc? !V1Kh*=q]~OGDMx߷kj,5;([`ڎ.u/74!( _ȌM_ao{::F=.5蔫CX'0J~su0׷4NySni3N^tF+5(bhj+eº8):†L8^~Zʠ >W˘B=zoB4z[QksaCM_m>Pug(VGޮFfd:U|*ddn!1#7dY`îpH@?2n5]ʹT$b;s` H9WcTˉOʶU, `‰eiCjMpd-?>}I.gc5tWԈyzfh²"ؙ3[XF8;#I@Ç*U 5W.*Dw .!Gv-pXIy0߉!Ý$bc ܓd,f7x7cH*4~Z+ ۩%4m:IoGм-]U3nڭ\#C*YׯAcR# &dN%$ց}hf cPP5J8Uqt3~ -R<7WB3@[`Gk=ޅϹ];ܧezYaà^ãE&/ w=g)3 T#"FY#+ o0N'E?"c2ƟJqKmn1֩`M0 47aL,+v^x g>҈ 1eF 3 'YJld06p"aR0 N\5Hfv_&_Cק9Xc׹T& '9gv ,Jffչ ?Јfmиǹ|0Ł )=S}R(#a fvw0Nu;@L,Gq-L\T:h[*/k UrJP؝/D>q A// Y0Cm\f1>ěHACTIR kFNź ^V2MF+;5*"zB7H8"H$qr]NVm_fC9T qPwH~8{6,aZ\{Vo*kTn] D4ȋHr%(;, gA{'rZPIENDB`pvr.argustv-3.5.4-Leia/pvr.argustv/resources/000077500000000000000000000000001337562352100212165ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/000077500000000000000000000000001337562352100230015ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.af_za/000077500000000000000000000000001337562352100274715ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.af_za/strings.po000066400000000000000000000024001337562352100315160ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Afrikaans (South Africa) (http://www.transifex.com/projects/p/kodi-main/language/af_ZA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: af_ZA\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "ARGUS TV Gasheernaam" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "ARGUS TV webbediener poort" msgctxt "#30002" msgid "Include Radio" msgstr "Sluit Radio in" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Konnekteer tydverstreke(s)" msgctxt "#30004" msgid "Windows user account" msgstr "Windows gebruiker rekening" msgctxt "#30005" msgid "Password" msgstr "Wagwoord" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Vertraging na instemming (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Enkele opnames in gids" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.am_et/000077500000000000000000000000001337562352100274765ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.am_et/strings.po000066400000000000000000000022751337562352100315350ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Amharic (Ethiopia) (http://www.transifex.com/projects/p/kodi-main/language/am_ET/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: am_ET\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" 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 "ማዘግያ ከ ተገኘ በኋላ (ሚሰ)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "ነጠላ መቅረጫ በ ፎልደር ውስጥ" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.ar_sa/000077500000000000000000000000001337562352100274765ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.ar_sa/strings.po000066400000000000000000000017311337562352100315310ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Arabic (Saudi Arabia) (http://www.transifex.com/projects/p/kodi-main/language/ar_SA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ar_SA\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 "#30003" msgid "Connect timeout (s)" msgstr "مهلة(ات) الاتصال" msgctxt "#30004" msgid "Windows user account" msgstr "حساب مستخدم ويندوز" msgctxt "#30005" msgid "Password" msgstr "كلمة المرور" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.be_by/000077500000000000000000000000001337562352100274715ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.be_by/strings.po000066400000000000000000000023321337562352100315220ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Belarusian (Belarus) (http://www.transifex.com/projects/p/kodi-main/language/be_BY/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: be_BY\n" "Plural-Forms: nplurals=4; 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 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 "Пароль" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Delay after tuning (ms)" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.bg_bg/000077500000000000000000000000001337562352100274515ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.bg_bg/strings.po000066400000000000000000000026471337562352100315130ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/kodi-main/language/bg_BG/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bg_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 "Забавяне след настройката (мсек)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Единични записи в папка" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.bs_ba/000077500000000000000000000000001337562352100274575ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.bs_ba/strings.po000066400000000000000000000014351337562352100315130ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Bosnian (Bosnia and Herzegovina) (http://www.transifex.com/projects/p/kodi-main/language/bs_BA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bs_BA\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 "#30005" msgid "Password" msgstr "Lozinka" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.ca_es/000077500000000000000000000000001337562352100274635ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.ca_es/strings.po000066400000000000000000000024541337562352100315210ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Catalan (Spain) (http://www.transifex.com/projects/p/kodi-main/language/ca_ES/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca_ES\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "Nom d'amfitrió d'ARGUS TV" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "Port del servidor web d'ARGUS TV" msgctxt "#30002" msgid "Include Radio" msgstr "Inclou la ràdio" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Temps d'expiració de la connexió (s)" msgctxt "#30004" msgid "Windows user account" msgstr "Compte d'usuari de Windows" msgctxt "#30005" msgid "Password" msgstr "Contrasenya" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Retard després de la sintonització (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Un sol enregistrament per carpeta." pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.cs_cz/000077500000000000000000000000001337562352100275125ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.cs_cz/strings.po000066400000000000000000000024571337562352100315530ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/kodi-main/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs_CZ\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "Název hostitele ARGUS TV" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "Port webového serveru ARGUS TV" msgctxt "#30002" msgid "Include Radio" msgstr "Zahrnout rádio" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Časový limit spojení (s)" msgctxt "#30004" msgid "Windows user account" msgstr "Uživatelský účet Windows" msgctxt "#30005" msgid "Password" msgstr "Heslo" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Zpoždění po naladění (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Jednotlivé nahrávky ve složce" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.cy_gb/000077500000000000000000000000001337562352100274745ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.cy_gb/strings.po000066400000000000000000000024731337562352100315330ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Welsh (United Kingdom) (http://www.transifex.com/projects/p/kodi-main/language/cy_GB/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cy_GB\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 "Terfyn amser cysylltu (eiliadau)" 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 (m'au)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Recordiadau sengl yn y ffolder hon" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.da_dk/000077500000000000000000000000001337562352100274535ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.da_dk/strings.po000066400000000000000000000023741337562352100315120ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Danish (Denmark) (http://www.transifex.com/projects/p/kodi-main/language/da_DK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: da_DK\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "ARGUS TV Værtsnavn" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "ARGUS TV webserver port" msgctxt "#30002" msgid "Include Radio" msgstr "Inkluder Radio" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Forbindelsestimeout (s)" msgctxt "#30004" msgid "Windows user account" msgstr "Windows brugerkonto" msgctxt "#30005" msgid "Password" msgstr "Adgangskode" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Forsinkelse efter kanalskift (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Enkeltstående optagelser i mappe" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.de_de/000077500000000000000000000000001337562352100274515ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.de_de/strings.po000066400000000000000000000024121337562352100315010ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: German (Germany) (http://www.transifex.com/projects/p/kodi-main/language/de_DE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de_DE\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 "Schließe Radiokanäle mit ein" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Verbindungszeitüberschreitung (s)" msgctxt "#30004" msgid "Windows user account" msgstr "Windows Benutzername" msgctxt "#30005" msgid "Password" msgstr "Passwort" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Verzögerung nach Tuning (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Einzelne Aufnahmen im Ordner" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.el_gr/000077500000000000000000000000001337562352100275015ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.el_gr/strings.po000066400000000000000000000026771337562352100315460ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Greek (Greece) (http://www.transifex.com/projects/p/kodi-main/language/el_GR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: el_GR\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 "Χρονικό όριο σύνδεσης (s)" msgctxt "#30004" msgid "Windows user account" msgstr "Λογαριασμός χρήστη Windows" msgctxt "#30005" msgid "Password" msgstr "Κωδικός πρόσβασης" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Καθυστέρηση μετά το συντονισμό (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Ενιαίες εγγραφές στο φάκελο" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.en_au/000077500000000000000000000000001337562352100275005ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.en_au/strings.po000066400000000000000000000022131337562352100315270ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: English (Australia) (http://www.transifex.com/projects/p/kodi-main/language/en_AU/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: en_AU\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" msgid "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)" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.en_gb/000077500000000000000000000000001337562352100274635ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.en_gb/strings.po000066400000000000000000000021471337562352100315200ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/kodi-main/language/en_GB/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: en_GB\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #settings labels msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "" 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 "" msgctxt "#30007" msgid "Single recordings in folder" msgstr "" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.en_nz/000077500000000000000000000000001337562352100275225ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.en_nz/strings.po000066400000000000000000000023501337562352100315530ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: English (New Zealand) (http://www.transifex.com/projects/p/kodi-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)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Single recordings in folder" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.en_us/000077500000000000000000000000001337562352100275225ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.en_us/strings.po000066400000000000000000000023521337562352100315550ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: English (United States) (http://www.transifex.com/projects/p/kodi-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 "#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)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Single recordings in folder" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.eo/000077500000000000000000000000001337562352100270145ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.eo/strings.po000066400000000000000000000012671337562352100310530ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/kodi-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 "#30005" msgid "Password" msgstr "pasvorto" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.es_ar/000077500000000000000000000000001337562352100275025ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.es_ar/strings.po000066400000000000000000000022741337562352100315400ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/kodi-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 "ARGUS TV Hostname" msgstr "Hostname ARGUS TV" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "Puerto del webserver de ARGUS TV" msgctxt "#30002" msgid "Include Radio" msgstr "Incluir Radio" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Tiempo de espera de la conexión (s)" msgctxt "#30004" msgid "Windows user account" msgstr "Cuenta de usuario de Windows" msgctxt "#30005" msgid "Password" msgstr "Contraseña" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Retraso después de sintonizar (ms)" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.es_es/000077500000000000000000000000001337562352100275075ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.es_es/strings.po000066400000000000000000000024361337562352100315450ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Spanish (Spain) (http://www.transifex.com/projects/p/kodi-main/language/es_ES/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es_ES\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "Nombre del servidor ARGUS TV" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "Puerto del servidor Web de ARGUS TV" msgctxt "#30002" msgid "Include Radio" msgstr "Incluir Radio" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Tiempo para conectar excedido" msgctxt "#30004" msgid "Windows user account" msgstr "Cuenta de usuario de Windows" msgctxt "#30005" msgid "Password" msgstr "Contraseña" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Retraso después de sintonizar (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Una sola grabación por carpeta" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.es_mx/000077500000000000000000000000001337562352100275245ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.es_mx/strings.po000066400000000000000000000024511337562352100315570ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/kodi-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 "ARGUS TV Hostname" msgstr "Nombre del servidor ARGUS TV" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "Puerto del servidor Web de ARGUS TV" msgctxt "#30002" msgid "Include Radio" msgstr "Incluir Radio" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Tiempo para conectar agotado (s)" msgctxt "#30004" msgid "Windows user account" msgstr "Cuenta de usuario de Windows" msgctxt "#30005" msgid "Password" msgstr "Contraseña" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Retraso después de sintonizar (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Grabaciones individuales en la carpeta" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.et_ee/000077500000000000000000000000001337562352100274725ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.et_ee/strings.po000066400000000000000000000023721337562352100315270ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/kodi-main/language/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: et_EE\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)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Üksikud salvestised kaustas" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.eu_es/000077500000000000000000000000001337562352100275115ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.eu_es/strings.po000066400000000000000000000024261337562352100315460ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Basque (Spain) (http://www.transifex.com/projects/p/kodi-main/language/eu_ES/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: eu_ES\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "ARGUS TV ostalari-izena" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "ARGUS TV web-zerbitzariaren ataka" msgctxt "#30002" msgid "Include Radio" msgstr "Irratia Barne Hartu" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Konexioa denboraz kanpo (s)" msgctxt "#30004" msgid "Windows user account" msgstr "Windows-eko erabiltzaile kontua" msgctxt "#30005" msgid "Password" msgstr "Pasahitza" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Sintonizatu osteko atzerapena (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Grabazio bakarreko karpetak" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.fa_af/000077500000000000000000000000001337562352100274455ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.fa_af/strings.po000066400000000000000000000014331337562352100314770ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Persian (Afghanistan) (http://www.transifex.com/projects/p/kodi-main/language/fa_AF/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa_AF\n" "Plural-Forms: nplurals=1; plural=0;\n" msgctxt "#30002" msgid "Include Radio" msgstr "در برگرفتن رادیو" msgctxt "#30005" msgid "Password" msgstr "کلمه عبور" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.fa_ir/000077500000000000000000000000001337562352100274715ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.fa_ir/strings.po000066400000000000000000000013021337562352100315160ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Persian (Iran) (http://www.transifex.com/projects/p/kodi-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 "رمز عبور" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.fi_fi/000077500000000000000000000000001337562352100274655ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.fi_fi/strings.po000066400000000000000000000024301337562352100315150ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/kodi-main/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi_FI\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "ARGUS TV:n isäntänimi" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "ARGUS TV:n web-palvelimen portti" msgctxt "#30002" msgid "Include Radio" msgstr "Sisällytä radiokanavat" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Yhteyden aikakatkaisu (s)" msgctxt "#30004" msgid "Windows user account" msgstr "Windows-käyttäjätunnus" msgctxt "#30005" msgid "Password" msgstr "Salasana" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Viive virityksen jälkeen (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Yksittäiset tallennukset kansiossa" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.fo_fo/000077500000000000000000000000001337562352100275015ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.fo_fo/strings.po000066400000000000000000000013141337562352100315310ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Faroese (Faroe Islands) (http://www.transifex.com/projects/p/kodi-main/language/fo_FO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fo_FO\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30005" msgid "Password" msgstr "Loyniorð" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.fr_ca/000077500000000000000000000000001337562352100274635ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.fr_ca/strings.po000066400000000000000000000024301337562352100315130ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: French (Canada) (http://www.transifex.com/projects/p/kodi-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 "Temporisation 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)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Enregistrements uniques dans le dossier" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.fr_fr/000077500000000000000000000000001337562352100275075ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.fr_fr/strings.po000066400000000000000000000024151337562352100315420ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: French (France) (http://www.transifex.com/projects/p/kodi-main/language/fr_FR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr_FR\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 serveur Web ARGUS TV" msgctxt "#30002" msgid "Include Radio" msgstr "Inclure la radio" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Temporisation 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 "Attente après réglage (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Chaque enregistrement dans un dossier" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.gl_es/000077500000000000000000000000001337562352100275025ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.gl_es/strings.po000066400000000000000000000024371337562352100315410ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Galician (Spain) (http://www.transifex.com/projects/p/kodi-main/language/gl_ES/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: gl_ES\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "Nome do host de ARGUS TV" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "Porto do servidor web de ARGUS TV" msgctxt "#30002" msgid "Include Radio" msgstr "Incluír Radio" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Tempo de espera da(s) conexión(s)" msgctxt "#30004" msgid "Windows user account" msgstr "Conta do usuario de Windows" msgctxt "#30005" msgid "Password" msgstr "Contrasinal" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Retardo despois do axuste (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Gravacións independentes no cartafol" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.he_il/000077500000000000000000000000001337562352100274715ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.he_il/strings.po000066400000000000000000000025131337562352100315230ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Hebrew (Israel) (http://www.transifex.com/projects/p/kodi-main/language/he_IL/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: he_IL\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "שם מארח או כתובת IP" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "פורט" 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 "השהיה לאחר העברת ערוץ (אלפית שנ')" msgctxt "#30007" msgid "Single recordings in folder" msgstr "הקלטה בודדת בתיקיה" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.hr_hr/000077500000000000000000000000001337562352100275135ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.hr_hr/strings.po000066400000000000000000000025101337562352100315420ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Croatian (Croatia) (http://www.transifex.com/projects/p/kodi-main/language/hr_HR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr_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č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 "Lozinka" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Odgda nakon pronalaska kanala (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Jedna snimka u mapi" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.hu_hu/000077500000000000000000000000001337562352100275215ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.hu_hu/strings.po000066400000000000000000000024421337562352100315540ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/kodi-main/language/hu_HU/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hu_HU\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "ARGUS TV Állomásnév" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "ARGUS TV webkiszolgáló port" msgctxt "#30002" msgid "Include Radio" msgstr "Tartalmaz rádiót" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "A kapcsolat időtúllépése (mp.)" msgctxt "#30004" msgid "Windows user account" msgstr "Windows felhasználói fiók" msgctxt "#30005" msgid "Password" msgstr "Jelszó" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Hangolás utáni késleltetés (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Különálló felvételek a mappában" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.hy_am/000077500000000000000000000000001337562352100275065ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.hy_am/strings.po000066400000000000000000000026141337562352100315420ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Armenian (Armenia) (http://www.transifex.com/projects/p/kodi-main/language/hy_AM/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hy_AM\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 "Օգտատեր" msgctxt "#30005" msgid "Password" msgstr "Գաղտնաբառ" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Սպասում ձևափոխումից հետո (մվ)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Միայնակ ձայնագրություններ թղթապանակում" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.id_id/000077500000000000000000000000001337562352100274615ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.id_id/strings.po000066400000000000000000000023531337562352100315150ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Indonesian (Indonesia) (http://www.transifex.com/projects/p/kodi-main/language/id_ID/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: id_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 "Sandi" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Jeda setelah penyetelan (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Rekaman tunggal di dalam folder" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.is_is/000077500000000000000000000000001337562352100275175ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.is_is/strings.po000066400000000000000000000023751337562352100315570ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Icelandic (Iceland) (http://www.transifex.com/projects/p/kodi-main/language/is_IS/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: is_IS\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "Nafn á ARGUS TV hýsingunni" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "Vefmiðlaragátt ARGUS TV" msgctxt "#30002" msgid "Include Radio" msgstr "Hafa úrvarp með" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Tengitími útrennur (ms)" msgctxt "#30004" msgid "Windows user account" msgstr "Windows notandanafn" msgctxt "#30005" msgid "Password" msgstr "Lykilorð" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Biðtími eftir rásaval (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Ein upptaka í möppu" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.it_it/000077500000000000000000000000001337562352100275215ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.it_it/strings.po000066400000000000000000000024051337562352100315530ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Italian (Italy) (http://www.transifex.com/projects/p/kodi-main/language/it_IT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: it_IT\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "Nome del server ARGUS TV" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "Porta del webserver di ARGUS TV" msgctxt "#30002" msgid "Include Radio" msgstr "Includi Radio" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Timeout per la connessione (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)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Registrazioni singole nella cartella" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.ja_jp/000077500000000000000000000000001337562352100274745ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.ja_jp/strings.po000066400000000000000000000023361337562352100315310ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/kodi-main/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ja_JP\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 web サーバーのポート番号" 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 "チューニング後のディレイ (ミリ秒)" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.ko_kr/000077500000000000000000000000001337562352100275165ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.ko_kr/strings.po000066400000000000000000000023701337562352100315510ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/kodi-main/language/ko_KR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ko_KR\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 "튜닝 후 지연 (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "폴더마다 한 녹화 파일만" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.lt_lt/000077500000000000000000000000001337562352100275275ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.lt_lt/strings.po000066400000000000000000000025151337562352100315630ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/kodi-main/language/lt_LT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: lt_LT\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "ARGUS TV mazgo vardas" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "ARGUS TV serverio prievadas" msgctxt "#30002" msgid "Include Radio" msgstr "Įtraukti radiją" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Prisijungimui skyrtas laikas (s)" msgctxt "#30004" msgid "Windows user account" msgstr "Windows vartotojo sąskaita" msgctxt "#30005" msgid "Password" msgstr "Slaptažodis" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Atidėti po derinimo (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Atskiri įrašymai aplanke" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.lv_lv/000077500000000000000000000000001337562352100275335ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.lv_lv/strings.po000066400000000000000000000023051337562352100315640ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Latvian (Latvia) (http://www.transifex.com/projects/p/kodi-main/language/lv_LV/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: lv_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 "#30001" msgid "ARGUS TV webserver port" msgstr "ARGUS TV tīmekļa servera ports" msgctxt "#30002" msgid "Include Radio" msgstr "Iekļaut radio" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Savienojuma noilgums" msgctxt "#30004" msgid "Windows user account" msgstr "Windows lietotāja konts" msgctxt "#30005" msgid "Password" msgstr "Parole" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Aizkave pēc uztveršanas (ms)" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.mi/000077500000000000000000000000001337562352100270165ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.mi/strings.po000066400000000000000000000012621337562352100310500ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Maori (http://www.transifex.com/projects/p/kodi-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" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.mk_mk/000077500000000000000000000000001337562352100275075ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.mk_mk/strings.po000066400000000000000000000023661337562352100315470ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Macedonian (Macedonia) (http://www.transifex.com/projects/p/kodi-main/language/mk_MK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: mk_MK\n" "Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 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 "Вклучително Радио" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Тајмаут на поврзување (s)" msgctxt "#30004" msgid "Windows user account" msgstr "Windows корисничка претплата" msgctxt "#30005" msgid "Password" msgstr "Лозинка" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Доцнење (ms)" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.mn_mn/000077500000000000000000000000001337562352100275155ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.mn_mn/strings.po000066400000000000000000000014651337562352100315540ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Mongolian (Mongolia) (http://www.transifex.com/projects/p/kodi-main/language/mn_MN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: mn_MN\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Холболтын хугцаа хэтэрсэн" msgctxt "#30005" msgid "Password" msgstr "Нууц үг" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.ms_my/000077500000000000000000000000001337562352100275355ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.ms_my/strings.po000066400000000000000000000023611337562352100315700ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Malay (Malaysia) (http://www.transifex.com/projects/p/kodi-main/language/ms_MY/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ms_MY\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)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Satu rakaman dalam folder" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.mt_mt/000077500000000000000000000000001337562352100275315ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.mt_mt/strings.po000066400000000000000000000025411337562352100315640ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Maltese (Malta) (http://www.transifex.com/projects/p/kodi-main/language/mt_MT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: mt_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 "#30000" msgid "ARGUS TV Hostname" msgstr "Hostname tal- ARGUS TV" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "Webserver port tal- ARGUS TV" msgctxt "#30002" msgid "Include Radio" msgstr "Inkludi R-Radju" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Konnessjoni skadilha l-ħin (s)" msgctxt "#30004" msgid "Windows user account" msgstr "Kont tal-utent tal-Windows" msgctxt "#30005" msgid "Password" msgstr "Sigriet" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Stennija wara li tidħol fi stazzjon (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Rekordings individwali fil-fowlder" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.my_mm/000077500000000000000000000000001337562352100275275ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.my_mm/strings.po000066400000000000000000000017051337562352100315630ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Burmese (Myanmar) (http://www.transifex.com/projects/p/kodi-main/language/my_MM/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: my_MM\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 "စကားဝှက်" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.nb_no/000077500000000000000000000000001337562352100275045ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.nb_no/strings.po000066400000000000000000000023571337562352100315440ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/kodi-main/language/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nb_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-nettjenerport" msgctxt "#30002" msgid "Include Radio" msgstr "Inkluder radio" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Tilkoblingsavbrudd (s)" 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 (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Enkle opptak i mappe" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.nl_nl/000077500000000000000000000000001337562352100275135ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.nl_nl/strings.po000066400000000000000000000023601337562352100315450ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/kodi-main/language/nl_NL/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nl_NL\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "ARGUS TV-hostnaam" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "ARGUS TV-webserverpoort" msgctxt "#30002" msgid "Include Radio" msgstr "Toon radio" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Verbindingstimeout(s)" msgctxt "#30004" msgid "Windows user account" msgstr "Windows gebruikersaccount" msgctxt "#30005" msgid "Password" msgstr "Wachtwoord" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Wachttijd na afstemmen (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Enkelvoudige opnamen in map" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.pl_pl/000077500000000000000000000000001337562352100275175ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.pl_pl/strings.po000066400000000000000000000024701337562352100315530ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/kodi-main/language/pl_PL/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl_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 "ARGUS TV Hostname" msgstr "Nazwa lub adres serwera" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "Port serwera" msgctxt "#30002" msgid "Include Radio" msgstr "Uwzględniaj radio" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Limit czasu połączenia (sekundy)" msgctxt "#30004" msgid "Windows user account" msgstr "Konto użytkownika Windows" msgctxt "#30005" msgid "Password" msgstr "Hasło" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Opóźnienie dostrajania (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Pojedyncze nagrania w folderze" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.pt_br/000077500000000000000000000000001337562352100275175ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.pt_br/strings.po000066400000000000000000000024071337562352100315530ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/kodi-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 "ARGUS TV Hostname" msgstr "Nome do ARGUS TV" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "Porta do servidor web ARGUS TV" msgctxt "#30002" msgid "Include Radio" msgstr "Incluir Rádio" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Tempo de espera para conectar (s)" msgctxt "#30004" msgid "Windows user account" msgstr "Conta do usuário Windows" msgctxt "#30005" msgid "Password" msgstr "Senha" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Demora após a sintonização (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Gravações única na pasta" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.pt_pt/000077500000000000000000000000001337562352100275375ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.pt_pt/strings.po000066400000000000000000000024321337562352100315710ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/kodi-main/language/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt_PT\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "Nome do servidor ARGUS TV" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "Porta do servidor web ARGUS TV" msgctxt "#30002" msgid "Include Radio" msgstr "Incluir rádio" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Tempo limite da ligação (s)" msgctxt "#30004" msgid "Windows user account" msgstr "Conta de utilizador Windows" msgctxt "#30005" msgid "Password" msgstr "Palavra-passe" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Atraso após a sintonização (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Gravações únicas na pasta" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.ro_ro/000077500000000000000000000000001337562352100275315ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.ro_ro/strings.po000066400000000000000000000024561337562352100315710ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Romanian (Romania) (http://www.transifex.com/projects/p/kodi-main/language/ro_RO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ro_RO\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "Nume gazdă ARGUS TV" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "Port servitor web ARGUS TV" msgctxt "#30002" msgid "Include Radio" msgstr "Include Radio" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Expirare timp conexiune (s)" msgctxt "#30004" msgid "Windows user account" msgstr "Cont utilizator Windows" msgctxt "#30005" msgid "Password" msgstr "Parolă" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Întârziere după căutare (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Înregistrări singulare în dosar" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.ru_ru/000077500000000000000000000000001337562352100275455ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.ru_ru/strings.po000066400000000000000000000026721337562352100316050ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/kodi-main/language/ru_RU/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru_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 "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 "Задержка после настройки (мс)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Одна запись в папке" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.si_lk/000077500000000000000000000000001337562352100275125ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.si_lk/strings.po000066400000000000000000000027221337562352100315460ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Sinhala (Sri Lanka) (http://www.transifex.com/projects/p/kodi-main/language/si_LK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: si_LK\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "ආරක්ෂක රූපවාහිනී ධාරක නම" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "ආරක්ෂක රූපවාහිනී ජාලසේවා තිර්ථය " 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 "සුසර කිරීමෙන් පසු ප්‍රමාදය (මිලි.තත්.)" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.sk_sk/000077500000000000000000000000001337562352100275235ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.sk_sk/strings.po000066400000000000000000000025261337562352100315610ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/kodi-main/language/sk_SK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk_SK\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "Názov hostiteľa služby ARGUS TV" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "Port webového servera služby ARGUS TV" msgctxt "#30002" msgid "Include Radio" msgstr "Zahrnúť rozhlasové stanice" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Časový limit pre spojenie" msgctxt "#30004" msgid "Windows user account" msgstr "Používateľské konto systému Windows" msgctxt "#30005" msgid "Password" msgstr "Heslo" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Oneskorenie po naladení (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Jednotlivé nahrávky v priečinku" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.sl_si/000077500000000000000000000000001337562352100275225ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.sl_si/strings.po000066400000000000000000000024671337562352100315640ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Slovenian (Slovenia) (http://www.transifex.com/projects/p/kodi-main/language/sl_SI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sl_SI\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 "ARGUS TV Hostname" msgstr "Ime gostitelja ARGUS TV" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "Vrata spletnega strežnika ARGUS TV" msgctxt "#30002" msgid "Include Radio" msgstr "Vključi radio" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Čas preteka povezovanja (s)" msgctxt "#30004" msgid "Windows user account" msgstr "Uporabnik sistema Windows" msgctxt "#30005" msgid "Password" msgstr "Geslo" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Zamik pri preklopu (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Posamezni posnetki v mapi" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.sq_al/000077500000000000000000000000001337562352100275105ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.sq_al/strings.po000066400000000000000000000021111337562352100315340ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Albanian (Albania) (http://www.transifex.com/projects/p/kodi-main/language/sq_AL/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sq_AL\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)" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.sr_rs/000077500000000000000000000000001337562352100275415ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.sr_rs/strings.po000066400000000000000000000026621337562352100316000ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Serbian (Serbia) (http://www.transifex.com/projects/p/kodi-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 "#30000" msgid "ARGUS TV Hostname" msgstr "ARGUS ТВ Hostname" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "ARGUS ТВ порт web сервера" 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 "Одложи након окретања (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Поједини снимци у фасцикли" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.sr_rs@latin/000077500000000000000000000000001337562352100306715ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.sr_rs@latin/strings.po000066400000000000000000000025311337562352100327230ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Serbian (Latin) (Serbia) (http://www.transifex.com/projects/p/kodi-main/language/sr_RS@latin/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr_RS@latin\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 Hostname" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "ARGUS TV port web servera" msgctxt "#30002" msgid "Include Radio" msgstr "Uključi Radio" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Istek vremena za povezivanje (s)" msgctxt "#30004" msgid "Windows user account" msgstr "Windows korisnički nalog" msgctxt "#30005" msgid "Password" msgstr "Lozinka" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Odloži nakon okretanja (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Pojedini snimci u fascikli" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.sv_se/000077500000000000000000000000001337562352100275305ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.sv_se/strings.po000066400000000000000000000024021337562352100315570ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Swedish (Sweden) (http://www.transifex.com/projects/p/kodi-main/language/sv_SE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sv_SE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "ARGUS TV-värdnamn" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "ARGUS TV webbserver-port" msgctxt "#30002" msgid "Include Radio" msgstr "Inkludera radio" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Anslutningstimeout (s)" msgctxt "#30004" msgid "Windows user account" msgstr "Windows-användarkonto" msgctxt "#30005" msgid "Password" msgstr "Lösenord" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Fördröjning efter kanalinställning (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Ensamma inspelningar i mappen" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.szl/000077500000000000000000000000001337562352100272215ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.szl/strings.po000066400000000000000000000025061337562352100312550ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Silesian (http://www.transifex.com/projects/p/kodi-main/language/szl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: szl\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 "ARGUS TV Hostname" msgstr "Miano lebo adresa serwera" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "Port ôd serwera" msgctxt "#30002" msgid "Include Radio" msgstr "Kanały radyjowe tyż" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Limit czŏsu skuplowaniŏ (sekundy)" msgctxt "#30004" msgid "Windows user account" msgstr "Miano ôd używŏcza Windows" msgctxt "#30005" msgid "Password" msgstr "Hasło" msgctxt "#30006" msgid "Delay after tuning (ms)" msgstr "Zniyskorzynie po szaltrowaniu (ms)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Ekstra folder dlŏ kŏżdygo nagraniŏ" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.ta_in/000077500000000000000000000000001337562352100275035ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.ta_in/strings.po000066400000000000000000000013361337562352100315370ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Tamil (India) (http://www.transifex.com/projects/p/kodi-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 "#30005" msgid "Password" msgstr "அடையாளச் சொல்" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.te_in/000077500000000000000000000000001337562352100275075ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.te_in/strings.po000066400000000000000000000013221337562352100315360ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Telugu (India) (http://www.transifex.com/projects/p/kodi-main/language/te_IN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: te_IN\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30005" msgid "Password" msgstr "సంకేతపదం" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.tg_tj/000077500000000000000000000000001337562352100275205ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.tg_tj/strings.po000066400000000000000000000013101337562352100315440ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Tajik (Tajikistan) (http://www.transifex.com/projects/p/kodi-main/language/tg_TJ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tg_TJ\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#30005" msgid "Password" msgstr "Парол" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.th_th/000077500000000000000000000000001337562352100275175ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.th_th/strings.po000066400000000000000000000015251337562352100315530ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/kodi-main/language/th_TH/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: th_TH\n" "Plural-Forms: nplurals=1; plural=0;\n" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "ระยะเวลาหยุดการเชื่อมต่อ (วิ)" msgctxt "#30005" msgid "Password" msgstr "รหัสผ่าน" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.tr_tr/000077500000000000000000000000001337562352100275435ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.tr_tr/strings.po000066400000000000000000000024111337562352100315720ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/kodi-main/language/tr_TR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr_TR\n" "Plural-Forms: nplurals=1; plural=0;\n" msgctxt "#30000" msgid "ARGUS TV Hostname" msgstr "ARGUS TV Ana Bilgisayar Adı" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "ARGUS TV web sunucusu bağlantı noktası" msgctxt "#30002" msgid "Include Radio" msgstr "Radyoyu dahil et" msgctxt "#30003" msgid "Connect timeout (s)" msgstr "Bağlantı zaman aşımı (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)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Her bir klasörde tek kayıt" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.uk_ua/000077500000000000000000000000001337562352100275155ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.uk_ua/strings.po000066400000000000000000000025051337562352100315500ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/kodi-main/language/uk_UA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk_UA\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 "Затримка після регулювання (мс)" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.uz_uz/000077500000000000000000000000001337562352100275655ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.uz_uz/strings.po000066400000000000000000000013021337562352100316120ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Uzbek (Uzbekistan) (http://www.transifex.com/projects/p/kodi-main/language/uz_UZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uz_UZ\n" "Plural-Forms: nplurals=1; plural=0;\n" msgctxt "#30005" msgid "Password" msgstr "Maxfiy so'z" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.vi_vn/000077500000000000000000000000001337562352100275325ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.vi_vn/strings.po000066400000000000000000000024651337562352100315720ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/projects/p/kodi-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 "#30000" msgid "ARGUS TV Hostname" msgstr "Tên máy chủ ARGUS TV" msgctxt "#30001" msgid "ARGUS TV webserver port" msgstr "Cổng máy chủ web ARGUS TV" 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 (mili giây)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "Thu đơn trong thư mục" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.zh_cn/000077500000000000000000000000001337562352100275125ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.zh_cn/strings.po000066400000000000000000000023361337562352100315470ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/kodi-main/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\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 web 服务器端口" 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 "调台延迟(毫秒)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "文件夹中单个录像" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.zh_tw/000077500000000000000000000000001337562352100275445ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/pvr.argustv/resources/language/resource.language.zh_tw/strings.po000066400000000000000000000023651337562352100316030ustar00rootroot00000000000000# Kodi Media Center language file # Addon Name: ARGUS TV client # Addon id: pvr.argustv # Addon Provider: Fred Hoogduin, Marcel Groothuis msgid "" msgstr "" "Project-Id-Version: KODI Main\n" "Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kodi Translation Team\n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/kodi-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 "在調頻後延遲 (毫秒)" msgctxt "#30007" msgid "Single recordings in folder" msgstr "每個錄影檔放置在獨立的資料夾" pvr.argustv-3.5.4-Leia/pvr.argustv/resources/settings.xml000066400000000000000000000013161337562352100236010ustar00rootroot00000000000000 pvr.argustv-3.5.4-Leia/src/000077500000000000000000000000001337562352100154725ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/src/EventsThread.cpp000066400000000000000000000071471337562352100206030ustar00rootroot00000000000000/* * 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) : m_subscribed(false) { XBMC->Log(LOG_DEBUG, "CEventsThread:: constructor"); } CEventsThread::~CEventsThread(void) { XBMC->Log(LOG_DEBUG, "CEventsThread:: destructor"); // v17 Krypton. When exiting Kodi with this addon still subscribed, // network services are already unavailable. ArgusTV::UnsubscribeServiceEvents won't succeed } 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 P8PLATFORM:: 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(); } } pvr.argustv-3.5.4-Leia/src/EventsThread.h000066400000000000000000000021331337562352100202360ustar00rootroot00000000000000#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 "p8-platform/threads/threads.h" class CEventsThread : public P8PLATFORM::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; }; pvr.argustv-3.5.4-Leia/src/KeepAliveThread.cpp000066400000000000000000000032341337562352100211750ustar00rootroot00000000000000/* * Copyright (C) 2010 Marcel Groothuis * * 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 "p8-platform/os.h" #include "client.h" //for XBMC->Log #include "utils.h" #include "argustvrpc.h" #include "KeepAliveThread.h" using namespace ADDON; CKeepAliveThread::CKeepAliveThread() { XBMC->Log(LOG_DEBUG, "CKeepAliveThread:: constructor"); } CKeepAliveThread::~CKeepAliveThread() { XBMC->Log(LOG_DEBUG, "CKeepAliveThread:: destructor"); } void *CKeepAliveThread::Process() { XBMC->Log(LOG_DEBUG, "CKeepAliveThread:: thread started"); while (!IsStopped()) { int retval = ArgusTV::KeepLiveStreamAlive(); XBMC->Log(LOG_DEBUG, "CKeepAliveThread:: KeepLiveStreamAlive returned %i", (int) retval); // The new P8PLATFORM:: 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, "CKeepAliveThread:: thread stopped"); return NULL; } pvr.argustv-3.5.4-Leia/src/KeepAliveThread.h000066400000000000000000000016411337562352100206420ustar00rootroot00000000000000#pragma once /* * Copyright (C) 2010 Marcel Groothuis * * 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 "p8-platform/threads/threads.h" class CKeepAliveThread : public P8PLATFORM::CThread { public: CKeepAliveThread(); virtual ~CKeepAliveThread(void); private: virtual void *Process(void); }; pvr.argustv-3.5.4-Leia/src/activerecording.cpp000066400000000000000000000026431337562352100213530ustar00rootroot00000000000000/* * 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 "activerecording.h" cActiveRecording::cActiveRecording(void) { } cActiveRecording::~cActiveRecording(void) { } // This is a minimalistic parser, parsing only the fields that // are currently used by the implementation bool cActiveRecording::Parse(const Json::Value& data) { // From the Active Recording class pickup the Program class Json::Value programobject; programobject = data["Program"]; // Then, from the Program class, pick up the upcoming program id upcomingprogramid = programobject["UpcomingProgramId"].asString(); return true; } pvr.argustv-3.5.4-Leia/src/activerecording.h000066400000000000000000000021631337562352100210150ustar00rootroot00000000000000#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 class cActiveRecording { private: std::string upcomingprogramid; public: cActiveRecording(void); virtual ~cActiveRecording(void); bool Parse(const Json::Value& data); const std::string& UpcomingProgramId(void) const { return upcomingprogramid; } }; pvr.argustv-3.5.4-Leia/src/argustvrpc.cpp000066400000000000000000001311301337562352100203750ustar00rootroot00000000000000/** * \brief Proof of concept code to access ArgusTV's REST api using C++ code * \author Marcel Groothuis, Fred Hoogduin *************************************************************************** * Copyright (C) 2010-2012 Marcel Groothuis, 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 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 . *************************************************************************** * Depends on: * - jsoncpp: http://jsoncpp.sourceforge.net/ * * Tested under Windows and Linux */ #include #include #include #include "p8-platform/os.h" #include "client.h" #include "pvrclient-argustv.h" #include "utils.h" #include "argustvrpc.h" #include "p8-platform/threads/mutex.h" #include "p8-platform/util/StringUtils.h" #ifdef TARGET_WINDOWS_STORE #include "p8-platform/windows/CharsetConverter.h" #endif using namespace ADDON; // Some version dependent API strings #define ATV_GETEPG_45 "ArgusTV/Guide/FullPrograms/%s/%i-%02i-%02iT%02i:%02i:%02i/%i-%02i-%02iT%02i:%02i:%02i/false" /** * \brief Namespace with ArgusTV related code */ namespace ArgusTV { P8PLATFORM::CMutex communication_mutex; /** * \brief Do some internal housekeeping at the start */ void Initialize(void) { //// due to lack of static constructors... //curl_global_init(CURL_GLOBAL_ALL); } // The usable urls: //http://localhost:49943/ArgusTV/Control/help //http://localhost:49943/ArgusTV/Scheduler/help //http://localhost:49943/ArgusTV/Guide/help //http://localhost:49943/ArgusTV/Core/help //http://localhost:49943/ArgusTV/Configuration/help //http://localhost:49943/ArgusTV/Log/help int ArgusTVRPC(const std::string& command, const std::string& arguments, std::string& json_response) { P8PLATFORM::CLockObject critsec(communication_mutex); std::string url = g_szBaseURL + command; int retval = E_FAILED; XBMC->Log(LOG_DEBUG, "URL: %s\n", url.c_str()); void* hFile = XBMC->CURLCreate(url.c_str()); if (hFile != NULL) { XBMC->CURLAddOption(hFile, XFILE::CURL_OPTION_PROTOCOL, "Content-Type", "application/json"); std::string b64encoded = BASE64::b64_encode(reinterpret_cast(arguments.c_str()), arguments.length(), false); XBMC->CURLAddOption(hFile, XFILE::CURL_OPTION_PROTOCOL, "postdata", b64encoded.c_str()); if (XBMC->CURLOpen(hFile, XFILE::READ_NO_CACHE)) { std::string result; result.clear(); char buffer[1024]; while (XBMC->ReadFileString(hFile, buffer, 1023)) result.append(buffer); json_response = result; retval = 0; } else { XBMC->Log(LOG_ERROR, "can not write to %s", url.c_str()); } XBMC->CloseFile(hFile); } else { XBMC->Log(LOG_ERROR, "can not open %s for write", url.c_str()); } return retval; } int ArgusTVRPCToFile(const std::string& command, const std::string& arguments, std::string& filename, long& http_response) { P8PLATFORM::CLockObject critsec(communication_mutex); std::string url = g_szBaseURL + command; int retval = E_FAILED; XBMC->Log(LOG_DEBUG, "URL: %s writing to file %s\n", url.c_str(), filename.c_str()); /* Open the output file */ FILE *ofile = fopen(filename.c_str(), "w+b"); if (ofile == NULL) { XBMC->Log(LOG_ERROR, "can not open %s", filename.c_str()); return E_FAILED; } else { void* hFile = XBMC->CURLCreate(url.c_str()); if (hFile != NULL) { XBMC->CURLAddOption(hFile, XFILE::CURL_OPTION_PROTOCOL, "Content-Type", "application/json"); std::string b64encoded = BASE64::b64_encode(reinterpret_cast(arguments.c_str()), arguments.length(), false); XBMC->CURLAddOption(hFile, XFILE::CURL_OPTION_PROTOCOL, "postdata", b64encoded.c_str()); if (XBMC->CURLOpen(hFile, XFILE::READ_NO_CACHE)) { unsigned char buffer[1024]; int bytesRead = 0; retval = 0; do { bytesRead = XBMC->ReadFile(hFile, buffer, sizeof(buffer)); int written = fwrite(buffer, sizeof(unsigned char), bytesRead, ofile); if (bytesRead != written) { XBMC->Log(LOG_ERROR, "Error while writing to %s (%d bytes written, while asked to write %d bytes).", filename.c_str(), written, bytesRead); retval = E_FAILED; break; } } while (bytesRead == sizeof(buffer)); } else { XBMC->Log(LOG_ERROR, "can not write to %s", url.c_str()); } XBMC->CloseFile(hFile); } else { XBMC->Log(LOG_ERROR, "can not open %s for write", url.c_str()); } /* close output file */ fclose(ofile); } return retval; } int ArgusTVJSONRPC(const std::string& command, const std::string& arguments, Json::Value& json_response) { std::string response; int retval = E_FAILED; retval = ArgusTVRPC(command, arguments, response); if (retval != E_FAILED) { #ifdef DEBUG // Print only the first 512 bytes, otherwise XBMC will crash... XBMC->Log(LOG_DEBUG, "Response: %s\n", response.substr(0,512).c_str()); #endif if (response.length() != 0) { std::string jsonReaderError; Json::CharReaderBuilder jsonReaderBuilder; std::unique_ptr const reader(jsonReaderBuilder.newCharReader()); if (!reader->parse(response.c_str(), response.c_str() + response.size(), &json_response, &jsonReaderError)) { XBMC->Log(LOG_DEBUG, "Failed to parse %s: \n%s\n", response.c_str(), jsonReaderError.c_str() ); return E_FAILED; } } else { XBMC->Log(LOG_DEBUG, "Empty response"); return E_EMPTYRESPONSE; } #ifdef DEBUG printValueTree(stdout, json_response); #endif } return retval; } /* * \brief Get the logo for a channel * \param channelGUID GUID of the channel */ std::string GetChannelLogo(const std::string& channelGUID) { #if defined(TARGET_WINDOWS) #if defined(TARGET_WINDOWS_STORE) wchar_t wpath[MAX_PATH]; GetTempPath(MAX_PATH, wpath); std::string tmppath = p8::windows::FromW(wpath); #else char tmppath[MAX_PATH]; GetTempPath(MAX_PATH, tmppath); #endif #elif defined(TARGET_LINUX) || defined(TARGET_DARWIN) || defined(TARGET_FREEBSD) std::string tmppath = "/tmp/"; #else #error implement for your OS! #endif std::string finalpath = tmppath; finalpath += channelGUID; std::string path = finalpath; finalpath += ".png"; path += ".$$$"; struct tm* modificationtime; struct stat buf; if (stat(finalpath.c_str(), &buf) != -1) { modificationtime = localtime((const time_t *) &buf.st_mtime); } else { time_t prehistoric = 0; modificationtime = localtime(&prehistoric); } char command[512]; snprintf(command, 512, "ArgusTV/Scheduler/ChannelLogo/%s/100/100/false/%d-%02d-%02d", channelGUID.c_str(), modificationtime->tm_year + 1900, modificationtime->tm_mon + 1, modificationtime->tm_mday); long http_response; int retval = ArgusTVRPCToFile(command, "", path, http_response); if (retval != 0) { XBMC->Log(LOG_ERROR, "couldn't retrieve the temporary channel logo file %s.\n", path.c_str()); return ""; } if (http_response == 200) { (void) remove(finalpath.c_str()); if (rename(path.c_str(), finalpath.c_str()) == -1) { XBMC->Log(LOG_ERROR, "couldn't rename temporary channel logo file %s to %s.\n", path.c_str(), finalpath.c_str()); finalpath = ""; } } else { // cleanup temporary file if (remove(path.c_str()) == -1) XBMC->Log(LOG_ERROR, "couldn't delete temporary channel logo file %s.\n", path.c_str()); // so was the logo not there (204) or was our local version still valid (304)? if (http_response == 204) { finalpath = ""; } } return finalpath; } /* * \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) { int retval = -1; if (channelType == Television) { retval = ArgusTVJSONRPC("ArgusTV/Scheduler/ChannelGroups/Television", "?visibleOnly=false", response); } else if (channelType == Radio) { retval = ArgusTVJSONRPC("ArgusTV/Scheduler/ChannelGroups/Radio", "?visibleOnly=false", response); } if(retval >= 0) { if( response.type() == Json::arrayValue) { int size = response.size(); return size; } else { XBMC->Log(LOG_DEBUG, "Unknown response format. Expected Json::arrayValue\n"); return -1; } } else { XBMC->Log(LOG_DEBUG, "RequestChannelGroups failed. Return value: %i\n", retval); } return retval; } /* * \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) { int retval = -1; std::string command = "ArgusTV/Scheduler/ChannelsInGroup/" + channelGroupId; retval = ArgusTVJSONRPC(command, "", response); if(retval >= 0) { if( response.type() == Json::arrayValue) { int size = response.size(); return size; } else { XBMC->Log(LOG_DEBUG, "Unknown response format. Expected Json::arrayValue\n"); return -1; } } else { XBMC->Log(LOG_ERROR, "RequestChannelGroupMembers failed. Return value: %i\n", retval); } return retval; } /* * \brief Get the list with TV channel groups from ARGUS */ int RequestTVChannelGroups(Json::Value& response) { return RequestChannelGroups(Television, response); } /* * \brief Get the list with Radio channel groups from ARGUS */ int RequestRadioChannelGroups(Json::Value& response) { return RequestChannelGroups(Radio, response); } /* * \brief Get the list with channels from ARGUS * \param channelType The channel type (Television or Radio) */ int GetChannelList(enum ChannelType channelType, Json::Value& response) { int retval = -1; if (channelType == Television) { retval = ArgusTVJSONRPC("ArgusTV/Scheduler/Channels/Television", "?visibleOnly=false", response); } else if (channelType == Radio) { retval = ArgusTVJSONRPC("ArgusTV/Scheduler/Channels/Radio", "?visibleOnly=false", response); } if(retval >= 0) { if( response.type() == Json::arrayValue) { int size = response.size(); 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 Ping core service. * \param requestedApiVersion The API version the client needs, pass in Constants.ArgusTVRestApiVersion. * \return 0 if client and server are compatible, -1 if the client is too old, +1 if the client is newer than the server and -2 if the connection failed (server down?) */ int Ping(int requestedApiVersion) { Json::Value response; char command[128]; int version = -2; snprintf(command, 128, "ArgusTV/Core/Ping/%i", requestedApiVersion); int retval = ArgusTVJSONRPC(command, "", response); if (retval != E_FAILED) { if (response.type() == Json::intValue) { version = response.asInt(); } } return version; } /** * \brief Returns information (free disk space) from all recording disks. */ int GetRecordingDisksInfo(Json::Value& response) { XBMC->Log(LOG_DEBUG, "GetRecordingDisksInfo"); int retval = ArgusTVJSONRPC("ArgusTV/Control/GetRecordingDisksInfo", "", response); if (retval < 0) { XBMC->Log(LOG_ERROR, "GetRecordingDisksInfo failed"); } return retval; } /** * \brief Returns version information (for display only) */ int GetDisplayVersion(Json::Value& response) { XBMC->Log(LOG_DEBUG, "GetDisplayVersion"); int retval = ArgusTVJSONRPC("ArgusTV/Core/Version", "", response); if (retval < 0) { XBMC->Log(LOG_ERROR, "GetDisplayVersion failed"); } return retval; } /** * \brief GetPluginServices Get all configured plugin services. {activeOnly} = Set to true to only receive active plugins. * \brief Returns an array containing zero or more plugin services. * \param activeonly set to true to only receive active plugins * \param response Reference to a std::string used to store the json response string * \return 0 when successful */ int GetPluginServices(bool activeonly, Json::Value& response) { XBMC->Log(LOG_DEBUG, "GetPluginServices"); int retval = E_FAILED; std::string args = activeonly ? "?activeOnly=true" : "?activeOnly=false"; retval = ArgusTV::ArgusTVJSONRPC("ArgusTV/Control/PluginServices", args, response); if(retval >= 0) { if (response.type() != Json::arrayValue) { retval = E_FAILED; XBMC->Log(LOG_NOTICE, "GetPluginServices did not return a Json::arrayValue [%d].", response.type()); } } else { XBMC->Log(LOG_NOTICE, "GetPluginServices remote call failed."); } return retval; } /** * \brief AreRecordingSharesAccessible * \param thisplugin the plugin to check * \param response Reference to a std::string used to store the json response string * \return 0 when successful */ int AreRecordingSharesAccessible(Json::Value& thisplugin, Json::Value& response) { XBMC->Log(LOG_DEBUG, "AreRecordingSharesAccessible"); Json::StreamWriterBuilder wbuilder; std::string arguments = Json::writeString(wbuilder, thisplugin); int retval = ArgusTVJSONRPC("ArgusTV/Control/AreRecordingSharesAccessible", arguments, response); if (response.type() != Json::arrayValue) { // response on error is a objectValue // TODO: parse it to display the error return -1; } return retval; } int GetLiveStreams() { Json::Value response; int retval = ArgusTVJSONRPC("ArgusTV/Control/GetLiveStreams", "", response); if (retval != E_FAILED) { if (response.type() == Json::arrayValue) { // int size = response.size(); // parse live stream list // for ( int index =0; index < size; ++index ) // { // printf("Found live stream %i: %s\n", index, response["LiveStream"]["RtspUrl"].asString.c_str()); // } } } return retval; } //Remember the last LiveStream object to be able to stop the stream again Json::Value g_current_livestream; int TuneLiveStream(const std::string& channel_id, ChannelType channeltype, const std::string channelname, std::string& stream) { // Send the channel object in json format, *and* a LiveStream object when there is a current // LiveStream present. // ATV will answer with a LiveStream object. stream = ""; char command[512]; snprintf(command, 512, "{\"Channel\":{\"BroadcastStart\":\"\",\"BroadcastStop\":\"\",\"ChannelId\":\"%s\",\"ChannelType\":%i,\"DefaultPostRecordSeconds\":0,\"DefaultPreRecordSeconds\":0,\"DisplayName\":\"%s\",\"GuideChannelId\":\"00000000-0000-0000-0000-000000000000\",\"LogicalChannelNumber\":null,\"Sequence\":0,\"Version\":0,\"VisibleInGuide\":true},\"LiveStream\":", channel_id.c_str(), channeltype, channelname.c_str()); std::string arguments = command; if (!g_current_livestream.empty()) { Json::StreamWriterBuilder wbuilder; arguments.append(Json::writeString(wbuilder, g_current_livestream)).append("}"); } else { arguments.append("null}"); } XBMC->Log(LOG_DEBUG, "ArgusTV/Control/TuneLiveStream, body [%s]", arguments.c_str()); Json::Value response; int retval = ArgusTVJSONRPC("ArgusTV/Control/TuneLiveStream", arguments, response); if (retval != E_FAILED) { if (response.type() == Json::objectValue) { // First analyse the return code from the server ArgusTV::LiveStreamResult livestreamresult = (ArgusTV::LiveStreamResult) response["LiveStreamResult"].asInt(); XBMC->Log(LOG_DEBUG, "TuneLiveStream result %d.", livestreamresult); if (livestreamresult != ArgusTV::Succeed) { return livestreamresult; } // Ok, pick up the returned LiveStream object Json::Value livestream = response["LiveStream"]; if (livestream != Json::nullValue) { g_current_livestream = livestream; } else { XBMC->Log(LOG_DEBUG, "No LiveStream received from server."); return E_FAILED; } stream = g_current_livestream["TimeshiftFile"].asString(); //stream = g_current_livestream["RtspUrl"].asString(); XBMC->Log(LOG_DEBUG, "Tuned live stream: %s\n", stream.c_str()); return E_SUCCESS; } else { XBMC->Log(LOG_DEBUG, "Unknown response format. Expected Json::objectValue"); return E_FAILED; } } else { XBMC->Log(LOG_ERROR, "TuneLiveStream failed"); } return E_FAILED; } int StopLiveStream() { if(!g_current_livestream.empty()) { Json::StreamWriterBuilder wbuilder; std::string arguments = Json::writeString(wbuilder, g_current_livestream); std::string response; int retval = ArgusTVRPC("ArgusTV/Control/StopLiveStream", arguments, response); g_current_livestream.clear(); return retval; } else { return E_FAILED; } } std::string GetLiveStreamURL(void) { std::string stream = ""; if(!g_current_livestream.empty()) { stream = g_current_livestream["RtspUrl"].asString(); } return stream; } int SignalQuality(Json::Value& response) { if(!g_current_livestream.empty()) { Json::StreamWriterBuilder wbuilder; std::string arguments = Json::writeString(wbuilder, g_current_livestream); int retval = ArgusTVJSONRPC("ArgusTV/Control/GetLiveStreamTuningDetails", arguments, response); //if (retval != E_FAILED) //{ // printValueTree(response); //} return retval; } else { return E_FAILED; } } bool KeepLiveStreamAlive() { //Example request: //{"CardId":"String content","Channel":{"BroadcastStart":"String content","BroadcastStop":"String content","ChannelId":"1627aea5-8e0a-4371-9022-9b504344e724","ChannelType":0,"DefaultPostRecordSeconds":2147483647,"DefaultPreRecordSeconds":2147483647,"DisplayName":"String content","GuideChannelId":"1627aea5-8e0a-4371-9022-9b504344e724","LogicalChannelNumber":2147483647,"Sequence":2147483647,"Version":2147483647,"VisibleInGuide":true},"RecorderTunerId":"1627aea5-8e0a-4371-9022-9b504344e724","RtspUrl":"String content","StreamLastAliveTime":"\/Date(928142400000+0200)\/","StreamStartedTime":"\/Date(928142400000+0200)\/","TimeshiftFile":"String content"} //Example response: //true if(!g_current_livestream.empty()) { Json::StreamWriterBuilder wbuilder; std::string arguments = Json::writeString(wbuilder, g_current_livestream); Json::Value response; int retval = ArgusTVJSONRPC("ArgusTV/Control/KeepLiveStreamAlive", arguments, response); if (retval != E_FAILED) { //if (response == "true") //{ return true; //} } } return false; } int GetEPGData(const std::string& guidechannel_id, struct tm epg_start, struct tm epg_end, Json::Value& response) { if ( guidechannel_id.length() > 0 ) { char command[256]; //Format: ArgusTV/Guide/Programs/{guideChannelId}/{lowerTime}/{upperTime} snprintf(command, 256, ATV_GETEPG_45, guidechannel_id.c_str(), epg_start.tm_year + 1900, epg_start.tm_mon + 1, epg_start.tm_mday, epg_start.tm_hour, epg_start.tm_min, epg_start.tm_sec, epg_end.tm_year + 1900, epg_end.tm_mon + 1, epg_end.tm_mday, epg_end.tm_hour, epg_end.tm_min, epg_end.tm_sec); int retval = ArgusTVJSONRPC(command, "", response); return retval; } return E_FAILED; } int GetRecordingGroupByTitle(Json::Value& response) { XBMC->Log(LOG_DEBUG, "GetRecordingGroupByTitle"); int retval = E_FAILED; retval = ArgusTV::ArgusTVJSONRPC("ArgusTV/Control/RecordingGroups/Television/GroupByProgramTitle", "", response); if(retval >= 0) { if (response.type() != Json::arrayValue) { retval = E_FAILED; XBMC->Log(LOG_NOTICE, "GetRecordingGroupByTitle did not return a Json::arrayValue [%d].", response.type()); } } else { XBMC->Log(LOG_NOTICE, "GetRecordingGroupByTitle remote call failed."); } return retval; } int GetFullRecordingsForTitle(const std::string& title, Json::Value& response) { 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::StreamWriterBuilder wbuilder; std::string arguments = Json::writeString(wbuilder, jsArgument); int retval = ArgusTV::ArgusTVJSONRPC(command, arguments, response); if (retval < 0) { XBMC->Log(LOG_NOTICE, "GetFullRecordingsForTitle remote call failed. (%d)", retval); } return retval; } int GetRecordingById(const std::string& id, Json::Value& response) { XBMC->Log(LOG_DEBUG, "GetRecordingById"); std::string command = "ArgusTV/Control/RecordingById/" + id; int retval = ArgusTV::ArgusTVJSONRPC(command, "", response); return retval; } int DeleteRecording(const std::string recordingfilename) { std::string response; XBMC->Log(LOG_DEBUG, "DeleteRecording"); std::string command = "ArgusTV/Control/DeleteRecording?deleteRecordingFile=true"; std::string arguments = recordingfilename; return ArgusTV::ArgusTVRPC(command, arguments, response); } int SetRecordingLastWatched(const std::string& recordingfilename) { std::string response; XBMC->Log(LOG_DEBUG, "SetRecordingLastWatched"); std::string command = "ArgusTV/Control/SetRecordingLastWatched"; std::string arguments = recordingfilename; int retval = ArgusTV::ArgusTVRPC(command, arguments, response); return retval; } int GetRecordingLastWatchedPosition(const std::string& recordingfilename, Json::Value& response) { XBMC->Log(LOG_DEBUG, "GetRecordingLastWatchedPosition(\"%s\",...)", recordingfilename.c_str()); std::string command = "ArgusTV/Control/RecordingLastWatchedPosition"; std::string arguments = recordingfilename; int retval = ArgusTV::ArgusTVJSONRPC(command, arguments, response); if (retval == E_EMPTYRESPONSE) retval = 0; if (retval < 0) { XBMC->Log(LOG_DEBUG, "GetRecordingLastWatchedPosition failed. Return value: %i\n", retval); } return retval; } int SetRecordingLastWatchedPosition(const std::string& recordingfilename, int lastwatchedposition) { std::string response; char tmp[512]; XBMC->Log(LOG_DEBUG, "SetRecordingLastWatchedPosition(\"%s\", %d)", recordingfilename.c_str(), lastwatchedposition); snprintf(tmp, 512, "{\"LastWatchedPositionSeconds\":%d, \"RecordingFileName\":%s}", lastwatchedposition, recordingfilename.c_str()); std::string arguments = tmp; std::string command = "ArgusTV/Control/SetRecordingLastWatchedPosition"; int retval = ArgusTV::ArgusTVRPC(command, arguments, response); if (retval < 0) { XBMC->Log(LOG_DEBUG, "SetRecordingLastWatchedPosition failed. Return value: %i\n", retval); } return retval; } int SetRecordingFullyWatchedCount(const std::string& recordingfilename, int playcount) { std::string response; char tmp[512]; XBMC->Log(LOG_DEBUG, "SetRecordingFullyWatchedCount(\"%s\", %d)", recordingfilename.c_str(), playcount); snprintf(tmp, 512, "{\"RecordingFileName\":%s,\"FullyWatchedCount\":%d}", recordingfilename.c_str(), playcount); std::string arguments = tmp; std::string command = "ArgusTV/Control/SetRecordingFullyWatchedCount"; int retval = ArgusTV::ArgusTVRPC(command, arguments, response); if (retval < 0) { XBMC->Log(LOG_DEBUG, "SetRecordingFullyWatchedCount failed. Return value: %i\n", retval); } return retval; } int GetScheduleById(const std::string& id, Json::Value& response) { int retval = E_FAILED; XBMC->Log(LOG_DEBUG, "GetScheduleById"); std::string command = "ArgusTV/Scheduler/ScheduleById/" + id; retval = ArgusTV::ArgusTVJSONRPC(command, "", response); if(retval >= 0) { if (response.type() != Json::objectValue) { retval = E_FAILED; XBMC->Log(LOG_NOTICE, "GetScheduleById did not return a Json::objectValue [%d].", response.type()); } } else { XBMC->Log(LOG_NOTICE, "GetScheduleById remote call failed."); } return retval; } /** * \brief Fetch the detailed information of a guide program * \param id unique id (guid) of the program * \param response Reference to a std::string used to store the json response string */ int GetProgramById(const std::string& id, Json::Value& response) { int retval = E_FAILED; XBMC->Log(LOG_DEBUG, "GetProgramById"); std::string command = "ArgusTV/Guide/Program/" + id; retval = ArgusTV::ArgusTVJSONRPC(command, "", response); if(retval >= 0) { if (response.type() != Json::objectValue) { retval = E_FAILED; XBMC->Log(LOG_NOTICE, "GetProgramById did not return a Json::objectValue [%d].", response.type()); } } else { XBMC->Log(LOG_NOTICE, "GetProgramById remote call failed."); } return retval; } /** * \brief Fetch the list of schedules for tv or radio * \param channeltype The type of channel to fetch the list for */ int GetScheduleList(enum ChannelType channelType, Json::Value& response) { int retval = -1; XBMC->Log(LOG_DEBUG, "GetScheduleList"); // http://madcat:49943/ArgusTV/Scheduler/Schedules/0/82 char command[256]; //Format: ArgusTV/Guide/Programs/{guideChannelId}/{lowerTime}/{upperTime} snprintf(command, 256, "ArgusTV/Scheduler/Schedules/%i/%i" , channelType, Recording ); retval = ArgusTVJSONRPC(command, "", response); if(retval >= 0) { if( response.type() == Json::arrayValue) { int size = response.size(); return size; } else { XBMC->Log(LOG_DEBUG, "Unknown response format. Expected Json::arrayValue\n"); return -1; } } else { XBMC->Log(LOG_DEBUG, "GetScheduleList failed. Return value: %i\n", retval); } return retval; } /** * \brief Fetch the list of upcoming programs from type 'recording' * \currently not used */ int GetUpcomingPrograms(Json::Value& response) { int retval = -1; XBMC->Log(LOG_DEBUG, "GetUpcomingPrograms"); // http://madcat:49943/ArgusTV/Scheduler/UpcomingPrograms/82?includeCancelled=true retval = ArgusTVJSONRPC("ArgusTV/Scheduler/UpcomingPrograms/82?includeCancelled=false", "", response); if(retval >= 0) { if( response.type() == Json::arrayValue) { int size = response.size(); return size; } else { XBMC->Log(LOG_DEBUG, "Unknown response format. Expected Json::arrayValue\n"); return -1; } } else { XBMC->Log(LOG_DEBUG, "GetUpcomingPrograms failed. Return value: %i\n", retval); } return retval; } /** * \brief Fetch the list of upcoming recordings */ int GetUpcomingRecordings(Json::Value& response) { int retval = -1; XBMC->Log(LOG_DEBUG, "GetUpcomingRecordings"); // http://madcat:49943/ArgusTV/Control/UpcomingRecordings/7?includeCancelled=true retval = ArgusTVJSONRPC("ArgusTV/Control/UpcomingRecordings/7?includeActive=true", "", response); if(retval >= 0) { if( response.type() == Json::arrayValue) { int size = response.size(); return size; } else { XBMC->Log(LOG_DEBUG, "Unknown response format. Expected Json::arrayValue\n"); return -1; } } else { XBMC->Log(LOG_DEBUG, "GetUpcomingRecordings failed. Return value: %i\n", retval); } return retval; } /** * \brief Fetch the list of currently active recordings */ int GetActiveRecordings(Json::Value& response) { int retval = -1; XBMC->Log(LOG_DEBUG, "GetActiveRecordings"); retval = ArgusTVJSONRPC("ArgusTV/Control/ActiveRecordings", "", response); if(retval >= 0) { if( response.type() == Json::arrayValue) { int size = response.size(); return size; } else { XBMC->Log(LOG_DEBUG, "Unknown response format. Expected Json::arrayValue\n"); return -1; } } else { XBMC->Log(LOG_DEBUG, "GetActiveRecordings failed. Return value: %i\n", retval); } return retval; } /** * \brief Cancel a currently active recording */ int AbortActiveRecording(Json::Value& activeRecording) { int retval = -1; XBMC->Log(LOG_DEBUG, "AbortActiveRecording"); Json::StreamWriterBuilder wbuilder; std::string arguments = Json::writeString(wbuilder, activeRecording); std::string response; retval = ArgusTVRPC("ArgusTV/Control/AbortActiveRecording", arguments, response); if(retval != 0) { XBMC->Log(LOG_DEBUG, "AbortActiveRecording failed. Return value: %i\n", retval); } return retval; } /** * \brief Cancel an upcoming program */ int CancelUpcomingProgram(const std::string& scheduleid, const std::string& channelid, const time_t starttime, const std::string& upcomingprogramid) { int retval = -1; std::string response; XBMC->Log(LOG_DEBUG, "CancelUpcomingProgram"); struct tm* convert = gmtime(&starttime); struct tm tm_start = *convert; //Format: ArgusTV/Scheduler/CancelUpcomingProgram/{scheduleId}/{channelId}/{startTime}?guideProgramId={guideProgramId} char command[256]; snprintf(command, 256, "ArgusTV/Scheduler/CancelUpcomingProgram/%s/%s/%i-%02i-%02iT%02i:%02i:%02i?guideProgramId=%s" , scheduleid.c_str(), channelid.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, upcomingprogramid.c_str() ); retval = ArgusTVRPC(command, "", response); if (retval < 0) { XBMC->Log(LOG_DEBUG, "CancelUpcomingProgram failed. Return value: %i\n", retval); } 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 */ int AddOneTimeSchedule(const std::string& channelid, const time_t starttime, const std::string& title, int prerecordseconds, int postrecordseconds, int lifetime, Json::Value& response) { int retval = -1; XBMC->Log(LOG_DEBUG, "AddOneTimeSchedule"); struct tm* convert = localtime(&starttime); struct tm tm_start = *convert; // Get empty schedule from the server Json::Value newSchedule; if (ArgusTV::GetEmptySchedule(newSchedule) < 0) return retval; // Fill relevant members std::string modifiedtitle = title; StringUtils::Replace(modifiedtitle, "\"", "\\\""); 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::StreamWriterBuilder wbuilder; std::string tmparguments = Json::writeString(wbuilder, newSchedule); retval = ArgusTVJSONRPC("ArgusTV/Scheduler/SaveSchedule", tmparguments.c_str(), 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, "AddOneTimeSchedule failed. Return value: %i\n", retval); } return retval; } /** * \brief Add a xbmc timer as a manual schedule */ int AddManualSchedule(const std::string& channelid, const time_t starttime, const time_t duration, const std::string& title, int prerecordseconds, int postrecordseconds, int lifetime, Json::Value& response) { int retval = -1; XBMC->Log(LOG_DEBUG, "AddManualSchedule"); struct tm* convert = localtime(&starttime); struct tm tm_start = *convert; time_t recordingduration = duration; int duration_sec = recordingduration % 60; recordingduration /= 60; int duration_min = recordingduration % 60; recordingduration /= 60; int duration_hrs = recordingduration; // Get empty schedule from the server Json::Value newSchedule; if (ArgusTV::GetEmptySchedule(newSchedule) < 0) return retval; // Fill relevant members std::string modifiedtitle = title; StringUtils::Replace(modifiedtitle, "\"", "\\\""); 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); 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::StreamWriterBuilder wbuilder; std::string tmparguments = Json::writeString(wbuilder, newSchedule); retval = ArgusTVJSONRPC("ArgusTV/Scheduler/SaveSchedule", tmparguments, 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, "AddManualSchedule failed. Return value: %i\n", retval); } return retval; } /** * \brief Delete a ArgusTV schedule */ int DeleteSchedule(const std::string& scheduleid) { int retval = -1; std::string response; XBMC->Log(LOG_DEBUG, "DeleteSchedule"); //Format: ArgusTV/Scheduler/DeleteSchedule/d21ec04f-22e0-4bf8-accf-317ecc0fb0f9 char command[256]; snprintf(command, 256, "ArgusTV/Scheduler/DeleteSchedule/%s" , scheduleid.c_str()); retval = ArgusTVRPC(command, "", response); if (retval < 0) { XBMC->Log(LOG_DEBUG, "DeleteSchedule failed. Return value: %i\n", retval); } return retval; } /** * \brief Get the upcoming programs for a given schedule */ int GetUpcomingProgramsForSchedule(const Json::Value& schedule, Json::Value& response) { int retval = -1; XBMC->Log(LOG_DEBUG, "GetUpcomingProgramsForSchedule"); char arguments[1024]; Json::StreamWriterBuilder wbuilder; snprintf( arguments, sizeof(arguments), "{\"IncludeCancelled\":true,\"Schedule\":%s}", Json::writeString(wbuilder, schedule).c_str()); retval = ArgusTVJSONRPC("ArgusTV/Scheduler/UpcomingProgramsForSchedule", arguments, response); if(retval >= 0) { if( response.type() == Json::arrayValue) { int size = response.size(); return size; } else { XBMC->Log(LOG_DEBUG, "Unknown response format. Expected Json::arrayValue\n"); return -1; } } else { XBMC->Log(LOG_DEBUG, "GetUpcomingProgramsForSchedule failed. Return value: %i\n", retval); } 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 ARGUS keepUntilMode setting * \param lifetime the XBMC lifetime value (in days) */ int lifetimeToKeepUntilMode(int lifetime) { if (lifetime > 364) return ArgusTV::Forever; if (lifetime < 2) return ArgusTV::UntilSpaceIsNeeded; return ArgusTV::NumberOfDays; } /** * \brief Convert a XBMC Lifetime value to the ARGUS keepUntilValue setting * \param lifetime the XBMC lifetime value (in days) */ int lifetimeToKeepUntilValue(int lifetime) { if (lifetime > 364 || lifetime < 2) return 0; return lifetime; } time_t WCFDateToTimeT(const std::string& wcfdate, int& offset) { time_t ticks; char offsetc; int offsetv; if (wcfdate.empty()) { return 0; } //WCF compatible format "/Date(1290896700000+0100)/" => 2010-11-27 23:25:00 ticks = atoi(wcfdate.substr(6, 10).c_str()); //only take the first 10 chars (fits in a 32-bit time_t value) offsetc = wcfdate[19]; // + or - offsetv = atoi(wcfdate.substr(20, 4).c_str()); offset = (offsetc == '+' ? offsetv : -offsetv); return ticks; } std::string TimeTToWCFDate(const time_t thetime) { std::string wcfdate; wcfdate.clear(); if (thetime != 0) { struct tm *gmTime; time_t localEpoch, gmEpoch; /*First get local epoch time*/ localEpoch = time(NULL); /* Using local time epoch get the GM Time */ gmTime = gmtime(&localEpoch); /* Convert gm time in to epoch format */ gmEpoch = mktime(gmTime); /* get the absolute different between them */ double utcoffset = difftime(localEpoch, gmEpoch); int iOffset = (int) utcoffset; time_t utctime = thetime - iOffset; iOffset = (iOffset / 36); char ticks[15], offset[8]; snprintf(ticks, sizeof(ticks), "%010i", (int) utctime); snprintf(offset, sizeof(offset), "%s%04i", iOffset < 0 ? "-" : "+", abs(iOffset)); char result[29]; snprintf(result, sizeof(result), "\\/Date(%s000%s)\\/", ticks, offset ); wcfdate = result; } return wcfdate; } } //TODO: implement all functionality for a XBMC PVR client // Misc: //------ // -GetBackendTime // The time at the PVR Backend side // // EPG //----- // // Channels // -DeleteChannel (optional) // -RenameChannel (optional) // -MoveChannel (optional) // // Recordings //------------ // -RenameRecording // -Cutmark functions (optional) // Playback: // -OpenRecordedStream // -CloseRecordedStream // -ReadRecordedStream // -PauseRecordedStream // // Timers (schedules) //-------------------- // -RenameTimer // -UpdateTimer // // Live TV/Radio // -PauseLiveStream pvr.argustv-3.5.4-Leia/src/argustvrpc.h000066400000000000000000000302221337562352100200420ustar00rootroot00000000000000#pragma once /* * Copyright (C) 2010-2012 Marcel Groothuis, 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 this program. If not, see . * */ #include #include #include #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 #define E_EMPTYRESPONSE -2 namespace ArgusTV { enum ChannelType { Television = 0, Radio = 1 }; enum RecordingGroupMode { GroupByProgramTitle = 0, GroupBySchedule = 1, GroupByCategory = 2, GroupByChannel = 3, GroupByRecordingDay = 4 }; enum SchedulePriority { VeryLow = 0, Low = 1, Normal = 2, High = 3, VeryHigh = 4 }; enum ScheduleType { Recording = 82, // 'R' Suggestion = 83, // 'S' Alert = 45 // 'A' }; enum KeepUntilMode { UntilSpaceIsNeeded = 0, Forever = 1, NumberOfDays = 2, NumberOfEpisodes =3 }; enum VideoAspectRatio { Unknown = 0, Standard = 1, Widescreen = 2 }; enum LiveStreamResult { Succeed = 0, NoFreeCardFound = 1, ChannelTuneFailed = 2, NoReTunePossible = 3, IsScrambled = 4, UnknownError = 98, 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 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 */ int ArgusTVRPC(const std::string& command, const std::string& arguments, std::string& 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 */ int ArgusTVJSONRPC(const std::string& command, const std::string& arguments, Json::Value& json_response); /** * \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 * \return 0 on ok, -1 on a failure */ int ArgusTVRPCToFile(const std::string& command, const std::string& arguments, std::string& newfilename, long& http_response); /** * \brief Ping core service. * \param requestedApiVersion The API version the client needs, pass in Constants.ArgusTVRestApiVersion. * \return 0 if client and server are compatible, -1 if the client is too old, +1 if the client is newer than the server and -2 if the connection failed (server down?) */ int Ping(int requestedApiVersion); /** * \brief Returns information (free disk space) from all recording disks. */ int GetRecordingDisksInfo(Json::Value& response); /** * \brief Returns version information (for display only) */ int GetDisplayVersion(Json::Value& response); /** * \brief GetPluginServices Get all configured plugin services. {activeOnly} = Set to true to only receive active plugins. * \brief Returns an array containing zero or more plugin services. * \param activeonly set to true to only receive active plugins * \param response Reference to a std::string used to store the json response string * \return 0 when successful */ int GetPluginServices(bool activeonly, Json::Value& response); /** * \brief AreRecordingSharesAccessible * \param thisplugin the plugin to check * \param response Reference to a std::string used to store the json response string * \return 0 when successful */ int AreRecordingSharesAccessible(Json::Value& thisplugin, Json::Value& response); /** * \brief TuneLiveStream * \param channel_id The ArgusTV ChannelID of the channel * \param stream Reference to a string that will point to the tsbuffer file/RTSP stream */ int TuneLiveStream(const std::string& channel_id, ChannelType channeltype, const std::string channelname, std::string& stream); /** * \brief Stops the last tuned live stream */ int StopLiveStream(); /** * \brief Returns the URL of the current live stream */ std::string GetLiveStreamURL(void); /** * \brief Returns the Signal information of the current live stream */ int SignalQuality(Json::Value& response); /** * \brief Tell the recorder/tuner we are still showing this stream and to keep it alive. Call this every 30 seconds or so. */ bool KeepLiveStreamAlive(); /** * \brief Fetch the list of availalable channels for tv or radio * \param channeltype The type of channel to fetch the list for */ int GetChannelList(enum ChannelType channelType, Json::Value& response); /** * \brief Fetch the EPG data for the given guidechannel 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 */ int GetEPGData(const std::string& guidechannel_id, struct tm epg_start, struct tm epg_end, Json::Value& response); /** * \brief Fetch the recording groups sorted by title * \param response Reference to a std::string used to store the json response string */ int GetRecordingGroupByTitle(Json::Value& response); /** * \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 GetFullRecordingsForTitle(const std::string& title, Json::Value& response); /** * \brief Fetch the detailed information of a recorded show * \param id unique id (guid) of the recording * \param response Reference to a std::string used to store the json response string */ int GetRecordingById(const std::string& id, Json::Value& response); /** * \brief Mark this recording as watched * \param recordingpath */ int SetRecordingLastWatched(const std::string& recordingfilename); /** * \brief Get the last watched position for this recording * \param recordingfilename full UNC path of the recording file * \param response Reference to a std::string used to store the json response string * \return last watched position in seconds, -1 on a failure */ int GetRecordingLastWatchedPosition(const std::string& recordingfilename, Json::Value& response); /** * \brief Save the last watched position for this recording * \param recordingfilename full UNC path of the recording file * \param lastwatchedposition last watched position in seconds */ int SetRecordingLastWatchedPosition(const std::string& recordingfilename, int lastwatchedposition); /** * \brief Set the play count for this recording * \param recordingfilename full UNC path of the recording file * \param playcount the number of times this recording was played */ int SetRecordingFullyWatchedCount(const std::string& recordingfilename, int playcount); /** * \brief Delete the recording on the pvr backend * \param recordingfilename UNC filename to delete */ int DeleteRecording(const std::string recordingfilename); /** * \brief Fetch the detailed information of a schedule * \param id unique id (guid) of the schedule * \param response Reference to a std::string used to store the json response string */ int GetScheduleById(const std::string& id, Json::Value& response); /** * \brief Fetch the detailed information of a guide program * \param id unique id (guid) of the program * \param response Reference to a std::string used to store the json response string */ int GetProgramById(const std::string& id, Json::Value& response); /** * \brief Fetch the list of schedules for tv or radio * \param channeltype The type of channel to fetch the list for */ int GetScheduleList(enum ChannelType channelType, Json::Value& response); /** * \brief Fetch the list of upcoming programs from type 'recording' * \currently not used */ int GetUpcomingPrograms(Json::Value& response); /** * \brief Fetch the list of upcoming recordings */ int GetUpcomingRecordings(Json::Value& response); /** * \brief Fetch the list of currently active recordings */ int GetActiveRecordings(Json::Value& response); /** * \brief Cancel a currently active recording */ int AbortActiveRecording(Json::Value& activeRecording); /** * \brief Cancel an upcoming program */ 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); /** * \brief Add a xbmc timer as a manual schedule */ int AddManualSchedule(const std::string& channelid, const time_t starttime, const time_t duration, const std::string& title, int prerecordseconds, int postrecordseconds, int lifetime, Json::Value& response); /** * \brief Delete a ArgusTV schedule */ int DeleteSchedule(const std::string& scheduleid); /** * \brief Get the upcoming programs for a given schedule */ 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 ARGUS */ int RequestTVChannelGroups(Json::Value& response); /* * \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 ARGUS * \param channelGroupId GUID of the channel group */ int RequestChannelGroupMembers(const std::string& channelGroupId, Json::Value& response); /* * \brief Get the logo for a channel * \param channelGUID GUID of the channel */ std::string GetChannelLogo(const std::string& channelGUID); /* * \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 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); } //namespace ArgusTV pvr.argustv-3.5.4-Leia/src/channel.cpp000066400000000000000000000025341337562352100176120ustar00rootroot00000000000000/* * Copyright (C) 2005-2010 Team XBMC * http://www.xbmc.org * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include #include "channel.h" #include "utils.h" #include #include cChannel::cChannel() { name = ""; guid = ""; type = ArgusTV::Television; lcn = 0; id = 0; guidechannelid = ""; } cChannel::~cChannel() { } bool cChannel::Parse(const Json::Value& data) { //Json::printValueTree(data); name = data["DisplayName"].asString(); type = (ArgusTV::ChannelType) data["ChannelType"].asInt(); lcn = data["LogicalChannelNumber"].asInt(); id = data["Id"].asInt(); guid = data["ChannelId"].asString(); guidechannelid = data["GuideChannelId"].asString(); return true; } pvr.argustv-3.5.4-Leia/src/channel.h000066400000000000000000000026611337562352100172600ustar00rootroot00000000000000#pragma once /* * Copyright (C) 2010 Marcel Groothuis * * 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" class cChannel { private: std::string name; std::string guid; std::string guidechannelid; ArgusTV::ChannelType type; int lcn; int id; public: cChannel(); virtual ~cChannel(); bool Parse(const Json::Value& data); const char *Name(void) const { return name.c_str(); } const std::string& Guid(void) const { return guid; } int LCN(void) const { return lcn; } ArgusTV::ChannelType Type(void) const { return type; } int ID(void) const { return id; } const std::string& GuideChannelID(void) const { return guidechannelid; }; }; pvr.argustv-3.5.4-Leia/src/client.cpp000066400000000000000000000461661337562352100174710ustar00rootroot00000000000000/* * Copyright (C) 2010-2011 Marcel Groothuis, 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 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 "client.h" #include "xbmc_pvr_dll.h" #include "pvrclient-argustv.h" #include "utils.h" #include "uri.h" #include "p8-platform/util/util.h" using namespace std; using namespace ADDON; /* User adjustable settings are saved here. * Default values are defined inside client.h * and exported to the other source files. */ std::string g_szHostname = DEFAULT_HOST; ///< The Host name or IP of the ARGUS TV server int g_iPort = DEFAULT_PORT; ///< The TVServerXBMC listening port (default: 49943) int g_iConnectTimeout = DEFAULT_TIMEOUT; ///< The Socket connection timeout bool g_bRadioEnabled = DEFAULT_RADIO; ///< Send also Radio channels list to XBMC bool g_bUseFolder = DEFAULT_USEFOLDER; ///< Use folders for single recordings ///< ARGUS TV uses shares to communicate with clients std::string g_szUser = DEFAULT_USER; ///< Windows user account used to access share std::string g_szPass = DEFAULT_PASS; ///< Windows user password used to access share ///< Leave empty to use current user when running on Windows int g_iTuneDelay = DEFAULT_TUNEDELAY; ///< Number of milliseconds to delay after tuning a channel std::string g_szBaseURL; // ///* Client member variables */ ADDON_STATUS m_CurStatus = ADDON_STATUS_UNKNOWN; cPVRClientArgusTV *g_client = NULL; bool g_bCreated = false; std::string g_szUserPath = ""; std::string g_szClientPath = ""; CHelper_libXBMC_addon *XBMC = NULL; CHelper_libXBMC_pvr *PVR = NULL; extern "C" { /*********************************************************** * Standard AddOn related public library functions ***********************************************************/ //-- Create ------------------------------------------------------------------- // Called after loading of the dll, all steps to become Client functional // must be performed here. //----------------------------------------------------------------------------- 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_INFO, "Creating the ARGUS TV PVR-client"); m_CurStatus = ADDON_STATUS_UNKNOWN; g_client = new cPVRClientArgusTV(); g_szUserPath = pvrprops->strUserPath; g_szClientPath = pvrprops->strClientPath; /* Read ARGUS TV PVR client settings */ // See also addons/pvr.argustv/resources/settings.xml // and addons/pvr.argustv/resources/language/.../strings.xml /* Read setting "host" from settings.xml */ char buffer[1024]; if (XBMC->GetSetting("host", &buffer)) { g_szHostname = buffer; uri::decode(g_szHostname); } 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 "port" from settings.xml */ if (!XBMC->GetSetting("port", &g_iPort)) { /* If setting is unknown fallback to defaults */ XBMC->Log(LOG_ERROR, "Couldn't get 'port' setting, falling back to '49943' as default"); g_iPort = DEFAULT_PORT; } /* Read setting "useradio" from settings.xml */ if (!XBMC->GetSetting("useradio", &g_bRadioEnabled)) { /* If setting is unknown fallback to defaults */ XBMC->Log(LOG_ERROR, "Couldn't get 'useradio' setting, falling back to 'true' as default"); g_bRadioEnabled = DEFAULT_RADIO; } /* 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 "user" from settings.xml */ if (XBMC->GetSetting("user", buffer)) g_szUser = buffer; else g_szUser = ""; buffer[0] = 0; /* Set the end of string */ /* read setting "pass" from settings.xml */ if (XBMC->GetSetting("pass", buffer)) g_szPass = buffer; else g_szPass = ""; /* Read setting "tunedelay" from settings.xml */ if (!XBMC->GetSetting("tunedelay", &g_iTuneDelay)) { /* If setting is unknown fallback to defaults */ XBMC->Log(LOG_ERROR, "Couldn't get 'tunedelay' setting, falling back to '200' as default"); g_iTuneDelay = DEFAULT_TUNEDELAY; } /* Read setting "usefolder" from settings.xml */ if (!XBMC->GetSetting("usefolder", &g_bUseFolder)) { /* If setting is unknown fallback to defaults */ XBMC->Log(LOG_ERROR, "Couldn't get 'usefolder' setting, falling back to 'false' as default"); g_bUseFolder = DEFAULT_USEFOLDER; } /* Connect to ARGUS TV */ if (!g_client->Connect()) { SAFE_DELETE(g_client); SAFE_DELETE(PVR); SAFE_DELETE(XBMC); m_CurStatus = ADDON_STATUS_LOST_CONNECTION; } else { m_CurStatus = ADDON_STATUS_OK; } g_bCreated = true; return m_CurStatus; } //-- Destroy ------------------------------------------------------------------ // Used during destruction of the client, all steps to do clean and safe Create // again must be done. //----------------------------------------------------------------------------- void ADDON_Destroy() { if ((g_bCreated) && (g_client)) { g_client->Disconnect(); SAFE_DELETE(g_client); g_bCreated = false; } SAFE_DELETE(PVR); SAFE_DELETE(XBMC); m_CurStatus = ADDON_STATUS_UNKNOWN; } //-- GetStatus ---------------------------------------------------------------- // Report the current Add-On Status to XBMC //----------------------------------------------------------------------------- ADDON_STATUS ADDON_GetStatus() { return m_CurStatus; } //-- SetSetting --------------------------------------------------------------- // 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) { string str = settingName; // 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 (!g_bCreated) return ADDON_STATUS_OK; 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 == "port") { XBMC->Log(LOG_INFO, "Changed Setting 'port' from %u to %u", g_iPort, *(int*) settingValue); if (g_iPort != *(int*) settingValue) { g_iPort = *(int*) settingValue; return ADDON_STATUS_NEED_RESTART; } } else if (str == "useradio") { XBMC->Log(LOG_INFO, "Changed setting 'useradio' from %u to %u", g_bRadioEnabled, *(bool*) settingValue); g_bRadioEnabled = *(bool*) settingValue; } 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 == "user") { XBMC->Log(LOG_INFO, "Changed Setting 'user' from %s to %s", g_szUser.c_str(), (const char*) settingValue); g_szUser = (const char*) settingValue; } else if (str == "pass") { XBMC->Log(LOG_INFO, "Changed Setting 'pass' from %s to %s", g_szPass.c_str(), (const char*) settingValue); g_szPass = (const char*) settingValue; } else if (str == "tunedelay") { XBMC->Log(LOG_INFO, "Changed setting 'tunedelay' from %u to %u", g_iTuneDelay, *(int*) settingValue); g_iTuneDelay = *(int*) settingValue; } else if (str == "usefolder") { XBMC->Log(LOG_INFO, "Changed setting 'usefolder' from %u to %u", g_bUseFolder, *(bool*)settingValue); g_bUseFolder = *(bool*)settingValue; } return ADDON_STATUS_OK; } /*********************************************************** * PVR Client AddOn specific public library functions ***********************************************************/ void OnSystemSleep() { } void OnSystemWake() { } void OnPowerSavingActivated() { } void OnPowerSavingDeactivated() { } //-- GetAddonCapabilities ----------------------------------------------------- // Tell XBMC our requirements //----------------------------------------------------------------------------- PVR_ERROR GetAddonCapabilities(PVR_ADDON_CAPABILITIES *pCapabilities) { XBMC->Log(LOG_DEBUG, "->GetProperties()"); pCapabilities->bSupportsEPG = true; pCapabilities->bSupportsRecordings = true; pCapabilities->bSupportsRecordingsUndelete = false; pCapabilities->bSupportsTimers = true; pCapabilities->bSupportsTV = true; pCapabilities->bSupportsRadio = g_bRadioEnabled; pCapabilities->bSupportsChannelGroups = true; pCapabilities->bHandlesInputStream = true; pCapabilities->bHandlesDemuxing = false; pCapabilities->bSupportsChannelScan = false; pCapabilities->bSupportsLastPlayedPosition = true; pCapabilities->bSupportsRecordingPlayCount = true; pCapabilities->bSupportsRecordingsRename = true; pCapabilities->bSupportsRecordingsLifetimeChange = false; pCapabilities->bSupportsDescrambleInfo = false; return PVR_ERROR_NO_ERROR; } PVR_ERROR GetStreamProperties(PVR_STREAM_PROPERTIES *pProperties) { NOTUSED(pProperties); return PVR_ERROR_NOT_IMPLEMENTED; } //-- GetBackendName ----------------------------------------------------------- // Return the Name of the Backend //----------------------------------------------------------------------------- const char * GetBackendName(void) { return g_client->GetBackendName(); } //-- GetBackendVersion -------------------------------------------------------- // Return the Version of the Backend as String //----------------------------------------------------------------------------- const char * GetBackendVersion(void) { return g_client->GetBackendVersion(); } //-- GetConnectionString ------------------------------------------------------ // Return a String with connection info, if available //----------------------------------------------------------------------------- const char * GetConnectionString(void) { return g_client->GetConnectionString(); } //-- GetBackendHostname ------------------------------------------------------- // Return a String with the backend host name //----------------------------------------------------------------------------- const char * GetBackendHostname(void) { return g_szHostname.c_str(); } //-- GetDriveSpace ------------------------------------------------------------ // Return the Total and Free Drive space on the PVR Backend //----------------------------------------------------------------------------- PVR_ERROR GetDriveSpace(long long *iTotal, long long *iUsed) { return g_client->GetDriveSpace(iTotal, iUsed); } PVR_ERROR GetBackendTime(time_t *localTime, int *gmtOffset) { return g_client->GetBackendTime(localTime, gmtOffset); } PVR_ERROR OpenDialogChannelScan() { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR CallMenuHook(const PVR_MENUHOOK &menuhook, const PVR_MENUHOOK_DATA &item) { NOTUSED(menuhook); NOTUSED(item); return PVR_ERROR_NOT_IMPLEMENTED; } /*******************************************/ /** PVR EPG Functions **/ PVR_ERROR GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart, time_t iEnd) { return g_client->GetEpg(handle, channel, iStart, iEnd); } /*******************************************/ /** PVR Channel Functions **/ int GetChannelsAmount() { return g_client->GetNumChannels(); } PVR_ERROR GetChannels(ADDON_HANDLE handle, bool bRadio) { return g_client->GetChannels(handle, bRadio); } PVR_ERROR DeleteChannel(const PVR_CHANNEL &channel) { NOTUSED(channel); return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR RenameChannel(const PVR_CHANNEL &channel) { NOTUSED(channel); return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR OpenDialogChannelSettings(const PVR_CHANNEL &channelinfo) { NOTUSED(channelinfo); return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR OpenDialogChannelAdd(const PVR_CHANNEL &channelinfo) { NOTUSED(channelinfo); return PVR_ERROR_NOT_IMPLEMENTED; } /*******************************************/ /** PVR Channel group Functions **/ int GetChannelGroupsAmount(void) { return g_client->GetChannelGroupsAmount(); } PVR_ERROR GetChannelGroups(ADDON_HANDLE handle, bool bRadio) { return g_client->GetChannelGroups(handle, bRadio); } PVR_ERROR GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group) { return g_client->GetChannelGroupMembers(handle, group); } /*******************************************/ /** PVR Recording Functions **/ int GetRecordingsAmount(bool deleted) { return g_client->GetNumRecordings(); } PVR_ERROR GetRecordings(ADDON_HANDLE handle, bool deleted) { return g_client->GetRecordings(handle); } PVR_ERROR DeleteRecording(const PVR_RECORDING &recording) { return g_client->DeleteRecording(recording); } PVR_ERROR RenameRecording(const PVR_RECORDING &recording) { return g_client->RenameRecording(recording); } PVR_ERROR SetRecordingLastPlayedPosition(const PVR_RECORDING &recording, int lastplayedposition) { return g_client->SetRecordingLastPlayedPosition(recording, lastplayedposition); } int GetRecordingLastPlayedPosition(const PVR_RECORDING &recording) { return g_client->GetRecordingLastPlayedPosition(recording); } PVR_ERROR SetRecordingPlayCount(const PVR_RECORDING &recording, int count) { return g_client->SetRecordingPlayCount(recording, count); } /*******************************************/ /** PVR Timer Functions **/ PVR_ERROR GetTimerTypes(PVR_TIMER_TYPE types[], int *size) { /* TODO: Implement this to get support for the timer features introduced with PVR API 1.9.7 */ return PVR_ERROR_NOT_IMPLEMENTED; } int GetTimersAmount(void) { return g_client->GetNumTimers(); } PVR_ERROR GetTimers(ADDON_HANDLE handle) { /* TODO: Change implementation to get support for the timer features introduced with PVR API 1.9.7 */ return g_client->GetTimers(handle); } PVR_ERROR AddTimer(const PVR_TIMER &timer) { return g_client->AddTimer(timer); } PVR_ERROR DeleteTimer(const PVR_TIMER &timer, bool bForceDelete) { return g_client->DeleteTimer(timer, bForceDelete); } PVR_ERROR UpdateTimer(const PVR_TIMER &timer) { return g_client->UpdateTimer(timer); } /*******************************************/ /** PVR Live Stream Functions **/ bool OpenLiveStream(const PVR_CHANNEL &channelinfo) { return g_client->OpenLiveStream(channelinfo); } void CloseLiveStream() { return g_client->CloseLiveStream(); } int ReadLiveStream(unsigned char *pBuffer, unsigned int iBufferSize) { return g_client->ReadLiveStream(pBuffer, iBufferSize); } long long SeekLiveStream(long long pos, int whence) { return g_client->SeekLiveStream(pos, whence); } long long LengthLiveStream(void) { return g_client->LengthLiveStream(); } PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS &signalStatus) { return g_client->SignalStatus(signalStatus); } /*******************************************/ /** PVR Recording Stream Functions **/ bool OpenRecordedStream(const PVR_RECORDING &recording) { return g_client->OpenRecordedStream(recording); } void CloseRecordedStream(void) { return g_client->CloseRecordedStream(); } int ReadRecordedStream(unsigned char *pBuffer, unsigned int iBufferSize) { return g_client->ReadRecordedStream(pBuffer, iBufferSize); } long long SeekRecordedStream(long long iPosition, int iWhence) { return g_client->SeekRecordedStream(iPosition, iWhence); } long long LengthRecordedStream(void) { return g_client->LengthRecordedStream(); } const char * GetLiveStreamURL(const PVR_CHANNEL &channel) { return g_client->GetLiveStreamURL(channel); } bool CanPauseStream(void) { if (g_client) return g_client->CanPauseAndSeek(); return false; } void PauseStream(bool bPaused) { if (g_client) g_client->PauseStream(bPaused); } bool CanSeekStream(void) { if (g_client) return g_client->CanPauseAndSeek(); return false; } /** UNUSED API FUNCTIONS */ DemuxPacket* DemuxRead(void) { return NULL; } void DemuxAbort(void) {} void DemuxReset(void) {} void DemuxFlush(void) {} PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY[], int*) { return PVR_ERROR_NOT_IMPLEMENTED; }; bool SeekTime(double,bool,double*) { return false; } void SetSpeed(int) {}; bool IsTimeshifting(void) { return false; } bool IsRealTimeStream() { return true; } PVR_ERROR UndeleteRecording(const PVR_RECORDING& recording) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR DeleteAllRecordingsFromTrash() { return PVR_ERROR_NOT_IMPLEMENTED;} PVR_ERROR SetEPGTimeFrame(int) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR GetDescrambleInfo(PVR_DESCRAMBLE_INFO*) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR SetRecordingLifetime(const PVR_RECORDING*) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR GetStreamTimes(PVR_STREAM_TIMES*) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR GetChannelStreamProperties(const PVR_CHANNEL*, PVR_NAMED_VALUE*, unsigned int*) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR GetRecordingStreamProperties(const PVR_RECORDING*, PVR_NAMED_VALUE*, unsigned int*) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR IsEPGTagPlayable(const EPG_TAG*, bool*) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR IsEPGTagRecordable(const EPG_TAG*, bool*) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR GetEPGTagStreamProperties(const EPG_TAG*, PVR_NAMED_VALUE*, unsigned int*) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR GetEPGTagEdl(const EPG_TAG* epgTag, PVR_EDL_ENTRY edl[], int *size) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR GetStreamReadChunkSize(int* chunksize) { return PVR_ERROR_NOT_IMPLEMENTED; } } //end extern "C" pvr.argustv-3.5.4-Leia/src/client.h000066400000000000000000000042421337562352100171230ustar00rootroot00000000000000#pragma once /* * Copyright (C) 2005-2010 Team XBMC * http://www.xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, 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 * */ #ifndef CLIENT_H #define CLIENT_H #include "libXBMC_addon.h" #include "libXBMC_pvr.h" #define DEFAULT_HOST "127.0.0.1" #define DEFAULT_PORT 49943 #define DEFAULT_RADIO true #define DEFAULT_TIMEOUT 10 #define DEFAULT_USER "Guest" #define DEFAULT_PASS "" #define DEFAULT_TUNEDELAY 200 #define DEFAULT_USEFOLDER false extern bool g_bCreated; ///< Shows that the Create function was successfully called extern std::string g_szUserPath; ///< The Path to the user directory inside user profile extern std::string g_szClientPath; ///< The Path where this driver is located /* Client Settings */ extern std::string g_szHostname; extern int g_iPort; extern int g_iConnectTimeout; extern bool g_bRadioEnabled; extern std::string g_szUser; extern std::string g_szPass; extern int g_iTuneDelay; extern bool g_bUseFolder; extern std::string g_szBaseURL; extern ADDON::CHelper_libXBMC_addon *XBMC; extern CHelper_libXBMC_pvr *PVR; /*! * @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)) #endif /* CLIENT_H */ pvr.argustv-3.5.4-Leia/src/copying.txt000066400000000000000000001045131337562352100177070ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 3 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 . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . pvr.argustv-3.5.4-Leia/src/epg.cpp000066400000000000000000000056071337562352100167610ustar00rootroot00000000000000/* * Copyright (C) 2010 Marcel Groothuis * * 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 #include using namespace std; #include "epg.h" #include "utils.h" #include "client.h" #include "pvrclient-argustv.h" using namespace ADDON; cEpg::cEpg() : m_starttime(0), m_endtime(0), m_utcdiff(0) { } cEpg::~cEpg() { } void cEpg::Reset() { m_guideprogramid.clear(); m_title.clear(); m_subtitle.clear(); m_description.clear(); m_genre.clear(); m_starttime = 0; m_endtime = 0; } bool cEpg::Parse(const Json::Value& data) { try { int offset; // All possible fields: //.Category="" //.EpisodeNumber=null //.EpisodeNumberDisplay="" //.EpisodeNumberTotal=null //.EpisodePart=null //.EpisodePartTotal=null //.GuideChannelId="26aa19b2-9d5d-4549-9ad8-ab6b908d6127" //.GuideProgramId="5bd17a57-f1f7-df11-862d-005056c00008" //.IsPremiere=false //.IsRepeat=false //.Rating="" //.SeriesNumber=null //.StarRating=null //.StartTime="/Date(1290896700000+0100)/" Database: 2010-11-27 23:25:00 //.StopTime="/Date(1290899100000+0100)/" Database: 2010-11-28 00:05:00 //.SubTitle="" //.Title="NOS Studio Sport" //.VideoAspect=0 m_guideprogramid = data["GuideProgramId"].asString(); m_title = data["Title"].asString(); m_subtitle = data["SubTitle"].asString(); // TODO: Until the xbmc EPG gui starts using the episode names, we add them to the title if (m_subtitle.size() > 0) { m_title = m_title + " (" + m_subtitle + ")"; } m_description = data["Description"].asString(); m_genre = data["Category"].asString(); // Dates are returned in a WCF compatible format ("/Date(9991231231+0100)/") std::string starttime = data["StartTime"].asString(); std::string endtime = data["StopTime"].asString(); m_starttime = ArgusTV::WCFDateToTimeT(starttime, offset); m_endtime = ArgusTV::WCFDateToTimeT(endtime, offset); //XBMC->Log(LOG_DEBUG, "Program: %s,%s Start: %s", m_title.c_str(), m_subtitle.c_str(), ctime(&m_starttime)); //XBMC->Log(LOG_DEBUG, "End: %s", ctime(&m_endtime)); return true; } catch(std::exception &e) { XBMC->Log(LOG_ERROR, "Exception '%s' during parse EPG json data.", e.what()); } return false; } pvr.argustv-3.5.4-Leia/src/epg.h000066400000000000000000000033111337562352100164140ustar00rootroot00000000000000#pragma once /* * Copyright (C) 2010 Marcel Groothuis * * 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 * */ #ifndef __EPG_H #define __EPG_H #include #include "xbmc_addon_types.h" #include "libXBMC_addon.h" #include "libXBMC_pvr.h" #include class cEpg { private: std::string m_guideprogramid; std::string m_title; std::string m_subtitle; std::string m_description; std::string m_genre; time_t m_starttime; time_t m_endtime; time_t m_utcdiff; public: cEpg(); virtual ~cEpg(); void Reset(); bool Parse(const Json::Value& data); const std::string& UniqueId(void) const { return m_guideprogramid; } time_t StartTime(void) const { return m_starttime; } time_t EndTime(void) const { return m_endtime; } const char *Title(void) const { return m_title.c_str(); } const char *Subtitle(void) const { return m_subtitle.c_str(); } const char *Description(void) const { return m_description.c_str(); } const char *Genre(void) const { return m_genre.c_str(); } }; #endif //__EPG_H pvr.argustv-3.5.4-Leia/src/guideprogram.cpp000066400000000000000000000056261337562352100206740ustar00rootroot00000000000000/* * Copyright (C) 2011 Marcel Groothuis, Fho * * 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 "guideprogram.h" cGuideProgram::cGuideProgram(void) { actors = ""; category = ""; description = ""; directors = ""; episodenumber = 0; episodenumberdisplay = ""; episodenumbertotal = 0; episodepart = 0; episodeparttotal = 0; guidechannelid = ""; guideprogramid = ""; ischanged = false; isdeleted = false; ispremiere = false; isrepeat = false; lastmodifiedtime = 0; rating = ""; seriesnumber = 0; starrating = 0.0; starttime = 0; stoptime = 0; subtitle = ""; title = ""; videoaspect = ArgusTV::Unknown; } cGuideProgram::~cGuideProgram(void) { } bool cGuideProgram::Parse(const Json::Value& data) { int offset; std::string t; //actors = data["Actors"]. .asString(); category = data["Category"].asString(); description = data["Description"].asString(); //directors = data["Directors"].asString(); episodenumber = data["EpisodeNumber"].asInt(); episodenumberdisplay = data["EpisodeNumberDisplay"].asString(); episodenumbertotal = data["EpisodeNumberTotal"].asInt(); episodepart = data["EpisodePart"].asInt(); episodeparttotal = data["EpisodePartTotal"].asInt(); guidechannelid = data["GuideChannelId"].asString(); guideprogramid = data["GuideProgramId"].asString(); ischanged = data["IsChanged"].asBool(); isdeleted = data["IsDeleted"].asBool(); ispremiere = data["IsPremiere"].asBool(); isrepeat = data["IsRepeat"].asBool(); t = data["LastModifiedTime"].asString(); lastmodifiedtime = ArgusTV::WCFDateToTimeT(t, offset); lastmodifiedtime += ((offset/100)*3600); rating = data["Rating"].asString(); 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; } pvr.argustv-3.5.4-Leia/src/guideprogram.h000066400000000000000000000057351337562352100203420ustar00rootroot00000000000000#pragma once /* * Copyright (C) 2011 Marcel Groothuis, FHo * * 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" class cGuideProgram { private: std::string actors; std::string category; std::string description; std::string directors; int episodenumber; std::string episodenumberdisplay; int episodenumbertotal; int episodepart; int episodeparttotal; std::string guidechannelid; std::string guideprogramid; bool ischanged; bool isdeleted; bool ispremiere; bool isrepeat; time_t lastmodifiedtime; std::string rating; int seriesnumber; double starrating; time_t starttime; time_t stoptime; std::string subtitle; std::string title; ArgusTV::VideoAspectRatio videoaspect; public: cGuideProgram(void); virtual ~cGuideProgram(void); bool Parse(const Json::Value& data); const char *Actors(void) const { return actors.c_str(); } const char *Category(void) const { return category.c_str(); } const char *Description(void) const { return description.c_str(); } const char *Directors(void) const { return directors.c_str(); } 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; } const std::string& GuideChannelId(void) const { return guidechannelid; } const std::string& GuideProgramId(void) const { return guideprogramid; } bool IsChanged(void) const { return ischanged; } bool IsDeleted(void) const { return isdeleted; } bool IsPremiere(void) const { return ispremiere; } bool IsRepeat(void) const { return isrepeat; } const char *Rating(void) const { return rating.c_str(); } 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; } }; pvr.argustv-3.5.4-Leia/src/lib/000077500000000000000000000000001337562352100162405ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/src/lib/tsreader/000077500000000000000000000000001337562352100200515ustar00rootroot00000000000000pvr.argustv-3.5.4-Leia/src/lib/tsreader/CMakeLists.txt000066400000000000000000000005641337562352100226160ustar00rootroot00000000000000PROJECT(TSReader) ENABLE_LANGUAGE(CXX) CMAKE_MINIMUM_REQUIRED(VERSION 2.6) # Source files SET(SOURCES FileReader.cpp MultiFileReader.cpp TSReader.cpp) # Header files SET(HEADERS FileReader.h MultiFileReader.h TSReader.h) SOURCE_GROUP("Header Files" FILES ${HEADERS}) ADD_LIBRARY(tsreader STATIC ${HEADERS} ${SOURCES}) pvr.argustv-3.5.4-Leia/src/lib/tsreader/FileReader.cpp000066400000000000000000000136741337562352100225720ustar00rootroot00000000000000/* * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ************************************************************************* * This file is a modified version from Team MediaPortal's * TsReader DirectShow filter * MediaPortal is a GPL'ed HTPC-Application * Copyright (C) 2005-2012 Team MediaPortal * http://www.team-mediaportal.com * * Changes compared to Team MediaPortal's version: * - Code cleanup for PVR addon usage * - Code refactoring for cross platform usage ************************************************************************* * This file originates from TSFileSource, a GPL directshow push * source filter that provides an MPEG transport stream output. * Copyright (C) 2005-2006 nate, bear * http://forums.dvbowners.com/ */ #include "FileReader.h" #include "client.h" //for XBMC->Log #include //std::min, std::max #include "p8-platform/util/timeutils.h" // for usleep using namespace ADDON; namespace ArgusTV { /* indicate that caller can handle truncated reads, where function returns before entire buffer has been filled */ #define READ_TRUNCATED 0x01 /* indicate that that caller support read in the minimum defined chunk size, this disables internal cache then */ #define READ_CHUNKED 0x02 /* use cache to access this file */ #define READ_CACHED 0x04 /* open without caching. regardless to file type. */ #define READ_NO_CACHE 0x08 /* calcuate bitrate for file while reading */ #define READ_BITRATE 0x10 FileReader::FileReader() : m_hFile(NULL), m_pFileName(0), m_fileSize(0), m_fileStartPos(0), m_bDebugOutput(false) { } FileReader::~FileReader() { CloseFile(); if (m_pFileName) delete m_pFileName; } long FileReader::GetFileName(char* *lpszFileName) { *lpszFileName = m_pFileName; return S_OK; } long FileReader::SetFileName(const char *pszFileName) { if (strlen(pszFileName) > MAX_PATH) return ERROR_FILENAME_EXCED_RANGE; // Take a copy of the filename if (m_pFileName) { delete[] m_pFileName; m_pFileName = NULL; } m_pFileName = new char[1 + strlen(pszFileName)]; if (m_pFileName == NULL) return E_OUTOFMEMORY; strncpy(m_pFileName, pszFileName, strlen(pszFileName) + 1); return S_OK; } // // OpenFile // // Opens the file ready for streaming // long FileReader::OpenFile() { int Tmo = 25; //5 in MediaPortal // Is the file already opened if (!IsFileInvalid()) { XBMC->Log(LOG_NOTICE, "FileReader::OpenFile() file already open"); return S_OK; } // Has a filename been set yet if (m_pFileName == NULL) { XBMC->Log(LOG_ERROR, "FileReader::OpenFile() no filename"); return ERROR_INVALID_NAME; } XBMC->Log(LOG_DEBUG, "FileReader::OpenFile() Trying to open %s\n", m_pFileName); do { XBMC->Log(LOG_INFO, "FileReader::OpenFile() %s.", m_pFileName); void* fileHandle = XBMC->OpenFile(m_pFileName, READ_CHUNKED); if (fileHandle) { m_hFile = fileHandle; break; } // Is this still needed on Windows? //CStdStringW strWFile = UTF8Util::ConvertUTF8ToUTF16(m_pFileName); usleep(20000); } while (--Tmo); if (Tmo) { if (Tmo < 4) // 1 failed + 1 succeded is quasi-normal, more is a bit suspicious ( disk drive too slow or problem ? ) XBMC->Log(LOG_DEBUG, "FileReader::OpenFile(), %d tries to succeed opening %ws.", 6 - Tmo, m_pFileName); } else { XBMC->Log(LOG_ERROR, "FileReader::OpenFile(), open file %s failed.", m_pFileName); return S_FALSE; } XBMC->Log(LOG_DEBUG, "%s: OpenFile(%s) succeeded.", __FUNCTION__, m_pFileName); return S_OK; } // Open // // CloseFile // // Closes any dump file we have opened // long FileReader::CloseFile() { if (IsFileInvalid()) { return S_OK; } if (m_hFile) { XBMC->CloseFile(m_hFile); m_hFile = NULL; } return S_OK; } // CloseFile inline bool FileReader::IsFileInvalid() { return m_hFile == NULL; } int64_t FileReader::SetFilePointer(int64_t llDistanceToMove, unsigned long dwMoveMethod) { //XBMC->Log(LOG_DEBUG, "%s: distance %d method %d.", __FUNCTION__, llDistanceToMove, dwMoveMethod); int64_t rc = XBMC->SeekFile(m_hFile, llDistanceToMove, dwMoveMethod); //XBMC->Log(LOG_DEBUG, "%s: distance %d method %d returns %d.", __FUNCTION__, llDistanceToMove, dwMoveMethod, rc); return rc; } int64_t FileReader::GetFilePointer() { return XBMC->GetFilePosition(m_hFile); } long FileReader::Read(unsigned char* pbData, unsigned long lDataLength, unsigned long *dwReadBytes) { *dwReadBytes = XBMC->ReadFile(m_hFile, (void*)pbData, lDataLength);//Read file data into buffer //XBMC->Log(LOG_DEBUG, "%s: requested read length %d actually read %d.", __FUNCTION__, lDataLength, *dwReadBytes); if (*dwReadBytes < lDataLength) { XBMC->Log(LOG_DEBUG, "FileReader::Read() read too less bytes"); return S_FALSE; } return S_OK; } void FileReader::SetDebugOutput(bool bDebugOutput) { m_bDebugOutput = bDebugOutput; } int64_t FileReader::GetFileSize() { return XBMC->GetFileLength(m_hFile); } void FileReader::OnZap(void) { SetFilePointer(0, FILE_END); } } pvr.argustv-3.5.4-Leia/src/lib/tsreader/FileReader.h000066400000000000000000000046711337562352100222340ustar00rootroot00000000000000#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 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ************************************************************************* * This file is a modified version from Team MediaPortal's * TsReader DirectShow filter * MediaPortal is a GPL'ed HTPC-Application * Copyright (C) 2005-2012 Team MediaPortal * http://www.team-mediaportal.com * * Changes compared to Team MediaPortal's version: * - Code cleanup for PVR addon usage * - Code refactoring for cross platform usage ************************************************************************* * This file originates from TSFileSource, a GPL directshow push * source filter that provides an MPEG transport stream output. * Copyright (C) 2005-2006 nate, bear * http://forums.dvbowners.com/ */ #include "p8-platform/os.h" namespace ArgusTV { class FileReader { public: FileReader(); virtual ~FileReader(); // Open and write to the file virtual long GetFileName(char* *lpszFileName); virtual long SetFileName(const char* pszFileName); virtual long OpenFile(); virtual long CloseFile(); virtual long Read(unsigned char* pbData, unsigned long lDataLength, unsigned long *dwReadBytes); virtual bool IsFileInvalid(); virtual int64_t SetFilePointer(int64_t llDistanceToMove, unsigned long dwMoveMethod); virtual int64_t GetFilePointer(); virtual void OnZap(void); virtual int64_t GetFileSize(); virtual bool IsBuffer(){ return false; }; void SetDebugOutput(bool bDebugOutput); protected: void* m_hFile; // Handle to file for streaming char* m_pFileName; // The filename where we stream int64_t m_fileSize; int64_t m_fileStartPos; bool m_bDebugOutput; }; } pvr.argustv-3.5.4-Leia/src/lib/tsreader/MultiFileReader.cpp000066400000000000000000000455371337562352100236100ustar00rootroot00000000000000/* * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ************************************************************************* * This file is a modified version from Team MediaPortal's * TsReader DirectShow filter * MediaPortal is a GPL'ed HTPC-Application * Copyright (C) 2005-2012 Team MediaPortal * http://www.team-mediaportal.com * * Changes compared to Team MediaPortal's version: * - Code cleanup for PVR addon usage * - Code refactoring for cross platform usage ************************************************************************* * This file originates from TSFileSource, a GPL directshow push * source filter that provides an MPEG transport stream output. * Copyright (C) 2005-2006 nate, bear * http://forums.dvbowners.com/ */ #include "MultiFileReader.h" #include "client.h" //for XBMC->Log #include #include "utils.h" #include #include "p8-platform/util/timeutils.h" #include #if !defined(TARGET_WINDOWS) #include #include "p8-platform/os.h" #if !defined(TARGET_DARWIN) #define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0) #endif #endif using namespace ADDON; using namespace P8PLATFORM; //Maximum time in msec to wait for the buffer file to become available - Needed for DVB radio (this sometimes takes some time) #define MAX_BUFFER_TIMEOUT 1500 namespace ArgusTV { MultiFileReader::MultiFileReader() : m_TSBufferFile(), m_TSFile() { m_startPosition = 0; m_endPosition = 0; m_currentReadPosition = 0; m_lastZapPosition = 0; m_filesAdded = 0; m_filesRemoved = 0; m_TSFileId = 0; m_bDelay = 0; m_bDebugOutput = false; } MultiFileReader::~MultiFileReader() { //CloseFile called by ~FileReader } long MultiFileReader::GetFileName(char* *lpszFileName) { // CheckPointer(lpszFileName,E_POINTER); return m_TSBufferFile.GetFileName(lpszFileName); } long MultiFileReader::SetFileName(const char* pszFileName) { return m_TSBufferFile.SetFileName(pszFileName); } // // OpenFile // 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) { // For radio the buffer sometimes needs some time to become available, so wait and try it more than once P8PLATFORM::CTimeout timeout(MAX_BUFFER_TIMEOUT); do { usleep(100000); if (timeout.TimeLeft() == 0) { XBMC->Log(LOG_ERROR, "MultiFileReader: timed out while waiting for buffer file to become available"); XBMC->QueueNotification(QUEUE_ERROR, "Time out while waiting for buffer file"); return S_FALSE; } } while (RefreshTSBufferFile() == S_FALSE); } m_currentReadPosition = 0; return hr; } // // CloseFile // long MultiFileReader::CloseFile() { long hr; hr = m_TSBufferFile.CloseFile(); hr = m_TSFile.CloseFile(); std::vector::iterator it; for (it = m_tsFiles.begin(); it < m_tsFiles.end(); it++) { delete (*it); } m_TSFileId = 0; return hr; } bool MultiFileReader::IsFileInvalid() { return m_TSBufferFile.IsFileInvalid(); } int64_t MultiFileReader::SetFilePointer(int64_t llDistanceToMove, unsigned long dwMoveMethod) { RefreshTSBufferFile(); if (dwMoveMethod == FILE_END) { m_currentReadPosition = m_endPosition + llDistanceToMove; } else if (dwMoveMethod == FILE_CURRENT) { m_currentReadPosition += llDistanceToMove; } else // if (dwMoveMethod == FILE_BEGIN) { m_currentReadPosition = m_startPosition + llDistanceToMove; } if (m_currentReadPosition < m_startPosition) m_currentReadPosition = m_startPosition; if (m_currentReadPosition > m_endPosition) { XBMC->Log(LOG_ERROR, "Seeking beyond the end position: %I64d > %I64d", m_currentReadPosition, m_endPosition); m_currentReadPosition = m_endPosition; } // RefreshTSBufferFile(); return S_OK; } int64_t MultiFileReader::GetFilePointer() { // RefreshTSBufferFile(); return m_currentReadPosition; } long MultiFileReader::Read(unsigned char* pbData, unsigned long lDataLength, unsigned long *dwReadBytes) { long hr; // If the file has already been closed, don't continue if (m_TSBufferFile.IsFileInvalid()) return S_FALSE; RefreshTSBufferFile(); if (m_currentReadPosition < m_startPosition) { XBMC->Log(LOG_DEBUG, "%s: current position adjusted from %%I64dd to %%I64dd.", __FUNCTION__, m_currentReadPosition, m_startPosition); m_currentReadPosition = m_startPosition; } // Find out which file the currentPosition is in. MultiFileReaderFile *file = NULL; std::vector::iterator it = m_tsFiles.begin(); for (; it < m_tsFiles.end(); it++) { file = *it; if (m_currentReadPosition < (file->startPosition + file->length)) break; }; // XBMC->Log(LOG_DEBUG, "%s: reading %ld bytes. File %s, start %d, current %d, end %d.", __FUNCTION__, lDataLength, file->filename.c_str(), m_startPosition, m_currentPosition, m_endPosition); if (!file) { XBMC->Log(LOG_ERROR, "MultiFileReader::no file"); XBMC->QueueNotification(QUEUE_ERROR, "No buffer file"); return S_FALSE; } if (m_currentReadPosition < (file->startPosition + file->length)) { if (m_TSFileId != file->filePositionId) { m_TSFile.CloseFile(); m_TSFile.SetFileName(file->filename.c_str()); m_TSFile.OpenFile(); m_TSFileId = file->filePositionId; if (m_bDebugOutput) { XBMC->Log(LOG_DEBUG, "MultiFileReader::Read() Current File Changed to %s\n", file->filename.c_str()); } } int64_t seekPosition = m_currentReadPosition - file->startPosition; int64_t posSeeked = m_TSFile.GetFilePointer(); if (posSeeked != seekPosition) { m_TSFile.SetFilePointer(seekPosition, FILE_BEGIN); posSeeked = m_TSFile.GetFilePointer(); if (posSeeked != seekPosition) { XBMC->Log(LOG_ERROR, "SEEK FAILED"); } } unsigned long bytesRead = 0; int64_t bytesToRead = file->length - seekPosition; if ((int64_t)lDataLength > bytesToRead) { // XBMC->Log(LOG_DEBUG, "%s: datalength %lu bytesToRead %lli.", __FUNCTION__, lDataLength, bytesToRead); hr = m_TSFile.Read(pbData, (unsigned long)bytesToRead, &bytesRead); if (FAILED(hr)) { XBMC->Log(LOG_ERROR, "READ FAILED1"); } m_currentReadPosition += bytesToRead; hr = this->Read(pbData + bytesToRead, lDataLength - (unsigned long)bytesToRead, dwReadBytes); if (FAILED(hr)) { XBMC->Log(LOG_ERROR, "READ FAILED2"); } *dwReadBytes += bytesRead; } else { hr = m_TSFile.Read(pbData, lDataLength, dwReadBytes); if (FAILED(hr)) { XBMC->Log(LOG_ERROR, "READ FAILED3"); } m_currentReadPosition += lDataLength; } } else { // The current position is past the end of the last file *dwReadBytes = 0; } // XBMC->Log(LOG_DEBUG, "%s: read %lu bytes. start %lli, current %lli, end %lli.", __FUNCTION__, *dwReadBytes, m_startPosition, m_currentPosition, m_endPosition); return S_OK; } long MultiFileReader::RefreshTSBufferFile() { if (m_TSBufferFile.IsFileInvalid()) return S_FALSE; unsigned long bytesRead; MultiFileReaderFile *file; long result; int64_t currentPosition; int32_t filesAdded, filesRemoved; int32_t filesAdded2, filesRemoved2; long Error = 0; long Loop = 10; Wchar_t* pBuffer = NULL; do { Error = 0; currentPosition = -1; filesAdded = -1; filesRemoved = -1; filesAdded2 = -2; filesRemoved2 = -2; int64_t fileLength = m_TSBufferFile.GetFileSize(); // Min file length is Header ( int64_t + int32_t + int32_t ) + filelist ( > 0 ) + Footer ( int32_t + int32_t ) if (fileLength <= (int64_t)(sizeof(currentPosition) + sizeof(filesAdded) + sizeof(filesRemoved) + sizeof(wchar_t) + sizeof(filesAdded2) + sizeof(filesRemoved2))) { if (m_bDebugOutput) { XBMC->Log(LOG_DEBUG, "MultiFileReader::RefreshTSBufferFile() TSBufferFile too short"); } return S_FALSE; } m_TSBufferFile.SetFilePointer(0, FILE_BEGIN); uint32_t readLength = sizeof(currentPosition) + sizeof(filesAdded) + sizeof(filesRemoved); unsigned char* readBuffer = new unsigned char[readLength]; result = m_TSBufferFile.Read(readBuffer, readLength, &bytesRead); if (!SUCCEEDED(result) || bytesRead != readLength) Error |= 0x02; if (Error == 0) { currentPosition = *((int64_t*)(readBuffer + 0)); filesAdded = *((int32_t*)(readBuffer + sizeof(currentPosition))); filesRemoved = *((int32_t*)(readBuffer + sizeof(currentPosition) + sizeof(filesAdded))); } delete[] readBuffer; // If no files added or removed, break the loop ! if ((m_filesAdded == filesAdded) && (m_filesRemoved == filesRemoved)) break; int64_t remainingLength = fileLength - sizeof(currentPosition) - sizeof(filesAdded) - sizeof(filesRemoved) - sizeof(filesAdded2) - sizeof(filesRemoved2); // Above 100kb seems stupid and figure out a problem !!! if (remainingLength > 100000) Error |= 0x10; pBuffer = (Wchar_t*) new char[(unsigned int)remainingLength]; result = m_TSBufferFile.Read((unsigned char*)pBuffer, (uint32_t)remainingLength, &bytesRead); if (!SUCCEEDED(result) || (int64_t)bytesRead != remainingLength) Error |= 0x20; readLength = sizeof(filesAdded) + sizeof(filesRemoved); readBuffer = new unsigned char[readLength]; result = m_TSBufferFile.Read(readBuffer, readLength, &bytesRead); if (!SUCCEEDED(result) || bytesRead != readLength) Error |= 0x40; if (Error == 0) { filesAdded2 = *((int32_t*)(readBuffer + 0)); filesRemoved2 = *((int32_t*)(readBuffer + sizeof(filesAdded2))); } delete[] readBuffer; if ((filesAdded2 != filesAdded) || (filesRemoved2 != filesRemoved)) { Error |= 0x80; XBMC->Log(LOG_ERROR, "MultiFileReader has error 0x%x in Loop %d. Try to clear SMB Cache.", Error, 10 - Loop); XBMC->Log(LOG_DEBUG, "%s: filesAdded %d, filesAdded2 %d, filesRemoved %d, filesRemoved2 %d.", __FUNCTION__, filesAdded, filesAdded2, filesRemoved, filesRemoved2); // try to clear local / remote SMB file cache. This should happen when we close the filehandle m_TSBufferFile.CloseFile(); m_TSBufferFile.OpenFile(); usleep(5000); } if (Error) delete[] pBuffer; Loop--; } while (Error && Loop); // If Error is set, try again...until Loop reaches 0. if (Loop < 8) { XBMC->Log(LOG_DEBUG, "MultiFileReader has waited %d times for TSbuffer integrity.", 10 - Loop); if (Error) { XBMC->Log(LOG_ERROR, "MultiFileReader has failed for TSbuffer integrity. Error : %x", Error); return E_FAIL; } } if ((m_filesAdded != filesAdded) || (m_filesRemoved != filesRemoved)) { long filesToRemove = filesRemoved - m_filesRemoved; long filesToAdd = filesAdded - m_filesAdded; long fileID = filesRemoved; int64_t nextStartPosition = 0; if (m_bDebugOutput) { XBMC->Log(LOG_DEBUG, "MultiFileReader: Files Added %i, Removed %i\n", filesToAdd, filesToRemove); } // Removed files that aren't present anymore. while ((filesToRemove > 0) && (m_tsFiles.size() > 0)) { MultiFileReaderFile *file = m_tsFiles.at(0); if (m_bDebugOutput) { XBMC->Log(LOG_DEBUG, "MultiFileReader: Removing file %s\n", file->filename.c_str()); } delete file; m_tsFiles.erase(m_tsFiles.begin()); filesToRemove--; } // Figure out what the start position of the next new file will be if (m_tsFiles.size() > 0) { file = m_tsFiles.back(); if (filesToAdd > 0) { // If we're adding files the changes are the one at the back has a partial length // so we need update it. GetFileLength(file->filename.c_str(), file->length); } nextStartPosition = file->startPosition + file->length; } // Get the real path of the buffer file char* filename; std::string sFilename; std::string path; size_t pos = std::string::npos; m_TSBufferFile.GetFileName(&filename); sFilename = filename; pos = sFilename.find_last_of('/'); path = sFilename.substr(0, pos + 1); //name3 = filename1.substr(pos+1); // Create a list of files in the .tsbuffer file. std::vector filenames; Wchar_t* pwCurrFile = pBuffer; //Get a pointer to the first wchar filename string in pBuffer long length = WcsLen(pwCurrFile); //XBMC->Log(LOG_DEBUG, "%s: WcsLen(%d), sizeof(wchar_t) == %d.", __FUNCTION__, length, sizeof(wchar_t)); while (length > 0) { // Convert the current filename (wchar to normal char) char* wide2normal = new char[length + 1]; WcsToMbs(wide2normal, pwCurrFile, length); wide2normal[length] = '\0'; //unsigned char* pb = (unsigned char*) wide2normal; //for (unsigned long i = 0; i < rc; i++) //{ // XBMC->Log(LOG_DEBUG, "%s: pBuffer byte[%d] == %x.", __FUNCTION__, i, pb[i]); //} std::string sCurrFile = wide2normal; //XBMC->Log(LOG_DEBUG, "%s: filename %s (%s).", __FUNCTION__, wide2normal, sCurrFile.c_str()); delete[] wide2normal; // Modify filename path here to include the real (local) path pos = sCurrFile.find_last_of(92); std::string name = sCurrFile.substr(pos + 1); if (path.length() > 0 && name.length() > 0) { // Replace the original path with our local path filenames.push_back(path + name); } else { // Keep existing path filenames.push_back(sCurrFile); } // Move the wchar buffer pointer to the next wchar string pwCurrFile += (length + 1); length = WcsLen(pwCurrFile); } // Go through files std::vector::iterator itFiles = m_tsFiles.begin(); //std::vector::iterator itFilenames = filenames.begin(); std::vector::iterator itFilenames = filenames.begin(); while (itFiles < m_tsFiles.end()) { file = *itFiles; itFiles++; fileID++; if (itFilenames < filenames.end()) { // TODO: Check that the filenames match. ( Ambass : With buffer integrity check, probably no need to do this !) itFilenames++; } else { XBMC->Log(LOG_DEBUG, "MultiFileReader: Missing files!!\n"); } } while (itFilenames < filenames.end()) { std::string pFilename = *itFilenames; if (m_bDebugOutput) { int nextStPos = (int)nextStartPosition; XBMC->Log(LOG_DEBUG, "MultiFileReader: Adding file %s (%i)\n", pFilename.c_str(), nextStPos); } file = new MultiFileReaderFile(); file->filename = pFilename; file->startPosition = nextStartPosition; fileID++; file->filePositionId = fileID; GetFileLength(file->filename.c_str(), file->length); m_tsFiles.push_back(file); nextStartPosition = file->startPosition + file->length; itFilenames++; } m_filesAdded = filesAdded; m_filesRemoved = filesRemoved; delete[] pBuffer; } if (m_tsFiles.size() > 0) { file = m_tsFiles.front(); m_startPosition = file->startPosition; // Since the buffer file may be re-used when a channel is changed, we // want the start position to reflect the position in the file after the last // channel change, or the real start position, whichever is larger if (m_lastZapPosition > m_startPosition) { m_startPosition = m_lastZapPosition; } file = m_tsFiles.back(); file->length = currentPosition; m_endPosition = file->startPosition + currentPosition; if (m_bDebugOutput) { int64_t stPos = m_startPosition; int64_t endPos = m_endPosition; int64_t curPos = m_currentReadPosition; XBMC->Log(LOG_DEBUG, "StartPosition %lli, EndPosition %lli, CurrentPosition %lli\n", stPos, endPos, curPos); } } else { m_startPosition = 0; m_endPosition = 0; } return S_OK; } long MultiFileReader::GetFileLength(const char* pFilename, int64_t &length) { length = 0; struct __stat64 stat; if (XBMC->StatFile(pFilename, &stat) != 0) { XBMC->Log(LOG_ERROR, "MultiFileReader::GetFileLength: can not get stat from file %s.", pFilename); return S_FALSE; } length = stat.st_size; return S_OK; } int64_t MultiFileReader::GetFileSize() { RefreshTSBufferFile(); return m_endPosition - m_startPosition; } void MultiFileReader::OnZap(void) { SetFilePointer(0, FILE_END); m_lastZapPosition = m_currentReadPosition; } } pvr.argustv-3.5.4-Leia/src/lib/tsreader/MultiFileReader.h000066400000000000000000000054151337562352100232440ustar00rootroot00000000000000#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 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ************************************************************************* * This file is a modified version from Team MediaPortal's * TsReader DirectShow filter * MediaPortal is a GPL'ed HTPC-Application * Copyright (C) 2005-2012 Team MediaPortal * http://www.team-mediaportal.com * * Changes compared to Team MediaPortal's version: * - Code cleanup for PVR addon usage * - Code refactoring for cross platform usage ************************************************************************* * This file originates from TSFileSource, a GPL directshow push * source filter that provides an MPEG transport stream output. * Copyright (C) 2005-2006 nate, bear * http://forums.dvbowners.com/ */ #include "FileReader.h" #include #include namespace ArgusTV { class MultiFileReaderFile { public: std::string filename; int64_t startPosition; int64_t length; long filePositionId; }; class MultiFileReader : public FileReader { public: MultiFileReader(); virtual ~MultiFileReader(); virtual long GetFileName(char* *lpszFileName); virtual long SetFileName(const char* pszFileName); virtual long OpenFile(); virtual long CloseFile(); virtual long Read(unsigned char* pbData, unsigned long lDataLength, unsigned long *dwReadBytes); virtual bool IsFileInvalid(); virtual int64_t SetFilePointer(int64_t llDistanceToMove, unsigned long dwMoveMethod); virtual int64_t GetFilePointer(); virtual int64_t GetFileSize(); virtual void OnZap(void); protected: long RefreshTSBufferFile(); long GetFileLength(const char* pFilename, int64_t &length); FileReader m_TSBufferFile; int64_t m_startPosition; int64_t m_endPosition; int64_t m_currentReadPosition; long m_filesAdded; long m_filesRemoved; int64_t m_lastZapPosition; std::vector m_tsFiles; FileReader m_TSFile; long m_TSFileId; bool m_bDelay; bool m_bDebugOutput; }; }pvr.argustv-3.5.4-Leia/src/lib/tsreader/TSReader.cpp000066400000000000000000000110431337562352100222250ustar00rootroot00000000000000/* * Copyright (C) 2005-2012 Team XBMC * http://www.xbmc.org * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ************************************************************************* * Parts of this file originate from Team MediaPortal's * TsReader DirectShow filter * MediaPortal is a GPL'ed HTPC-Application * Copyright (C) 2005-2012 Team MediaPortal * http://www.team-mediaportal.com * * Changes compared to Team MediaPortal's version: * - Code cleanup for PVR addon usage * - Code refactoring for cross platform usage *************************************************************************/ #include "TSReader.h" #include "client.h" //for XBMC->Log #include "MultiFileReader.h" #include "utils.h" #include "p8-platform/os.h" #include "p8-platform/util/util.h" using namespace ADDON; namespace ArgusTV { CTsReader::CTsReader() : m_fileReader(NULL), m_bLiveTv(false), m_bRecording(false), m_bTimeShifting(false) { #if defined(TARGET_WINDOWS) liDelta.QuadPart = liCount.QuadPart = 0; #endif } long CTsReader::Open(const char* pszFileName) { XBMC->Log(LOG_DEBUG, "CTsReader::Open(%s)", pszFileName); m_fileName = pszFileName; char url[MAX_PATH]; strncpy(url, m_fileName.c_str(), MAX_PATH - 1); url[MAX_PATH - 1] = '\0'; // make sure that we always have a 0-terminated string //check file type int length = strlen(url); if ((length < 9) || (strnicmp(&url[length - 9], ".tsbuffer", 9) != 0)) { //local .ts file m_bTimeShifting = false; m_bLiveTv = false; m_fileReader = new FileReader(); } else { //local timeshift buffer file file m_bTimeShifting = true; m_bLiveTv = true; m_fileReader = new MultiFileReader(); } //open file if (m_fileReader->SetFileName(m_fileName.c_str()) != S_OK) { XBMC->Log(LOG_ERROR, "CTsReader::SetFileName failed."); return S_FALSE; } if (m_fileReader->OpenFile() != S_OK) { XBMC->Log(LOG_ERROR, "CTsReader::OpenFile failed."); return S_FALSE; } m_fileReader->SetFilePointer(0LL, FILE_BEGIN); return S_OK; } long CTsReader::Read(unsigned char* pbData, unsigned long lDataLength, unsigned long *dwReadBytes) { #if defined(TARGET_WINDOWS) LARGE_INTEGER liFrequency; LARGE_INTEGER liCurrent; LARGE_INTEGER liLast; #endif if (m_fileReader) { #if defined(TARGET_WINDOWS) // Save the performance counter frequency for later use. if (!QueryPerformanceFrequency(&liFrequency)) XBMC->Log(LOG_ERROR, "QPF() failed with error %d\n", GetLastError()); if (!QueryPerformanceCounter(&liCurrent)) XBMC->Log(LOG_ERROR, "QPC() failed with error %d\n", GetLastError()); liLast = liCurrent; #endif long rc = m_fileReader->Read(pbData, lDataLength, dwReadBytes); #if defined(TARGET_WINDOWS) if (!QueryPerformanceCounter(&liCurrent)) XBMC->Log(LOG_ERROR, "QPC() failed with error %d\n", GetLastError()); // Convert difference in performance counter values to nanoseconds. liDelta.QuadPart += (((liCurrent.QuadPart - liLast.QuadPart) * 1000000) / liFrequency.QuadPart); liCount.QuadPart++; #endif return rc; } dwReadBytes = 0; return 1; } void CTsReader::Close() { if (m_fileReader) { m_fileReader->CloseFile(); SAFE_DELETE(m_fileReader); } } int64_t CTsReader::SetFilePointer(int64_t llDistanceToMove, unsigned long dwMoveMethod) { return m_fileReader->SetFilePointer(llDistanceToMove, dwMoveMethod); } int64_t CTsReader::GetFileSize() { return m_fileReader->GetFileSize(); } int64_t CTsReader::GetFilePointer() { return m_fileReader->GetFilePointer(); } void CTsReader::OnZap(void) { m_fileReader->OnZap(); } #if defined(TARGET_WINDOWS) long long CTsReader::sigmaTime() { return liDelta.QuadPart; } long long CTsReader::sigmaCount() { return liCount.QuadPart; } #endif } pvr.argustv-3.5.4-Leia/src/lib/tsreader/TSReader.h000066400000000000000000000040331337562352100216730ustar00rootroot00000000000000#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 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 . * ************************************************************************* * Parts of this file originate from Team MediaPortal's * TsReader DirectShow filter * MediaPortal is a GPL'ed HTPC-Application * Copyright (C) 2005-2012 Team MediaPortal * http://www.team-mediaportal.com * * Changes compared to Team MediaPortal's version: * - Code cleanup for PVR addon usage * - Code refactoring for cross platform usage *************************************************************************/ #include "client.h" #include "FileReader.h" namespace ArgusTV { class CTsReader { public: CTsReader(); ~CTsReader(void) {}; long Open(const char* pszFileName); long Read(unsigned char* pbData, unsigned long lDataLength, unsigned long *dwReadBytes); void Close(); int64_t SetFilePointer(int64_t llDistanceToMove, unsigned long dwMoveMethod); int64_t GetFileSize(); int64_t GetFilePointer(); void OnZap(void); #if defined(TARGET_WINDOWS) long long sigmaTime(); long long sigmaCount(); #endif private: bool m_bTimeShifting; bool m_bRecording; bool m_bLiveTv; std::string m_fileName; FileReader* m_fileReader; #if defined(TARGET_WINDOWS) LARGE_INTEGER liDelta; LARGE_INTEGER liCount; #endif }; } pvr.argustv-3.5.4-Leia/src/pvrclient-argustv.cpp000066400000000000000000001421701337562352100217020ustar00rootroot00000000000000/* * 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 * 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 "client.h" //#include "timers.h" #include "channel.h" #include "activerecording.h" #include "upcomingrecording.h" #include "recordinggroup.h" #include "recording.h" #include "epg.h" #include "utils.h" #include "pvrclient-argustv.h" #include "argustvrpc.h" #include "p8-platform/util/timeutils.h" #include "p8-platform/util/util.h" #include "lib/tsreader/TSReader.h" #include using namespace std; using namespace ADDON; using namespace P8PLATFORM; using namespace ArgusTV; #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 */ cPVRClientArgusTV::cPVRClientArgusTV() { m_bConnected = false; //m_bStop = true; m_bTimeShiftStarted = false; m_BackendUTCoffset = 0; m_BackendTime = 0; m_tsreader = NULL; m_epg_id_offset = 0; m_iCurrentChannel = -1; m_keepalive = new CKeepAliveThread(); m_eventmonitor = new CEventsThread(); m_iBackendVersion = 0; m_signalqualityInterval = 0; m_TVChannels.clear(); m_RadioChannels.clear(); // due to lack of static constructors, we initialize manually ArgusTV::Initialize(); #if defined(ATV_DUMPTS) strncpy(ofn, "/tmp/atv.XXXXXX", sizeof(ofn)); ofd = -1; #endif } cPVRClientArgusTV::~cPVRClientArgusTV() { XBMC->Log(LOG_DEBUG, "->~cPVRClientArgusTV()"); // Check if we are still reading a TV/Radio stream and close it here if (m_bTimeShiftStarted) { CloseLiveStream(); } delete m_keepalive; delete m_eventmonitor; // Free allocated memory for Channels FreeChannels(m_TVChannels); FreeChannels(m_RadioChannels); } bool cPVRClientArgusTV::Connect() { string result; char buffer[256]; snprintf(buffer, 256, "http://%s:%i/", g_szHostname.c_str(), g_iPort); g_szBaseURL = buffer; XBMC->Log(LOG_INFO, "Connect() - Connecting to %s", g_szBaseURL.c_str()); int backendversion = ATV_REST_MAXIMUM_API_VERSION; int rc = -2; int attemps = 0; while (rc != 0) { attemps++; rc = ArgusTV::Ping(backendversion); if (rc == 1) { backendversion = ATV_REST_MINIMUM_API_VERSION; rc = ArgusTV::Ping(backendversion); } m_iBackendVersion = backendversion; switch (rc) { case 0: XBMC->Log(LOG_INFO, "Ping Ok. The client and server are compatible, API version %d.\n", m_iBackendVersion); break; case -1: XBMC->Log(LOG_NOTICE, "Ping Ok. The ARGUS TV server is too new for this version of the add-on.\n"); XBMC->QueueNotification(QUEUE_ERROR, "The ARGUS TV server is too new for this version of the add-on"); return false; case 1: XBMC->Log(LOG_NOTICE, "Ping Ok. The ARGUS TV server is too old for this version of the add-on.\n"); XBMC->QueueNotification(QUEUE_ERROR, "The ARGUS TV server is too old for this version of the add-on"); return false; default: XBMC->Log(LOG_ERROR, "Ping failed... No connection to Argus TV.\n"); usleep(1000000); if (attemps > 3) { return false; } } } // Check the accessibility status of all the shares used by ArgusTV tuners // TODO: this is temporarily disabled until the caching of smb:// directories is resolved // if (ShareErrorsFound()) // { // 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; } void cPVRClientArgusTV::Disconnect() { string result; 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 } m_bConnected = false; } bool cPVRClientArgusTV::ShareErrorsFound(void) { bool bShareErrors = false; Json::Value activeplugins; int rc = ArgusTV::GetPluginServices(false, activeplugins); if (rc < 0) { XBMC->Log(LOG_ERROR, "Unable to get the ARGUS TV plugin services to check share accessiblity."); return false; } // parse plugins list int size = activeplugins.size(); for ( int index =0; index < size; ++index ) { std::string tunerName = activeplugins[index]["Name"].asString(); XBMC->Log(LOG_DEBUG, "Checking tuner \"%s\" for accessibility.", tunerName.c_str()); Json::Value accesibleshares; rc = ArgusTV::AreRecordingSharesAccessible(activeplugins[index], accesibleshares); if (rc < 0) { XBMC->Log(LOG_ERROR, "Unable to get the share status for tuner \"%s\".", tunerName.c_str()); continue; } int numberofshares = accesibleshares.size(); for (int j = 0; j < numberofshares; j++) { Json::Value accesibleshare = accesibleshares[j]; tunerName = accesibleshare["RecorderTunerName"].asString(); std::string sharename = accesibleshare["Share"].asString(); bool isAccessibleByATV = accesibleshare["ShareAccessible"].asBool(); bool isAccessibleByAddon = false; std::string accessMsg = ""; std::string CIFSname = ToCIFS(sharename); isAccessibleByAddon = XBMC->CanOpenDirectory(CIFSname.c_str()); // write analysis results to the log if (isAccessibleByATV) { XBMC->Log(LOG_DEBUG, " Share \"%s\" is accessible to the ARGUS TV server.", sharename.c_str()); } else { bShareErrors = true; XBMC->Log(LOG_ERROR, " Share \"%s\" is NOT accessible to the ARGUS TV server.", sharename.c_str()); } if (isAccessibleByAddon) { XBMC->Log(LOG_DEBUG, " Share \"%s\" is readable from this client add-on.", sharename.c_str()); } else { bShareErrors = true; XBMC->Log(LOG_ERROR, " Share \"%s\" is NOT readable from this client add-on (\"%s\").", sharename.c_str(), accessMsg.c_str()); } } } return bShareErrors; } /************************************************************/ /** General handling */ // Used among others for the server name string in the "Recordings" view const char* cPVRClientArgusTV::GetBackendName(void) { XBMC->Log(LOG_DEBUG, "->GetBackendName()"); if(m_BackendName.length() == 0) { m_BackendName = "ARGUS TV ("; m_BackendName += g_szHostname.c_str(); m_BackendName += ")"; } return m_BackendName.c_str(); } const char* cPVRClientArgusTV::GetBackendVersion(void) { XBMC->Log(LOG_DEBUG, "->GetBackendVersion"); m_sBackendVersion = "unknown"; Json::Value response; int retval; retval = ArgusTV::GetDisplayVersion(response); if (retval != E_FAILED) { m_sBackendVersion = response.asString(); XBMC->Log(LOG_DEBUG, "GetDisplayVersion: \"%s\".", m_sBackendVersion.c_str()); } return m_sBackendVersion.c_str(); } const char* cPVRClientArgusTV::GetConnectionString(void) { XBMC->Log(LOG_DEBUG, "->GetConnectionString()"); return g_szBaseURL.c_str(); } PVR_ERROR cPVRClientArgusTV::GetDriveSpace(long long *iTotal, long long *iUsed) { XBMC->Log(LOG_DEBUG, "->GetDriveSpace"); *iTotal = *iUsed = 0; Json::Value response; int retval; retval = ArgusTV::GetRecordingDisksInfo(response); if (retval != E_FAILED) { double _totalSize = response["TotalSizeBytes"].asDouble()/1024; double _freeSize = response["FreeSpaceBytes"].asDouble()/1024; *iTotal = (long long) _totalSize; *iUsed = (long long) (_totalSize - _freeSize); XBMC->Log(LOG_DEBUG, "GetDriveSpace, %lld used kiloBytes of %lld total kiloBytes.", *iUsed, *iTotal); } return PVR_ERROR_NO_ERROR; } PVR_ERROR cPVRClientArgusTV::GetBackendTime(time_t *localTime, int *gmtOffset) { NOTUSED(localTime); NOTUSED(gmtOffset); return PVR_ERROR_SERVER_ERROR; } /************************************************************/ /** EPG handling */ PVR_ERROR cPVRClientArgusTV::GetEpg(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart, time_t iEnd) { 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; convert = localtime(&iEnd); struct tm tm_end = *convert; if(atvchannel) { 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) { XBMC->Log(LOG_DEBUG, "GetEPGData returned %i, response.type == %i, response.size == %i.", retval, response.type(), response.size()); if( response.type() == Json::arrayValue) { int size = response.size(); EPG_TAG broadcast; cEpg epg; memset(&broadcast, 0, sizeof(EPG_TAG)); // parse channel list for ( int index =0; index < size; ++index ) { if (epg.Parse(response[index])) { m_epg_id_offset++; broadcast.iUniqueBroadcastId = m_epg_id_offset; broadcast.strTitle = epg.Title(); broadcast.iUniqueChannelId = channel.iUniqueId; broadcast.startTime = epg.StartTime(); broadcast.endTime = epg.EndTime(); broadcast.strPlotOutline = epg.Subtitle(); broadcast.strPlot = epg.Description(); broadcast.strIconPath = ""; broadcast.iGenreType = EPG_GENRE_USE_STRING; broadcast.iGenreSubType = 0; broadcast.strGenreDescription = epg.Genre(); broadcast.firstAired = 0; broadcast.iParentalRating = 0; broadcast.iStarRating = 0; broadcast.bNotify = false; broadcast.iSeriesNumber = 0; broadcast.iEpisodeNumber = 0; broadcast.iEpisodePartNumber = 0; broadcast.strEpisodeName = ""; broadcast.strOriginalTitle = ""; broadcast.strCast = ""; broadcast.strDirector = ""; broadcast.strWriter = ""; broadcast.iYear = 0; broadcast.strIMDBNumber = ""; broadcast.iFlags = EPG_TAG_FLAG_UNDEFINED; PVR->TransferEpgEntry(handle, &broadcast); } epg.Reset(); } } } else { XBMC->Log(LOG_ERROR, "GetEPGData failed for channel id:%i", channel.iUniqueId); } } else { XBMC->Log(LOG_ERROR, "Channel (%i) did not return a channel class.", channel.iUniqueId); XBMC->QueueNotification(QUEUE_ERROR, "Can't map XBMC Channel to ARGUS"); } return PVR_ERROR_NO_ERROR; } /************************************************************/ /** Channel handling */ int cPVRClientArgusTV::GetNumChannels() { // Not directly possible in ARGUS TV Json::Value response; XBMC->Log(LOG_DEBUG, "GetNumChannels()"); // pick up the channellist for TV int retval = ArgusTV::GetChannelList(ArgusTV::Television, response); if (retval < 0) { return 0; } int numberofchannels = response.size(); // When radio is enabled, add the number of radio channels if (g_bRadioEnabled) { retval = ArgusTV::GetChannelList(ArgusTV::Radio, response); if (retval >= 0) { numberofchannels += response.size(); } } return numberofchannels; } PVR_ERROR cPVRClientArgusTV::GetChannels(ADDON_HANDLE handle, bool bRadio) { CLockObject lock(m_ChannelCacheMutex); Json::Value response; int retval = -1; if (bRadio && !g_bRadioEnabled) return PVR_ERROR_NO_ERROR; XBMC->Log(LOG_DEBUG, "%s(%s)", __FUNCTION__, bRadio ? "radio" : "television"); if (!bRadio) { retval = ArgusTV::GetChannelList(ArgusTV::Television, response); } else { retval = ArgusTV::GetChannelList(ArgusTV::Radio, response); } 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 = new cChannel; if( channel->Parse(response[index]) ) { PVR_CHANNEL tag; memset(&tag, 0 , sizeof(tag)); tag.iUniqueId = channel->ID(); PVR_STRCPY(tag.strChannelName, channel->Name()); std::string logopath = ArgusTV::GetChannelLogo(channel->Guid()).c_str(); PVR_STRCPY(tag.strIconPath, logopath.c_str()); tag.iEncryptionSystem = (unsigned int) -1; //How to fetch this from ARGUS TV?? tag.bIsRadio = (channel->Type() == ArgusTV::Radio ? true : false); tag.bIsHidden = false; PVR_STRCPY(tag.strInputFormat, "video/mp2t"); tag.iChannelNumber = channel->LCN(); if (!tag.bIsRadio) { 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 { 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); } } return PVR_ERROR_NO_ERROR; } else { XBMC->Log(LOG_DEBUG, "RequestChannelList failed. Return value: %i\n", retval); } return PVR_ERROR_SERVER_ERROR; } /************************************************************/ /** Channel group handling **/ int cPVRClientArgusTV::GetChannelGroupsAmount(void) { Json::Value response; int num = 0; if (ArgusTV::RequestTVChannelGroups(response) >= 0) num += response.size(); if (ArgusTV::RequestRadioChannelGroups(response) >= 0) num += response.size(); return num; } PVR_ERROR cPVRClientArgusTV::GetChannelGroups(ADDON_HANDLE handle, bool bRadio) { Json::Value response; int retval; if (bRadio && !g_bRadioEnabled) return PVR_ERROR_NO_ERROR; if (!bRadio) { retval = ArgusTV::RequestTVChannelGroups(response); } else { retval = ArgusTV::RequestRadioChannelGroups(response); } if (retval >= 0) { int size = response.size(); // parse channel group list for (int index = 0; index < size; ++index) { 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, ARGUS Id: %d, ARGUS GUID: %s\n", name.c_str(), id, guid.c_str()); } else { 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)); tag.bIsRadio = bRadio; tag.iPosition = 0; // default ordering of the groups PVR_STRCPY(tag.strGroupName, name.c_str()); PVR->TransferChannelGroup(handle, &tag); } return PVR_ERROR_NO_ERROR; } else { return PVR_ERROR_SERVER_ERROR; } } PVR_ERROR cPVRClientArgusTV::GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group) { Json::Value response; int retval; // Step 1, find the GUID for this channelgroup if (!group.bIsRadio) { retval = ArgusTV::RequestTVChannelGroups(response); } else { retval = ArgusTV::RequestRadioChannelGroups(response); } if (retval < 0) { XBMC->Log(LOG_ERROR, "Could not get Channelgroups from server."); return PVR_ERROR_SERVER_ERROR; } std::string guid = ""; std::string name = ""; int size = response.size(); for (int index = 0; index < size; ++index) { name = response[index]["GroupName"].asString(); guid = response[index]["ChannelGroupId"].asString(); if (name == group.strGroupName) break; } if (name != group.strGroupName) { XBMC->Log(LOG_ERROR, "Channelgroup %s was not found while trying to retrieve the channelgroup members.", group.strGroupName); return PVR_ERROR_SERVER_ERROR; } // Step 2 use the guid to retrieve the list of member channels retval = ArgusTV::RequestChannelGroupMembers(guid, response); if (retval < 0) { XBMC->Log(LOG_ERROR, "Could not get members for Channelgroup \"%s\" (%s) from server.", name.c_str(), guid.c_str()); return PVR_ERROR_SERVER_ERROR; } size = response.size(); for (int index = 0; index < size; index++) { std::string channelId = response[index]["ChannelId"].asString(); std::string channelName = response[index]["DisplayName"].asString(); 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)); PVR_STRCPY(tag.strGroupName, group.strGroupName); tag.iChannelUniqueId = id; tag.iChannelNumber = lcn; 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); } return PVR_ERROR_NO_ERROR; } /************************************************************/ /** Record handling **/ int cPVRClientArgusTV::GetNumRecordings(void) { Json::Value response; int retval = -1; int iNumRecordings = 0; XBMC->Log(LOG_DEBUG, "GetNumRecordings()"); retval = ArgusTV::GetRecordingGroupByTitle(response); if (retval >= 0) { int size = response.size(); // parse channelgroup list for ( int index = 0; index < size; ++index ) { cRecordingGroup recordinggroup; if (recordinggroup.Parse(response[index])) { iNumRecordings += recordinggroup.RecordingsCount(); } } } return iNumRecordings; } PVR_ERROR cPVRClientArgusTV::GetRecordings(ADDON_HANDLE handle) { Json::Value recordinggroupresponse; int retval = -1; int iNumRecordings = 0; m_RecordingsMap.clear(); XBMC->Log(LOG_DEBUG, "RequestRecordingsList()"); int64_t t = GetTimeMs(); retval = ArgusTV::GetRecordingGroupByTitle(recordinggroupresponse); if(retval >= 0) { // process list of recording groups int size = recordinggroupresponse.size(); for ( int recordinggroupindex = 0; recordinggroupindex < size; ++recordinggroupindex ) { cRecordingGroup recordinggroup; if (recordinggroup.Parse(recordinggroupresponse[recordinggroupindex])) { Json::Value recordingsbytitleresponse; retval = ArgusTV::GetFullRecordingsForTitle(recordinggroup.ProgramTitle(), recordingsbytitleresponse); if (retval >= 0) { // process list of recording details for this group int nrOfRecordings = recordingsbytitleresponse.size(); for (int recordingindex = 0; recordingindex < nrOfRecordings; recordingindex++) { cRecording recording; if (recording.Parse(recordingsbytitleresponse[recordingindex])) { PVR_RECORDING tag; memset(&tag, 0 , sizeof(tag)); PVR_STRCPY(tag.strRecordingId, recording.RecordingId()); PVR_STRCPY(tag.strChannelName, recording.ChannelDisplayName()); tag.iLifetime = MAXLIFETIME; //TODO: recording.Lifetime(); tag.iPriority = recording.SchedulePriority(); tag.recordingTime = recording.RecordingStartTime(); tag.iDuration = recording.RecordingStopTime() - recording.RecordingStartTime(); PVR_STRCPY(tag.strPlot, recording.Description()); tag.iPlayCount = recording.FullyWatchedCount(); tag.iLastPlayedPosition = recording.LastWatchedPosition(); if (nrOfRecordings > 1 || g_bUseFolder) { recording.Transform(true); PVR_STRCPY(tag.strDirectory, recordinggroup.ProgramTitle().c_str()); //used in XBMC as directory structure below "Server X - hostname" } else { recording.Transform(false); PVR_STRCLR(tag.strDirectory); } PVR_STRCPY(tag.strTitle, recording.Title()); PVR_STRCPY(tag.strPlotOutline, recording.SubTitle()); m_RecordingsMap[tag.strRecordingId] = recording.RecordingFileName(); /* TODO: PVR API 5.0.0: Implement this */ tag.iChannelUid = PVR_CHANNEL_INVALID_UID; /* TODO: PVR API 5.1.0: Implement this */ tag.channelType = PVR_RECORDING_CHANNEL_TYPE_UNKNOWN; PVR->TransferRecordingEntry(handle, &tag); iNumRecordings++; } } } } } } t = GetTimeMs() - t; XBMC->Log(LOG_INFO, "Retrieving %d recordings took %d milliseconds.", iNumRecordings, t); return PVR_ERROR_NO_ERROR; } PVR_ERROR cPVRClientArgusTV::DeleteRecording(const PVR_RECORDING &recinfo) { PVR_ERROR rc = PVR_ERROR_FAILED; std::string UNCname; if (!FindRecEntryUNC(recinfo.strRecordingId, UNCname)) return PVR_ERROR_FAILED; XBMC->Log(LOG_DEBUG, "->DeleteRecording(%s)", UNCname.c_str()); XBMC->Log(LOG_DEBUG, "->DeleteRecording(%s == \"%s\")", recinfo.strRecordingId, UNCname.c_str()); // JSONify the stream_url Json::Value recordingname (UNCname); Json::StreamWriterBuilder wbuilder; std::string jsonval = Json::writeString(wbuilder, recordingname); if (ArgusTV::DeleteRecording(jsonval) >= 0) { // Trigger XBMC to update it's list PVR->TriggerRecordingUpdate(); rc = PVR_ERROR_NO_ERROR; } return rc; } PVR_ERROR cPVRClientArgusTV::RenameRecording(const PVR_RECORDING &recinfo) { NOTUSED(recinfo); return PVR_ERROR_NO_ERROR; } PVR_ERROR cPVRClientArgusTV::SetRecordingLastPlayedPosition(const PVR_RECORDING &recinfo, int lastplayedposition) { std::string recordingfilename; if (!FindRecEntryUNC(recinfo.strRecordingId, recordingfilename)) return PVR_ERROR_FAILED; XBMC->Log(LOG_DEBUG, "->SetRecordingLastPlayedPosition(index=%s [%s], %d)", recinfo.strRecordingId, recordingfilename.c_str(), lastplayedposition); // JSONify the stream_url Json::Value recordingname (recordingfilename); Json::StreamWriterBuilder wbuilder; std::string jsonval = Json::writeString(wbuilder, recordingname); int retval = ArgusTV::SetRecordingLastWatchedPosition(jsonval, lastplayedposition); if (retval < 0) { XBMC->Log(LOG_INFO, "Failed to set recording last watched position (%d)", retval); return PVR_ERROR_SERVER_ERROR; } return PVR_ERROR_NO_ERROR; } int cPVRClientArgusTV::GetRecordingLastPlayedPosition(const PVR_RECORDING &recinfo) { std::string recordingfilename; if (!FindRecEntryUNC(recinfo.strRecordingId, recordingfilename)) return 0; XBMC->Log(LOG_DEBUG, "->GetRecordingLastPlayedPosition(index=%s [%s])", recinfo.strRecordingId, recordingfilename.c_str()); // JSONify the stream_url Json::Value response; Json::Value recordingname (recordingfilename); Json::StreamWriterBuilder wbuilder; std::string jsonval = Json::writeString(wbuilder, recordingname); int retval = ArgusTV::GetRecordingLastWatchedPosition(jsonval, response); if (retval < 0) { XBMC->Log(LOG_INFO, "Failed to get recording last watched position (%d)", retval); return 0; } retval = response.asInt(); XBMC->Log(LOG_DEBUG, "GetRecordingLastPlayedPosition(index=%s [%s]) returns %d.\n", recinfo.strRecordingId, recordingfilename.c_str(), retval); return retval; } PVR_ERROR cPVRClientArgusTV::SetRecordingPlayCount(const PVR_RECORDING &recinfo, int playcount) { std::string recordingfilename; if (!FindRecEntryUNC(recinfo.strRecordingId, recordingfilename)) return PVR_ERROR_FAILED; XBMC->Log(LOG_DEBUG, "->SetRecordingPlayCount(index=%s [%s], %d)", recinfo.strRecordingId, recordingfilename.c_str(), playcount); // JSONify the stream_url Json::Value recordingname (recordingfilename); Json::StreamWriterBuilder wbuilder; std::string jsonval = Json::writeString(wbuilder, recordingname); int retval = ArgusTV::SetRecordingFullyWatchedCount(jsonval, playcount); if (retval < 0) { XBMC->Log(LOG_INFO, "Failed to set recording play count (%d)", retval); return PVR_ERROR_SERVER_ERROR; } return PVR_ERROR_NO_ERROR; } /************************************************************/ /** Timer handling */ int cPVRClientArgusTV::GetNumTimers(void) { // Not directly possible in ARGUS TV Json::Value response; XBMC->Log(LOG_DEBUG, "GetNumTimers()"); // pick up the schedulelist for TV int retval = ArgusTV::GetUpcomingRecordings(response); if (retval < 0) { return 0; } return response.size(); } PVR_ERROR cPVRClientArgusTV::GetTimers(ADDON_HANDLE handle) { Json::Value activeRecordingsResponse, upcomingRecordingsResponse; int iNumberOfTimers = 0; PVR_TIMER tag; int numberoftimers; XBMC->Log(LOG_DEBUG, "%s", __FUNCTION__); // retrieve the currently active recordings int retval = ArgusTV::GetActiveRecordings(activeRecordingsResponse); if (retval < 0) { XBMC->Log(LOG_ERROR, "Unable to retrieve active recordings from server."); return PVR_ERROR_SERVER_ERROR; } // pick up the upcoming recordings retval = ArgusTV::GetUpcomingRecordings(upcomingRecordingsResponse); if (retval < 0) { XBMC->Log(LOG_ERROR, "Unable to retrieve upcoming programs from server."); return PVR_ERROR_SERVER_ERROR; } memset(&tag, 0 , sizeof(tag)); numberoftimers = upcomingRecordingsResponse.size(); for (int i = 0; i < numberoftimers; i++) { cUpcomingRecording upcomingrecording; if (upcomingrecording.Parse(upcomingRecordingsResponse[i])) { /* TODO: Implement own timer types to get support for the timer features introduced with PVR API 1.9.7 */ tag.iTimerType = PVR_TIMER_TYPE_NONE; tag.iClientIndex = upcomingrecording.ID(); tag.iClientChannelUid = upcomingrecording.ChannelID(); tag.startTime = upcomingrecording.StartTime(); tag.endTime = upcomingrecording.StopTime(); // build the XBMC PVR State if (upcomingrecording.IsCancelled()) { tag.state = PVR_TIMER_STATE_CANCELLED; } else if (upcomingrecording.IsInConflict()) { if (upcomingrecording.IsAllocated()) tag.state = PVR_TIMER_STATE_CONFLICT_OK; else tag.state = PVR_TIMER_STATE_CONFLICT_NOK; } else if (!upcomingrecording.IsAllocated()) { //not allocated --> won't be recorded tag.state = PVR_TIMER_STATE_ERROR; } else { tag.state = PVR_TIMER_STATE_SCHEDULED; } if (tag.state == PVR_TIMER_STATE_SCHEDULED || tag.state == PVR_TIMER_STATE_CONFLICT_OK) //check if they are currently recording { if (activeRecordingsResponse.size() > 0) { // Is the this upcoming recording in the list of active recordings? for (Json::Value::UInt j = 0; j < activeRecordingsResponse.size(); j++) { cActiveRecording activerecording; if (activerecording.Parse(activeRecordingsResponse[j])) { if (upcomingrecording.UpcomingProgramId() == activerecording.UpcomingProgramId()) { tag.state = PVR_TIMER_STATE_RECORDING; break; } } } } } PVR_STRCPY(tag.strTitle, upcomingrecording.Title().c_str()); tag.strDirectory[0] = '\0'; tag.strSummary[0] = '\0'; tag.iPriority = 0; tag.iLifetime = 0; tag.firstDay = 0; tag.iWeekdays = 0; tag.iEpgUid = 0; tag.iMarginStart = upcomingrecording.PreRecordSeconds() / 60; tag.iMarginEnd = upcomingrecording.PostRecordSeconds() / 60; tag.iGenreType = 0; 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++; } } return PVR_ERROR_NO_ERROR; } PVR_ERROR cPVRClientArgusTV::AddTimer(const PVR_TIMER &timerinfo) { 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); if (pChannel == NULL) { XBMC->Log(LOG_ERROR, "Unable to translate XBMC channel %d to ARGUS TV channel GUID, timer not added.", timerinfo.iClientChannelUid); 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 time_t startTime = timerinfo.startTime; struct tm* tm_start = localtime(&startTime); time_t endTime = timerinfo.endTime; struct tm* tm_end = localtime(&endTime); 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); retval = ArgusTV::AddOneTimeSchedule(pChannel->Guid(), starttime, programTitle, timerinfo.iMarginStart * 60, timerinfo.iMarginEnd * 60, timerinfo.iLifetime, addScheduleResponse); if (retval < 0) { return PVR_ERROR_SERVER_ERROR; } 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); // We should have at least one upcoming program for this schedule, otherwise nothing will be recorded if (retval <= 0) { XBMC->Log(LOG_INFO, "The new schedule does not lead to an upcoming program, removing schedule and adding a manual one."); // remove the added (now stale) schedule, ignore failure (what are we to do anyway?) ArgusTV::DeleteSchedule(scheduleid); // Okay, add a manual schedule (forced recording) but now we need to add pre- and post-recording ourselves time_t manualStartTime = starttime - (timerinfo.iMarginStart * 60); time_t manualEndTime = timerinfo.endTime + (timerinfo.iMarginEnd * 60); retval = ArgusTV::AddManualSchedule(pChannel->Guid(), manualStartTime, manualEndTime - manualStartTime, timerinfo.strTitle, timerinfo.iMarginStart * 60, timerinfo.iMarginEnd * 60, timerinfo.iLifetime, addScheduleResponse); if (retval < 0) { XBMC->Log(LOG_ERROR, "A manual schedule could not be added."); return PVR_ERROR_SERVER_ERROR; } } // Trigger an update of the PVR timers PVR->TriggerTimerUpdate(); return PVR_ERROR_NO_ERROR; } PVR_ERROR cPVRClientArgusTV::DeleteTimer(const PVR_TIMER &timerinfo, bool force) { NOTUSED(force); Json::Value upcomingProgramsResponse, activeRecordingsResponse; XBMC->Log(LOG_DEBUG, "DeleteTimer()"); // retrieve the currently active recordings int retval = ArgusTV::GetActiveRecordings(activeRecordingsResponse); if (retval < 0) { XBMC->Log(LOG_ERROR, "Unable to retrieve active recordings from server."); return PVR_ERROR_SERVER_ERROR; } // pick up the upcoming recordings retval = ArgusTV::GetUpcomingRecordings(upcomingProgramsResponse); if (retval < 0) { XBMC->Log(LOG_ERROR, "Unable to retrieve upcoming programs from server."); return PVR_ERROR_SERVER_ERROR; } // try to find the upcoming recording that matches this xbmc timer int numberoftimers = upcomingProgramsResponse.size(); for (int i = 0; i < numberoftimers; i++) { cUpcomingRecording upcomingrecording; if (upcomingrecording.Parse(upcomingProgramsResponse[i])) { if (upcomingrecording.ID() == (int) timerinfo.iClientIndex) { // Okay, we matched the timer to an upcoming program, but is it recording right now? if (activeRecordingsResponse.size() > 0) { // Is the this upcoming program in the list of active recordings? for (Json::Value::UInt j = 0; j < activeRecordingsResponse.size(); j++) { cActiveRecording activerecording; if (activerecording.Parse(activeRecordingsResponse[j])) { 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; } } } } 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; } } } return PVR_ERROR_SERVER_ERROR; } PVR_ERROR cPVRClientArgusTV::UpdateTimer(const PVR_TIMER &timerinfo) { NOTUSED(timerinfo); return PVR_ERROR_NOT_IMPLEMENTED; } /************************************************************/ /** Live stream handling */ cChannel* cPVRClientArgusTV::FetchChannel(int channelid, bool LogError) { CLockObject lock(m_ChannelCacheMutex); 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; for ( it=m_Channels.begin(); it < m_Channels.end(); it++ ) { if ((*it)->ID() == channelid) { return *it; } } if (LogError) XBMC->Log(LOG_ERROR, "XBMC channel with id %d not found in the channel cache!.", channelid); return NULL; } 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; for ( it=m_Channels.begin(); it < m_Channels.end(); it++ ) { SAFE_DELETE(*it); } } bool cPVRClientArgusTV::_OpenLiveStream(const PVR_CHANNEL &channelinfo) { XBMC->Log(LOG_DEBUG, "->_OpenLiveStream(%i)", channelinfo.iUniqueId); if (((int)channelinfo.iUniqueId) == m_iCurrentChannel) { XBMC->Log(LOG_NOTICE, "New channel uid equal to the already streaming channel. Skipping re-tune."); return true; } m_iCurrentChannel = -1; // make sure that it is not a valid channel nr in case it will fail lateron cChannel* channel = FetchChannel(channelinfo.iUniqueId); if (channel) { std::string filename; XBMC->Log(LOG_INFO, "Tune XBMC channel: %i", channelinfo.iUniqueId); XBMC->Log(LOG_INFO, "Corresponding ARGUS TV channel: %s", channel->Guid().c_str()); int retval = ArgusTV::TuneLiveStream(channel->Guid(), channel->Type(), channel->Name(), filename); if (retval == ArgusTV::NoReTunePossible) { // Ok, we can't re-tune with the current live stream still running // So stop it and re-try CloseLiveStream(); XBMC->Log(LOG_INFO, "Re-Tune XBMC channel: %i", channelinfo.iUniqueId); retval = ArgusTV::TuneLiveStream(channel->Guid(), channel->Type(), channel->Name(), filename); } if (retval != E_SUCCESS) { switch (retval) { case ArgusTV::NoFreeCardFound: XBMC->Log(LOG_INFO, "No free tuner found."); XBMC->QueueNotification(QUEUE_ERROR, "No free tuner found!"); return false; case ArgusTV::IsScrambled: XBMC->Log(LOG_INFO, "Scrambled channel."); XBMC->QueueNotification(QUEUE_ERROR, "Scrambled channel!"); return false; case ArgusTV::ChannelTuneFailed: XBMC->Log(LOG_INFO, "Tuning failed."); XBMC->QueueNotification(QUEUE_ERROR, "Tuning failed!"); return false; default: XBMC->Log(LOG_ERROR, "Tuning failed, unknown error"); XBMC->QueueNotification(QUEUE_ERROR, "Unknown error!"); return false; } } filename = ToCIFS(filename); InsertUser(filename); if (retval != E_SUCCESS || filename.length() == 0) { XBMC->Log(LOG_ERROR, "Could not start the timeshift for channel %i (%s)", channelinfo.iUniqueId, channel->Guid().c_str()); CloseLiveStream(); return false; } // reset the signal quality poll interval after tuning m_signalqualityInterval = 0; 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->CreateThread()) { XBMC->Log(LOG_ERROR, "Start keepalive thread failed."); } } #if defined(ATV_DUMPTS) if (ofd != -1) close(ofd); strncpy(ofn, "/tmp/atv.XXXXXX", sizeof(ofn)); if ((ofd = mkostemp(ofn, O_CREAT|O_TRUNC)) == -1) { XBMC->Log(LOG_ERROR, "couldn't open dumpfile %s (error %d: %s).", ofn, errno, strerror(errno)); } else { XBMC->Log(LOG_INFO, "opened dumpfile %s.", ofn); } #endif if (m_tsreader != NULL) { //XBMC->Log(LOG_DEBUG, "Re-using existing TsReader..."); //usleep(5000000); //m_tsreader->OnZap(); XBMC->Log(LOG_DEBUG, "Close existing and open new TsReader..."); m_tsreader->Close(); SAFE_DELETE(m_tsreader); } // Open Timeshift buffer // TODO: rtsp support m_tsreader = new CTsReader(); XBMC->Log(LOG_DEBUG, "Open TsReader"); m_tsreader->Open(filename.c_str()); m_tsreader->OnZap(); XBMC->Log(LOG_DEBUG, "Delaying %ld milliseconds.", (g_iTuneDelay)); usleep(1000 * g_iTuneDelay); return true; } else { XBMC->Log(LOG_ERROR, "Could not get ARGUS TV channel guid for channel %i.", channelinfo.iUniqueId); XBMC->QueueNotification(QUEUE_ERROR, "XBMC Channel to GUID"); } CloseLiveStream(); return false; } bool cPVRClientArgusTV::OpenLiveStream(const PVR_CHANNEL &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) { unsigned long read_wanted = iBufferSize; unsigned long read_done = 0; static int read_timeouts = 0; unsigned char* bufptr = pBuffer; // XBMC->Log(LOG_DEBUG, "->ReadLiveStream(buf_size=%i)", iBufferSize); if (!m_tsreader) return -1; while (read_done < (unsigned long) iBufferSize) { read_wanted = iBufferSize - read_done; long lRc = 0; if ((lRc = m_tsreader->Read(bufptr, read_wanted, &read_wanted)) > 0) { usleep(400000); read_timeouts++; XBMC->Log(LOG_NOTICE, "ReadLiveStream requested %d but only read %d bytes.", iBufferSize, read_wanted); return read_wanted; } read_done += read_wanted; if ( read_done < (unsigned long) iBufferSize ) { if (read_timeouts > 25) { XBMC->Log(LOG_INFO, "No data in 1 second"); read_timeouts = 0; return read_done; } bufptr += read_wanted; read_timeouts++; usleep(40000); } } #if defined(ATV_DUMPTS) if (write(ofd, pBuffer, read_done) < 0) { XBMC->Log(LOG_ERROR, "couldn't write %d bytes to dumpfile %s (error %d: %s).", read_done, ofn, errno, strerror(errno)); } #endif // XBMC->Log(LOG_DEBUG, "ReadLiveStream(buf_size=%i), %d timeouts", iBufferSize, read_timeouts); read_timeouts = 0; return read_done; } long long cPVRClientArgusTV::SeekLiveStream(long long pos, int whence) { static std::string zz[] = { "Begin", "Current", "End" }; XBMC->Log(LOG_DEBUG, "SeekLiveStream (%lld, %s).", pos, zz[whence].c_str()); if (!m_tsreader) { return -1; } return m_tsreader->SetFilePointer(pos, whence); } long long cPVRClientArgusTV::PositionLiveStream(void) { if (!m_tsreader) { return -1; } return m_tsreader->GetFilePointer(); } long long cPVRClientArgusTV::LengthLiveStream(void) { if (!m_tsreader) { return -1; } return m_tsreader->GetFileSize(); } void cPVRClientArgusTV::CloseLiveStream() { string result; XBMC->Log(LOG_INFO, "CloseLiveStream"); if (m_keepalive->IsRunning()) { if (!m_keepalive->StopThread()) { XBMC->Log(LOG_ERROR, "Stop keepalive thread failed."); } } #if defined(ATV_DUMPTS) if (ofd != -1) { if (close(ofd) == -1) { XBMC->Log(LOG_ERROR, "couldn't close dumpfile %s (error %d: %s).", ofn, errno, strerror(errno)); } ofd = -1; } #endif if (m_bTimeShiftStarted) { if (m_tsreader) { XBMC->Log(LOG_DEBUG, "Close TsReader"); m_tsreader->Close(); #if defined(TARGET_WINDOWS) XBMC->Log(LOG_DEBUG, "ReadLiveStream: %I64d calls took %I64d nanoseconds.", m_tsreader->sigmaCount(), m_tsreader->sigmaTime()); #endif SAFE_DELETE(m_tsreader); } ArgusTV::StopLiveStream(); m_bTimeShiftStarted = false; m_iCurrentChannel = -1; } else { XBMC->Log(LOG_DEBUG, "CloseLiveStream: Nothing to do."); } } PVR_ERROR cPVRClientArgusTV::SignalStatus(PVR_SIGNAL_STATUS &signalStatus) { static PVR_SIGNAL_STATUS tag; // Only do the REST call once out of N if (m_signalqualityInterval-- <= 0) { m_signalqualityInterval = SIGNALQUALITY_INTERVAL; Json::Value response; ArgusTV::SignalQuality(response); memset(&tag, 0, sizeof(tag)); std::string cardtype = ""; switch (response["CardType"].asInt()) { case 0x80: cardtype = "Analog"; break; case 8: cardtype = "ATSC"; break; case 4: cardtype = "DVB-C"; break; case 0x10: cardtype = "DVB-IP"; break; case 1: cardtype = "DVB-S"; break; case 2: cardtype = "DVB-T"; break; default: cardtype = "Unknown card type"; break; } snprintf(tag.strAdapterName, 1024, "Provider %s, %s", response["ProviderName"].asString().c_str(), cardtype.c_str()); snprintf(tag.strAdapterStatus, 1024, "%s, %s", response["Name"].asString().c_str(), response["IsFreeToAir"].asBool() ? "free to air" : "encrypted"); tag.iSNR = (int) (response["SignalQuality"].asInt() * 655.35); tag.iSignal = (int) (response["SignalStrength"].asInt() * 655.35); } signalStatus = tag; return PVR_ERROR_NO_ERROR; } bool cPVRClientArgusTV::FindRecEntryUNC(const std::string &recId, std::string &recEntryURL) { auto iter = m_RecordingsMap.find(recId); if (iter == m_RecordingsMap.end()) return false; recEntryURL = ToUNC(iter->second); if (recEntryURL == "") return false; return true; } bool cPVRClientArgusTV::FindRecEntry(const std::string &recId, std::string &recEntryURL) { auto iter = m_RecordingsMap.find(recId); if (iter == m_RecordingsMap.end()) return false; recEntryURL = iter->second; InsertUser(recEntryURL); return !recEntryURL.empty(); } /************************************************************/ /** Record stream handling */ bool cPVRClientArgusTV::OpenRecordedStream(const PVR_RECORDING &recinfo) { std::string UNCname; if (!FindRecEntry(recinfo.strRecordingId, UNCname)) return false; XBMC->Log(LOG_DEBUG, "->OpenRecordedStream(%s)", UNCname.c_str()); if (m_tsreader != NULL) { XBMC->Log(LOG_DEBUG, "Close existing TsReader..."); m_tsreader->Close(); SAFE_DELETE(m_tsreader); } m_tsreader = new CTsReader(); if (m_tsreader->Open(UNCname.c_str()) != S_OK) { SAFE_DELETE(m_tsreader); return false; } return true; } void cPVRClientArgusTV::CloseRecordedStream(void) { XBMC->Log(LOG_DEBUG, "->CloseRecordedStream()"); if (m_tsreader) { XBMC->Log(LOG_DEBUG, "Close TsReader"); m_tsreader->Close(); SAFE_DELETE(m_tsreader); } } int cPVRClientArgusTV::ReadRecordedStream(unsigned char* pBuffer, unsigned int iBuffersize) { unsigned long read_done = 0; // XBMC->Log(LOG_DEBUG, "->ReadRecordedStream(buf_size=%i)", iBufferSize); if (!m_tsreader) return -1; long lRc = 0; if ((lRc = m_tsreader->Read(pBuffer, iBuffersize, &read_done)) > 0) { XBMC->Log(LOG_NOTICE, "ReadRecordedStream requested %d but only read %d bytes.", iBuffersize, read_done); } return read_done; } long long cPVRClientArgusTV::SeekRecordedStream(long long iPosition, int iWhence) { if (!m_tsreader) { return -1; } if (iPosition == 0 && iWhence == SEEK_CUR) { return m_tsreader->GetFilePointer(); } return m_tsreader->SetFilePointer(iPosition, iWhence); } long long cPVRClientArgusTV::PositionRecordedStream(void) { if (!m_tsreader) { return -1; } return m_tsreader->GetFilePointer(); } long long cPVRClientArgusTV::LengthRecordedStream(void) { if (!m_tsreader) { return -1; } return m_tsreader->GetFileSize(); } /* * \brief Request the stream URL for live tv/live radio. */ const char* cPVRClientArgusTV::GetLiveStreamURL(const PVR_CHANNEL &channelinfo) { XBMC->Log(LOG_DEBUG, "->GetLiveStreamURL(%i)", channelinfo.iUniqueId); bool rc = _OpenLiveStream(channelinfo); if (rc) { m_bTimeShiftStarted = true; } // sigh, the only reason to use a class member here is to have storage for the const char * // pointing to the std::string when this method returns (and locals would go out of scope) m_PlaybackURL = ArgusTV::GetLiveStreamURL(); XBMC->Log(LOG_DEBUG, "<-GetLiveStreamURL returns URL(%s)", m_PlaybackURL.c_str()); return m_PlaybackURL.c_str(); } void cPVRClientArgusTV::PauseStream(bool bPaused) { NOTUSED(bPaused); //TODO: add m_tsreader->Pause() her when adding RTSP streaming support } bool cPVRClientArgusTV::CanPauseAndSeek() { bool rc = (m_tsreader != NULL); XBMC->Log(LOG_DEBUG, "<-CanPauseAndSeek returns %s", rc ? "true" : "false"); return rc; } pvr.argustv-3.5.4-Leia/src/pvrclient-argustv.h000066400000000000000000000120031337562352100213360ustar00rootroot00000000000000#pragma once /* * Copyright (C) 2010-2012 Marcel Groothuis, 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 this program. If not, see . * */ #include "p8-platform/os.h" #include /* Master defines for client control */ #include "xbmc_pvr_types.h" #include "channel.h" #include "recording.h" #include "guideprogram.h" #include "KeepAliveThread.h" #include "EventsThread.h" namespace ArgusTV { class CTsReader; } #undef ATV_DUMPTS class cPVRClientArgusTV { public: /* Class interface */ cPVRClientArgusTV(); ~cPVRClientArgusTV(); /* Server handling */ bool Connect(); void Disconnect(); bool IsUp(); bool ShareErrorsFound(void); /* General handling */ const char* GetBackendName(void); const char* GetBackendVersion(void); const char* GetConnectionString(void); PVR_ERROR GetDriveSpace(long long *iTotal, long long *iUsed); PVR_ERROR GetBackendTime(time_t *localTime, int *gmtOffset); /* EPG handling */ PVR_ERROR GetEpg(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t iStart, time_t iEnd); /* Channel handling */ int GetNumChannels(void); PVR_ERROR GetChannels(ADDON_HANDLE handle, bool bRadio); /* Channel group handling */ int GetChannelGroupsAmount(void); PVR_ERROR GetChannelGroups(ADDON_HANDLE handle, bool bRadio); PVR_ERROR GetChannelGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group); /* Record handling **/ int GetNumRecordings(void); PVR_ERROR GetRecordings(ADDON_HANDLE handle); PVR_ERROR DeleteRecording(const PVR_RECORDING &recinfo); PVR_ERROR RenameRecording(const PVR_RECORDING &recinfo); PVR_ERROR SetRecordingLastPlayedPosition(const PVR_RECORDING &recinfo, int lastplayedposition); int GetRecordingLastPlayedPosition(const PVR_RECORDING &recinfo); PVR_ERROR SetRecordingPlayCount(const PVR_RECORDING &recinfo, int playcount); /* Timer handling */ int GetNumTimers(void); PVR_ERROR GetTimers(ADDON_HANDLE handle); PVR_ERROR AddTimer(const PVR_TIMER &timer); PVR_ERROR DeleteTimer(const PVR_TIMER &timer, bool bForceDelete = false); PVR_ERROR UpdateTimer(const PVR_TIMER &timer); /* Live stream handling */ bool OpenLiveStream(const PVR_CHANNEL &channel); void CloseLiveStream(); int ReadLiveStream(unsigned char *pBuffer, unsigned int iBufferSize); long long SeekLiveStream(long long pos, int whence); long long PositionLiveStream(void); long long LengthLiveStream(void); bool SwitchChannel(const PVR_CHANNEL &channel); PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS &signalStatus); bool CanPauseAndSeek(void); void PauseStream(bool bPaused); /* Record stream handling */ bool OpenRecordedStream(const PVR_RECORDING &recording); void CloseRecordedStream(void); int ReadRecordedStream(unsigned char *pBuffer, unsigned int iBufferSize); long long SeekRecordedStream(long long iPosition, int iWhence = SEEK_SET); long long LengthRecordedStream(void); long long PositionRecordedStream(void); /* Used for rtsp streaming */ const char* GetLiveStreamURL(const PVR_CHANNEL &channel); private: 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 _OpenLiveStream(const PVR_CHANNEL &channel); bool FindRecEntryUNC(const std::string &recId, std::string &recEntryURL); bool FindRecEntry(const std::string &recId, std::string &recEntryURL); int m_iCurrentChannel; bool m_bConnected; bool m_bTimeShiftStarted; std::string m_PlaybackURL; std::string m_BackendName; int m_iBackendVersion; std::string m_sBackendVersion; time_t m_BackendUTCoffset; time_t m_BackendTime; P8PLATFORM::CMutex m_ChannelCacheMutex; 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 std::map m_RecordingsMap; // int m_epg_id_offset; int m_signalqualityInterval; ArgusTV::CTsReader* m_tsreader; CKeepAliveThread* m_keepalive; CEventsThread* m_eventmonitor; #if defined(ATV_DUMPTS) char ofn[25]; int ofd; #endif }; pvr.argustv-3.5.4-Leia/src/recording.cpp000066400000000000000000000112071337562352100201530ustar00rootroot00000000000000/* * Copyright (C) 2011 Marcel Groothuis, Fho * * 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 "recording.h" #include "client.h" cRecording::cRecording(void) { actors = ""; category = ""; channeldisplayname = ""; channelid = ""; channeltype = ArgusTV::Television; description = ""; director = ""; episodenumber = 0; episodenumberdisplay = ""; episodenumbertotal = 0; episodepart = 0; episodeparttotal = 0; isfullywatched = false; ispartofseries = false; ispartialrecording = false; ispremiere = false; isrepeat = false; keepuntilmode = ArgusTV::UntilSpaceIsNeeded; keepuntilvalue = 0; lastwatchedposition = 0; fullywatchedcount = 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; subtitle = ""; title = ""; id = 0; } cRecording::~cRecording(void) { } bool cRecording::Parse(const Json::Value& data) { int offset; std::string t; id = data["Id"].asInt(); actors = data["Actors"].asString(); category = data["Category"].asString(); channeldisplayname = data["ChannelDisplayName"].asString(); channelid = data["ChannelId"].asString(); channeltype = (ArgusTV::ChannelType) data["ChannelType"].asInt(); description = data["Description"].asString(); director = data["Director"].asString(); episodenumber = data["EpisodeNumber"].asInt(); episodenumberdisplay = data["EpisodeNumberDisplay"].asString(); episodenumbertotal = data["EpisodeNumberTotal"].asInt(); episodepart = data["EpisodePart"].asInt(); episodeparttotal = data["EpisodePartTotal"].asInt(); isfullywatched = data["IsFullyWatched"].asBool(); 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(); fullywatchedcount = data ["FullyWatchedCount"].asInt(); t = data["LastWatchedTime"].asString(); lastwatchedtime = ArgusTV::WCFDateToTimeT(t, offset); t = data["ProgramStartTime"].asString(); programstarttime = ArgusTV::WCFDateToTimeT(t, offset); t = data["ProgramStopTime"].asString(); programstoptime = ArgusTV::WCFDateToTimeT(t, offset); rating = data["Rating"].asString(); recordingfileformatid = data["RecordingFileFormatId"].asString(); t = data["RecordingFileName"].asString(); recordingfilename = ToCIFS(t); recordingid = data["RecordingId"].asString(); t = data["RecordingStartTime"].asString(); recordingstarttime = ArgusTV::WCFDateToTimeT(t, offset); t = data["RecordingStopTime"].asString(); recordingstoptime = ArgusTV::WCFDateToTimeT(t, offset); scheduleid = data["ScheduleId"].asString(); schedulename = data["ScheduleName"].asString(); schedulepriority = (ArgusTV::SchedulePriority) data["SchedulePriority"].asInt(); seriesnumber = data["SeriesNumber"].asInt(); starrating = data["StarRating"].asDouble(); subtitle = data["SubTitle"].asString(); title = data["Title"].asString(); return true; } // Ok, this recording is part of a group of recordings, we do some // title etc. juggling to make the listing more attractive void cRecording::Transform(bool isgroupmember) { std::string _title = title; std::string _subtitle = subtitle; if (isgroupmember) { if (subtitle.size() > 0) { title = _title + " - " + _subtitle; subtitle = channeldisplayname; } else { title = _title + " - " + channeldisplayname; } } else { if (subtitle.size() == 0) { subtitle = channeldisplayname; } } } pvr.argustv-3.5.4-Leia/src/recording.h000066400000000000000000000107441337562352100176250ustar00rootroot00000000000000#pragma once /* * Copyright (C) 2011 Marcel Groothuis, FHo * * 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" class cRecording { private: int id; std::string actors; std::string category; std::string channeldisplayname; std::string channelid; ArgusTV::ChannelType channeltype; std::string description; std::string director; int episodenumber; std::string episodenumberdisplay; int episodenumbertotal; int episodepart; int episodeparttotal; bool isfullywatched; bool ispartofseries; bool ispartialrecording; bool ispremiere; bool isrepeat; ArgusTV::KeepUntilMode keepuntilmode; int keepuntilvalue; int lastwatchedposition; int fullywatchedcount; 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; std::string subtitle; std::string title; public: cRecording(void); virtual ~cRecording(void); 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(); } const char *ChannelId(void) const { return channelid.c_str(); } ArgusTV::ChannelType ChannelType(void) const { return channeltype; }; const char *Description(void) const { return description.c_str(); } const char *Director(void) const { return director.c_str(); } 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 IsFullyWatched(void) const { return isfullywatched; } 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; } int FullyWatchedCount(void) const { return fullywatchedcount; } 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 char *RecordingId(void) const { return recordingid.c_str(); } 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; } const char *SubTitle(void) const { return subtitle.c_str(); } const char *Title(void) const { return title.c_str(); } }; pvr.argustv-3.5.4-Leia/src/recordinggroup.cpp000066400000000000000000000043151337562352100212320ustar00rootroot00000000000000/* * 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 "recordinggroup.h" cRecordingGroup::cRecordingGroup(void) { category = ""; channeldisplayname = ""; channelid = ""; channeltype = ArgusTV::Television; isrecording = false; latestprogramstarttime = 0; programtitle = ""; recordinggroupmode = ArgusTV::GroupByProgramTitle; recordingscount = 0; scheduleid = ""; schedulename = ""; schedulepriority = ArgusTV::Normal; } cRecordingGroup::~cRecordingGroup(void) { } bool cRecordingGroup::Parse(const Json::Value& data) { //Json::printValueTree(data); category = data["Category"].asString(); channeldisplayname = data["ChannelDisplayName"].asString(); channelid = data["ChannelId"].asString(); channeltype = (ArgusTV::ChannelType) data["ChannelType"].asInt(); isrecording = data["IsRecording"].asBool(); int offset; std::string lpst = data["LatestProgramStartTime"].asString(); latestprogramstarttime = ArgusTV::WCFDateToTimeT(lpst, offset); latestprogramstarttime += ((offset/100)*3600); programtitle = data["ProgramTitle"].asString(); recordinggroupmode = (ArgusTV::RecordingGroupMode) data["RecordingGroupMode"].asInt(); recordingscount = data["RecordingsCount"].asInt(); scheduleid = data["ScheduleId"].asString(); schedulename = data["ScheduleName"].asString(); schedulepriority = (ArgusTV::SchedulePriority) data["SchedulePriority"].asInt(); return true; } pvr.argustv-3.5.4-Leia/src/recordinggroup.h000066400000000000000000000043611337562352100207000ustar00rootroot00000000000000#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" class cRecordingGroup { private: std::string category; std::string channeldisplayname; std::string channelid; ArgusTV::ChannelType channeltype; bool isrecording; time_t latestprogramstarttime; std::string programtitle; ArgusTV::RecordingGroupMode recordinggroupmode; int recordingscount; std::string scheduleid; std::string schedulename; ArgusTV::SchedulePriority schedulepriority; public: cRecordingGroup(void); virtual ~cRecordingGroup(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; } bool IsRecording(void) const { return isrecording; } time_t LatestProgramStartTime(void) const { return latestprogramstarttime; } const std::string& ProgramTitle(void) const { return programtitle; } ArgusTV::RecordingGroupMode RecordingGroupMode(void) const { return recordinggroupmode; } int RecordingsCount(void) const { return recordingscount; } 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; } }; pvr.argustv-3.5.4-Leia/src/tools.cpp000066400000000000000000000056021337562352100173410ustar00rootroot00000000000000/* * Copyright (C) 2005-2009 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 * */ /* * Most of this code is taken from tools.c in the Video Disk Recorder ('VDR') */ #include "tools.h" #include "p8-platform/util/timeutils.h" using namespace ADDON; using namespace P8PLATFORM; // --- cTimeMs --------------------------------------------------------------- cTimeMs::cTimeMs(int Ms) { Set(Ms); } uint64_t cTimeMs::Now(void) { #if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK) #define MIN_RESOLUTION 5 // ms static bool initialized = false; static bool monotonic = false; struct timespec tp; if (!initialized) { // check if monotonic timer is available and provides enough accurate resolution: if (clock_getres(CLOCK_MONOTONIC, &tp) == 0) { long Resolution = tp.tv_nsec; // require a minimum resolution: if (tp.tv_sec == 0 && tp.tv_nsec <= MIN_RESOLUTION * 1000000) { if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0) { XBMC->Log(LOG_DEBUG, "cTimeMs: using monotonic clock (resolution is %ld ns)", Resolution); monotonic = true; } else XBMC->Log(LOG_ERROR, "cTimeMs: clock_gettime(CLOCK_MONOTONIC) failed"); } else XBMC->Log(LOG_DEBUG, "cTimeMs: not using monotonic clock - resolution is too bad (%ld s %ld ns)", tp.tv_sec, tp.tv_nsec); } else XBMC->Log(LOG_ERROR, "cTimeMs: clock_getres(CLOCK_MONOTONIC) failed"); initialized = true; } if (monotonic) { if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0) return (uint64_t(tp.tv_sec)) * 1000 + tp.tv_nsec / 1000000; XBMC->Log(LOG_ERROR, "cTimeMs: clock_gettime(CLOCK_MONOTONIC) failed"); monotonic = false; // fall back to gettimeofday() } #else #if !defined(__WINDOWS__) # warning Posix monotonic clock not available #endif #endif struct timeval t; if (gettimeofday(&t, NULL) == 0) return (uint64_t(t.tv_sec)) * 1000 + t.tv_usec / 1000; return 0; } void cTimeMs::Set(int Ms) { begin = Now() + Ms; } bool cTimeMs::TimedOut(void) { return Now() >= begin; } uint64_t cTimeMs::Elapsed(void) { return Now() - begin; } pvr.argustv-3.5.4-Leia/src/tools.h000066400000000000000000000032621337562352100170060ustar00rootroot00000000000000/* * Copyright (C) 2005-2009 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 * */ #ifndef __TOOLS_H #define __TOOLS_H #include "client.h" #include #include #include #include #include #include #define ERRNUL(e) {errno=e;return 0;} #define ERRSYS(e) {errno=e;return -1;} #define SECSINDAY 86400 #define KILOBYTE(n) ((n) * 1024) #define MEGABYTE(n) ((n) * 1024LL * 1024LL) #define MALLOC(type, size) (type *)malloc(sizeof(type) * (size)) #define DELETENULL(p) (delete (p), p = NULL) // //#define CHECK(s) { if ((s) < 0) LOG_ERROR; } // used for 'ioctl()' calls #define FATALERRNO (errno && errno != EAGAIN && errno != EINTR) class cTimeMs { private: uint64_t begin; public: cTimeMs(int Ms = 0); ///< Creates a timer with ms resolution and an initial timeout of Ms. static uint64_t Now(void); void Set(int Ms = 0); bool TimedOut(void); uint64_t Elapsed(void); }; #endif //__TOOLS_H pvr.argustv-3.5.4-Leia/src/upcomingrecording.cpp000066400000000000000000000047231337562352100217220ustar00rootroot00000000000000/* * 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 "argustvrpc.h" #include "upcomingrecording.h" cUpcomingRecording::cUpcomingRecording(void) : date(0), starttime(0), stoptime(0), prerecordseconds(0), postrecordseconds(0), iscancelled(false), isallocated(true), isinconflict(true), id(0), ichannelid(0) { channeldisplayname = ""; channelid = ""; title = ""; } cUpcomingRecording::~cUpcomingRecording(void) { } bool cUpcomingRecording::Parse(const Json::Value& data) { int offset; std::string t; Json::Value channelobject,programobject; programobject = data["Program"]; date = 0; id = programobject["Id"].asInt(); t = programobject["StartTime"].asString(); starttime = ArgusTV::WCFDateToTimeT(t, offset); t = programobject["StopTime"].asString(); stoptime = ArgusTV::WCFDateToTimeT(t, offset); prerecordseconds = programobject["PreRecordSeconds"].asInt(); postrecordseconds = programobject["PostRecordSeconds"].asInt(); title = programobject["Title"].asString(); iscancelled = programobject["IsCancelled"].asBool(); upcomingprogramid = programobject["UpcomingProgramId"].asString(); guideprogramid = programobject["GuideProgramId"].asString(); scheduleid = programobject["ScheduleId"].asString(); // From the Program class pickup the C# Channel class channelobject = programobject["Channel"]; channelid = channelobject["ChannelId"].asString(); channeldisplayname = channelobject["DisplayName"].asString(); ichannelid = channelobject["Id"].asInt(); if (data["CardChannelAllocation"].empty()) isallocated = false; if (data["ConflictingPrograms"].empty()) isinconflict = false; return true; }pvr.argustv-3.5.4-Leia/src/upcomingrecording.h000066400000000000000000000044051337562352100213640ustar00rootroot00000000000000#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 class cUpcomingRecording { private: std::string channeldisplayname; std::string channelid; time_t date; time_t starttime; time_t stoptime; int prerecordseconds; int postrecordseconds; std::string title; bool iscancelled; std::string upcomingprogramid; std::string guideprogramid; std::string scheduleid; bool isallocated; bool isinconflict; int id; int ichannelid; public: cUpcomingRecording(void); virtual ~cUpcomingRecording(void); 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; } int PreRecordSeconds(void) const { return prerecordseconds; } int PostRecordSeconds(void) const { return postrecordseconds; } const std::string& Title(void) const { return title; } bool IsCancelled(void) const { return iscancelled; } const std::string& UpcomingProgramId(void) const { return upcomingprogramid; } const std::string& GuideProgramId(void) const { return guideprogramid; } const std::string& ScheduleId(void) const { return scheduleid; } bool IsAllocated(void) const { return isallocated; } bool IsInConflict(void) const { return isinconflict; } }; pvr.argustv-3.5.4-Leia/src/uri.cpp000066400000000000000000000245631337562352100170070ustar00rootroot00000000000000/* * 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 "uri.h" namespace uri { const char ENCODE_BEGIN_CHAR = '%'; const traits SCHEME_TRAITS = { 0, 0, ':', { CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CVA2,CINV,CVA2,CVA2,CINV, CVA2,CVA2,CVA2,CVA2,CVA2,CVA2,CVA2,CVA2, CVA2,CVA2,CEND,CINV,CINV,CINV,CINV,CINV, CINV,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CINV,CINV,CINV,CINV,CINV, CINV,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CINV,CINV,CINV,CINV,CINV, // 127 7F CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, } }; const traits AUTHORITY_TRAITS = { (char *) "//", 0, 0, { CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CEND,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, // 127 7F CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, } }; const traits PATH_TRAITS = { 0, 0, 0, { // '/' is invalid CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CVAL,CINV,CINV,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CINV, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CINV,CVAL,CINV,CINV, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CINV,CINV,CINV,CINV,CVAL, CINV,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CINV,CINV,CINV,CVAL,CINV, // 127 7F CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, } }; const traits QUERY_TRAITS = { 0, '?', 0, { // '=' and '&' are invalid CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CVAL,CINV,CINV,CVAL,CVAL,CINV,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CINV,CINV,CINV,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CINV,CINV,CINV,CINV,CVAL, CINV,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CINV,CINV,CINV,CVAL,CINV, // 127 7F CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, } }; const traits FRAGMENT_TRAITS = { 0, '#', 0, { CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CVAL,CINV,CINV,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CINV,CVAL,CINV,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CINV,CINV,CINV,CINV,CVAL, CINV,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL,CVAL, CVAL,CVAL,CVAL,CINV,CINV,CINV,CVAL,CINV, // 127 7F CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, CINV,CINV,CINV,CINV,CINV,CINV,CINV,CINV, } }; bool parse_hex(const std::string& s, size_t pos, char& chr) { if (s.size() < pos + 2) return false; unsigned int v; unsigned int c = (unsigned int) s[pos]; if ('0' <= c && c <= '9') v = (c - '0') << 4; else if ('A' <= c && c <= 'F') v = (10 + (c - 'A')) << 4; else if ('a' <= c && c <= 'f') v = (10 + (c - 'a')) << 4; else return false; c = (unsigned int) s[pos + 1]; if ('0' <= c && c <= '9') v += c - '0'; else if ('A' <= c && c <= 'F') v += 10 + (c - 'A'); else if ('a' <= c && c <= 'f') v += 10 + (c - 'a'); else return false; chr = (char) v; // Set output. return true; } void append_hex(char v, std::string& s) { unsigned int c = (unsigned char) v & 0xF0; c >>= 4; s.insert(s.end(), (char)((9 < c) ? (c - 10) + 'A' : c + '0')); c = v & 0x0F; s.insert(s.end(), (char)((9 < c) ? (c - 10) + 'A' : c + '0')); } std::string encode(const traits& ts, const std::string& comp) { std::string::const_iterator f = comp.begin(); std::string::const_iterator anchor = f; std::string s; for (; f != comp.end();) { char c = *f; if (ts.char_class[(unsigned char)c] < CVAL || c == ENCODE_BEGIN_CHAR) { // Must encode. s.append(anchor, f); // Catch up to this char. s.append(1, ENCODE_BEGIN_CHAR); append_hex(c, s); // Convert. anchor = ++f; } else { ++f; } } return (anchor == comp.begin()) ? comp : s.append(anchor, comp.end()); } bool decode(std::string& s) { size_t pos = s.find(ENCODE_BEGIN_CHAR); if (pos == std::string::npos) { // Handle the "99%" case fast. return true; } std::string v; for (size_t i = 0;;) { if (pos == std::string::npos) { v.append(s, i, s.size() - i); // Append up to end. break; } v.append(s, i, pos - i); // Append up to char. i = pos + 3; // Skip all 3 chars. char c; if (!parse_hex(s, pos + 1, c)) { // Convert hex. return false; } v.insert(v.end(), c); // Append converted hex. pos = s.find(ENCODE_BEGIN_CHAR, i); // Find next } s = v; return true; } } //namespace URI pvr.argustv-3.5.4-Leia/src/uri.h000066400000000000000000000051331337562352100164440ustar00rootroot00000000000000#pragma once /* * 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 namespace uri { /// Char class. typedef enum char_class_e : signed char { CINV = -2, ///< invalid CEND = -1, ///< end delimitor CVAL = 0, ///< valid any position CVA2 = 1, ///< valid anywhere but 1st position } char_class_e_type; /// Traits used for parsing and encoding components. struct traits { char* begin_cstring; ///< begin cstring (or 0 if none) char begin_char; ///< begin char (or 0 if none) char end_char; ///< end char (or 0 if none) char_class_e_type char_class[256]; ///< map of char to class }; /** * \brief Encode the URI (sub) component. * Note that this should be used on the subcomponents before appending to * subdelimiter chars, if any. * * From the RFC: URI producing applications should percent-encode data octets * are specifically allowed by the URI scheme to represent data in that * component. If a reserved character is found in a URI component and * no delimiting role is known for that character, then it must be * interpreted as representing the data octet corresponding to that * character's encoding in US-ASCII. * @see http://tools.ietf.org/html/rfc3986 * @see decode std::string encode(const traits& ts, const std::string& comp); * Decode the pct-encoded (hex) sequences, if any, return success. * Does not change string on error. * @see http://tools.ietf.org/html/rfc3986#section-2.1 * @see encode * \param s A reference to the std::string to decode */ bool decode(std::string& s); extern const char ENCODE_BEGIN_CHAR; ///< encode begin char ('\%') extern const traits SCHEME_TRAITS; ///< scheme traits extern const traits AUTHORITY_TRAITS; ///< authority traits extern const traits PATH_TRAITS; ///< path traits extern const traits QUERY_TRAITS; ///< query traits extern const traits FRAGMENT_TRAITS; ///< fragment traits } pvr.argustv-3.5.4-Leia/src/utils.cpp000066400000000000000000000121251337562352100173370ustar00rootroot00000000000000/* * Copyright (C) 2010 Marcel Groothuis * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #if defined(TARGET_WINDOWS) #pragma warning(disable:4244) //wchar to char = loss of data #endif #include "utils.h" #include "p8-platform/os.h" #include "client.h" //For XBMC->Log #include #include // sort using namespace ADDON; namespace Json { void printValueTree( const Json::Value& value, const std::string& path) { switch ( value.type() ) { case Json::nullValue: XBMC->Log(LOG_DEBUG, "%s=null\n", path.c_str() ); break; case Json::intValue: XBMC->Log(LOG_DEBUG, "%s=%d\n", path.c_str(), value.asInt() ); break; case Json::uintValue: XBMC->Log(LOG_DEBUG, "%s=%u\n", path.c_str(), value.asUInt() ); break; case Json::realValue: XBMC->Log(LOG_DEBUG, "%s=%.16g\n", path.c_str(), value.asDouble() ); break; case Json::stringValue: XBMC->Log(LOG_DEBUG, "%s=\"%s\"\n", path.c_str(), value.asString().c_str() ); break; case Json::booleanValue: XBMC->Log(LOG_DEBUG, "%s=%s\n", path.c_str(), value.asBool() ? "true" : "false" ); break; case Json::arrayValue: { XBMC->Log(LOG_DEBUG, "%s=[]\n", path.c_str() ); int size = value.size(); for ( int index =0; index < size; ++index ) { static char buffer[16]; snprintf( buffer, 16, "[%d]", index ); printValueTree( value[index], path + buffer ); } } break; case Json::objectValue: { XBMC->Log(LOG_DEBUG, "%s={}\n", path.c_str() ); Json::Value::Members members( value.getMemberNames() ); std::sort( members.begin(), members.end() ); std::string suffix = *(path.end()-1) == '.' ? "" : "."; for ( Json::Value::Members::iterator it = members.begin(); it != members.end(); ++it ) { const std::string &name = *it; printValueTree( value[name], path + suffix + name ); } } break; default: break; } } } //namespace Json namespace BASE64 { static const char *to_base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\ abcdefghijklmnopqrstuvwxyz\ 0123456789+/"; std::string b64_encode(unsigned char const* in, unsigned int in_len, bool urlEncode) { std::string ret; int i(3); unsigned char c_3[3]; unsigned char c_4[4]; while (in_len) { i = in_len > 2 ? 3 : in_len; in_len -= i; c_3[0] = *(in++); c_3[1] = i > 1 ? *(in++) : 0; c_3[2] = i > 2 ? *(in++) : 0; c_4[0] = (c_3[0] & 0xfc) >> 2; c_4[1] = ((c_3[0] & 0x03) << 4) + ((c_3[1] & 0xf0) >> 4); c_4[2] = ((c_3[1] & 0x0f) << 2) + ((c_3[2] & 0xc0) >> 6); c_4[3] = c_3[2] & 0x3f; for (int j = 0; (j < i + 1); ++j) { if (urlEncode && to_base64[c_4[j]] == '+') ret += "%2B"; else if (urlEncode && to_base64[c_4[j]] == '/') ret += "%2F"; else ret += to_base64[c_4[j]]; } } while ((i++ < 3)) ret += urlEncode ? "%3D" : "="; return ret; } } //Namespace BASE64 // 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; } bool InsertUser(std::string& UNCName) { if (g_szUser.empty()) return false; if (UNCName.find("smb://") == 0) { std::string SMBPrefix = "smb://" + g_szUser; if (!g_szPass.empty()) SMBPrefix.append(":" + g_szPass); SMBPrefix.append("@"); UNCName.replace(0, std::string("smb://").length(), SMBPrefix); XBMC->Log(LOG_DEBUG, "Account Info added to SMB url"); return true; } return false; } // 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); } ////////////////////////////////////////////////////////////////////////////// pvr.argustv-3.5.4-Leia/src/utils.h000066400000000000000000000030311337562352100170000ustar00rootroot00000000000000#pragma once /* * Copyright (C) 2005-2010 Team XBMC * http://www.xbmc.org * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include // don't use the UNUSED macro from StdString.h as it will generate "error: statement has no effect [-Werror=unused-value]" #define NOTUSED(x) ((void) x) namespace Json { /** * \brief Json support function to print the response from AGUS TV. * Can be used for debugging purposes. * \param value Reference to the Json::Value that you want to print * \param path Optional path */ void printValueTree( const Json::Value& value, const std::string& path = "." ); } namespace BASE64 { std::string b64_encode(unsigned char const* in, unsigned int in_len, bool urlEncode); } std::string ToCIFS(std::string& UNCName); std::string ToUNC(std::string& CIFSName); std::string ToUNC(const char* CIFSName); bool InsertUser(std::string& UNCName);